119 lines
2.4 KiB
Go

package day5
import (
"math"
"strconv"
"strings"
)
type Coord struct {
x int
y int
}
type coordPairs struct {
point1 Coord
point2 Coord
}
func Run(dat []byte) (int, int) {
stringDat := strings.Split(string(dat), "\n")
coordList := make([]coordPairs, len(stringDat))
for i := 0; i < len(stringDat); i++ {
coords := strings.Split(stringDat[i], " -> ")
firstCoord := strings.Split(coords[0], ",")
secondCoord := strings.Split(coords[1], ",")
x1, _ := strconv.Atoi(firstCoord[0])
y1, _ := strconv.Atoi(firstCoord[1])
x2, _ := strconv.Atoi(secondCoord[0])
y2, _ := strconv.Atoi(secondCoord[1])
coordList[i] = coordPairs{Coord{x: x1, y: y1}, Coord{x: x2, y: y2}}
}
coordMap := make(map[Coord]int)
part2CoordMap := make(map[Coord]int)
for _, c := range coordList {
if (c.point1.x == c.point2.x) {
lowY := int(math.Min(float64(c.point1.y), float64(c.point2.y)))
highY := int(math.Max(float64(c.point1.y), float64(c.point2.y)))
for i := lowY; i <= highY; i++ {
coordMap[Coord{x: c.point1.x, y: i}] = coordMap[Coord{x: c.point1.x, y: i}] + 1
part2CoordMap[Coord{x: c.point1.x, y: i}] = part2CoordMap[Coord{x: c.point1.x, y: i}] + 1
}
} else if (c.point1.y == c.point2.y) {
lowX := int(math.Min(float64(c.point1.x), float64(c.point2.x)))
highX := int(math.Max(float64(c.point1.x), float64(c.point2.x)))
for i := lowX; i <= highX; i++ {
coordMap[Coord{x: i, y: c.point1.y}] = coordMap[Coord{x: i, y: c.point1.y}] + 1
part2CoordMap[Coord{x: i, y: c.point1.y}] = part2CoordMap[Coord{x: i, y: c.point1.y}] + 1
}
} else {
if c.point1.x < c.point2.x {
step := 0
if c.point1.y - c.point2.y > 0 {
step = -1
} else {
step = 1
}
counter := c.point1.y
for i := c.point1.x; i <= c.point2.x; i++ {
part2CoordMap[Coord{x: i, y: counter}] = part2CoordMap[Coord{x: i, y: counter}] + 1
counter += step
}
} else {
step := 0
if c.point2.y - c.point1.y > 0 {
step = -1
} else {
step = 1
}
counter := c.point2.y
for i := c.point2.x; i <= c.point1.x; i++ {
part2CoordMap[Coord{x: i, y: counter}] = part2CoordMap[Coord{x: i, y: counter}] + 1
counter += step
}
}
}
}
part1 := 0
part2 := 0
for _, value := range coordMap {
if value > 1 {
part1++
}
}
for _, value := range part2CoordMap {
if value > 1 {
part2++
}
}
return part1, part2
}