4 "adventofcode2023/utils"
5 _ "adventofcode2023/utils"
6 _ "adventofcode2023/utils/grid2d"
7 "adventofcode2023/utils/inputs"
22 func Part1(input string) int {
23 grid := inputs.ToGrid2D(input, "\n", "", ".", func(c string) string { return c})
25 for j := 0; j < grid.SizeY(); j++ {
26 for i := 0; i < grid.SizeX(); i++ {
27 if !unicode.IsDigit(rune(grid.Get(i, j)[0])) { continue}
28 directions := [][]int{{0, 1}, {0, -1}, {1, 0}, {-1, 0},{-1,1},{1,1},{-1,-1},{1,-1}}
29 for _, dir := range directions {
32 if x < 0 || x >= grid.SizeX() || y < 0 || y >= grid.SizeY() {
35 if !unicode.IsDigit(rune(grid.Get(x, y)[0])) && grid.Get(x, y) != "." {
36 fmt.Printf("partLoc x:%v y:%v %v\n", i, j, string(grid.Get(i, j)))
37 partLocs = append(partLocs, Coord{i, j})
45 for _, partLoc := range partLocs {
46 if grid.Get(partLoc.x, partLoc.y) == "." {
49 partNum := grid.Get(partLoc.x, partLoc.y)
50 for i:=1;unicode.IsDigit(rune(grid.Get(partLoc.x+i, partLoc.y)[0]));i++{
51 partNum += grid.Get(partLoc.x+i, partLoc.y)
52 grid.Set(partLoc.x+i, partLoc.y, ".")
54 for i:=-1;unicode.IsDigit(rune(grid.Get(partLoc.x+i, partLoc.y)[0]));i--{
55 partNum = grid.Get(partLoc.x+i, partLoc.y) + partNum
56 grid.Set(partLoc.x+i, partLoc.y, ".")
59 sum += utils.MustAtoi(partNum)
64 func Part2(input string) int {
65 grid := inputs.ToGrid2D(input, "\n", "", ".", func(c string) string { return c})
68 for j := 0; j < grid.SizeY(); j++ {
69 for i := 0; i < grid.SizeX(); i++ {
70 if grid.Get(i, j) == "*" {
71 gearLocs = append(gearLocs, Coord{i, j})
73 if !unicode.IsDigit(rune(grid.Get(i, j)[0])) { continue}
74 directions := [][]int{{0, 1}, {0, -1}, {1, 0}, {-1, 0},{-1,1},{1,1},{-1,-1},{1,-1}}
75 for _, dir := range directions {
78 if x < 0 || x >= grid.SizeX() || y < 0 || y >= grid.SizeY() {
81 if !unicode.IsDigit(rune(grid.Get(x, y)[0])) && grid.Get(x, y) != "." {
82 partLocs = append(partLocs, Coord{i, j})
92 for _, partLoc := range partLocs {
94 if grid.Get(partLoc.x, partLoc.y) == "." {
97 partNum := grid.Get(partLoc.x, partLoc.y)
98 for i:=1;unicode.IsDigit(rune(grid.Get(partLoc.x+i, partLoc.y)[0]));i++{
99 partNum += grid.Get(partLoc.x+i, partLoc.y)
100 grid.Set(partLoc.x+i, partLoc.y, ".")
103 for i:=-1;unicode.IsDigit(rune(grid.Get(partLoc.x+i, partLoc.y)[0]));i--{
104 partNum = grid.Get(partLoc.x+i, partLoc.y) + partNum
105 grid.Set(partLoc.x+i, partLoc.y, ".")
109 parts = append(parts, Part{number: partNum, location: Coord{x: l, y: partLoc.y}})
112 for _, gearLoc := range gearLocs {
113 var gearedParts [2]Part
115 directions := []Coord{{0,1},{0,-1},{1,0},{-1,0},{-1,1},{1,1},{-1,-1},{1,-1}}
116 for _, dir := range directions {
117 part, err := getPart(gearLoc, dir, parts)
118 if err != nil {continue}
119 if gearedParts[0] == (Part{}) {
120 gearedParts[0] = part
121 } else if gearedParts[0] == part {
122 fmt.Println("duplicate part found")
124 gearedParts[1] = part
127 fmt.Println(gearedParts)
128 if gearedParts[0] != (Part{}) && gearedParts[1] != (Part{}) {
129 sum += utils.MustAtoi(gearedParts[0].number) * utils.MustAtoi(gearedParts[1].number)
132 // fmt.Println(parts)
136 func getPart(gearloc Coord, offset Coord, parts []Part) (Part, error) {
137 coord := Coord{x: gearloc.x + offset.x, y: gearloc.y + offset.y}
138 for _, part := range parts {
139 if coord.x >= part.location.x &&
140 coord.x <= part.location.x + len(part.number) -1 &&
141 coord.y == part.location.y {
145 return Part{}, errors.New("Not Found")