day3 and 4

This commit is contained in:
2023-12-04 13:31:13 +00:00
parent e7cd9346f2
commit 56571eadf0
10 changed files with 664 additions and 7 deletions

146
2023/go/day03/day03.go Normal file
View File

@@ -0,0 +1,146 @@
package day03
import (
"adventofcode2023/utils"
_ "adventofcode2023/utils"
_ "adventofcode2023/utils/grid2d"
"adventofcode2023/utils/inputs"
"errors"
"fmt"
"unicode"
)
type Coord struct {
x int
y int
}
type Part struct {
number string
location Coord
}
func Part1(input string) int {
grid := inputs.ToGrid2D(input, "\n", "", ".", func(c string) string { return c})
partLocs := []Coord{}
for j := 0; j < grid.SizeY(); j++ {
for i := 0; i < grid.SizeX(); i++ {
if !unicode.IsDigit(rune(grid.Get(i, j)[0])) { continue}
directions := [][]int{{0, 1}, {0, -1}, {1, 0}, {-1, 0},{-1,1},{1,1},{-1,-1},{1,-1}}
for _, dir := range directions {
x := i + dir[0]
y := j + dir[1]
if x < 0 || x >= grid.SizeX() || y < 0 || y >= grid.SizeY() {
continue
}
if !unicode.IsDigit(rune(grid.Get(x, y)[0])) && grid.Get(x, y) != "." {
fmt.Printf("partLoc x:%v y:%v %v\n", i, j, string(grid.Get(i, j)))
partLocs = append(partLocs, Coord{i, j})
break
}
}
}
}
fmt.Println(partLocs)
sum := 0
for _, partLoc := range partLocs {
if grid.Get(partLoc.x, partLoc.y) == "." {
continue
}
partNum := grid.Get(partLoc.x, partLoc.y)
for i:=1;unicode.IsDigit(rune(grid.Get(partLoc.x+i, partLoc.y)[0]));i++{
partNum += grid.Get(partLoc.x+i, partLoc.y)
grid.Set(partLoc.x+i, partLoc.y, ".")
}
for i:=-1;unicode.IsDigit(rune(grid.Get(partLoc.x+i, partLoc.y)[0]));i--{
partNum = grid.Get(partLoc.x+i, partLoc.y) + partNum
grid.Set(partLoc.x+i, partLoc.y, ".")
}
fmt.Println(partNum)
sum += utils.MustAtoi(partNum)
}
return sum
}
func Part2(input string) int {
grid := inputs.ToGrid2D(input, "\n", "", ".", func(c string) string { return c})
partLocs := []Coord{}
gearLocs := []Coord{}
for j := 0; j < grid.SizeY(); j++ {
for i := 0; i < grid.SizeX(); i++ {
if grid.Get(i, j) == "*" {
gearLocs = append(gearLocs, Coord{i, j})
}
if !unicode.IsDigit(rune(grid.Get(i, j)[0])) { continue}
directions := [][]int{{0, 1}, {0, -1}, {1, 0}, {-1, 0},{-1,1},{1,1},{-1,-1},{1,-1}}
for _, dir := range directions {
x := i + dir[0]
y := j + dir[1]
if x < 0 || x >= grid.SizeX() || y < 0 || y >= grid.SizeY() {
continue
}
if !unicode.IsDigit(rune(grid.Get(x, y)[0])) && grid.Get(x, y) != "." {
partLocs = append(partLocs, Coord{i, j})
break
}
}
}
}
fmt.Println(partLocs)
fmt.Println(gearLocs)
parts := []Part{}
for _, partLoc := range partLocs {
l := 0
if grid.Get(partLoc.x, partLoc.y) == "." {
continue
}
partNum := grid.Get(partLoc.x, partLoc.y)
for i:=1;unicode.IsDigit(rune(grid.Get(partLoc.x+i, partLoc.y)[0]));i++{
partNum += grid.Get(partLoc.x+i, partLoc.y)
grid.Set(partLoc.x+i, partLoc.y, ".")
}
l = partLoc.x
for i:=-1;unicode.IsDigit(rune(grid.Get(partLoc.x+i, partLoc.y)[0]));i--{
partNum = grid.Get(partLoc.x+i, partLoc.y) + partNum
grid.Set(partLoc.x+i, partLoc.y, ".")
l = partLoc.x+i
}
fmt.Println(partNum)
parts = append(parts, Part{number: partNum, location: Coord{x: l, y: partLoc.y}})
}
sum := 0
for _, gearLoc := range gearLocs {
var gearedParts [2]Part
directions := []Coord{{0,1},{0,-1},{1,0},{-1,0},{-1,1},{1,1},{-1,-1},{1,-1}}
for _, dir := range directions {
part, err := getPart(gearLoc, dir, parts)
if err != nil {continue}
if gearedParts[0] == (Part{}) {
gearedParts[0] = part
} else if gearedParts[0] == part {
fmt.Println("duplicate part found")
} else {
gearedParts[1] = part
}
}
fmt.Println(gearedParts)
if gearedParts[0] != (Part{}) && gearedParts[1] != (Part{}) {
sum += utils.MustAtoi(gearedParts[0].number) * utils.MustAtoi(gearedParts[1].number)
}
}
// fmt.Println(parts)
return sum
}
func getPart(gearloc Coord, offset Coord, parts []Part) (Part, error) {
coord := Coord{x: gearloc.x + offset.x, y: gearloc.y + offset.y}
for _, part := range parts {
if coord.x >= part.location.x &&
coord.x <= part.location.x + len(part.number) -1 &&
coord.y == part.location.y {
return part, nil
}
}
return Part{}, errors.New("Not Found")
}