Big update: Adding all advent of codes to same repo
This commit is contained in:
119
AdventOfCode2021/day5/day5.go
Normal file
119
AdventOfCode2021/day5/day5.go
Normal file
@@ -0,0 +1,119 @@
|
||||
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
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user