day3 and 4
This commit is contained in:
146
2023/go/day03/day03.go
Normal file
146
2023/go/day03/day03.go
Normal 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")
|
||||
}
|
||||
Reference in New Issue
Block a user