Files
advent-of-gode/2023/18/code.go
2023-12-18 16:06:44 +02:00

133 lines
2.2 KiB
Go

package main
import (
"fmt"
"strconv"
"strings"
"github.com/jpillora/puzzler/harness/aoc"
)
func main() {
aoc.Harness(run)
}
// on code change, run will be executed 4 times:
// 1. with: false (part1), and example input
// 2. with: true (part2), and example input
// 3. with: false (part1), and user input
// 4. with: true (part2), and user input
// the return value of each run is printed to stdout
func run(part2 bool, input string) any {
// when you're ready to do part 2, remove this "not implemented" block
if part2 {
// More complex
return "not implemented"
}
// solve part 1 here
// Get max dimensions (sumR + sumD)
// or just make a big ass grid
maxV := 1200
maxH := 1200
grid := make([][]string, 0)
for v := 0; v < maxV; v++ {
gridLine := make([]string, 0)
for h := 0; h < maxH; h++ {
gridLine = append(gridLine, ".")
}
grid = append(grid, gridLine)
}
v := maxV / 2
h := maxH / 2
// Dig out trench
for _, l := range strings.Split(input, "\n") {
if l == "" {
continue
}
spl := strings.Split(l, " ")
order := spl[0]
dist, _ := strconv.Atoi(spl[1])
colour := spl[2]
for i := 0; i < dist; i++ {
if order == "R" {
h += 1
} else if order == "L" {
h -= 1
} else if order == "U" {
v -= 1
} else if order == "D" {
v += 1
} else {
panic("bad direction")
}
grid[v][h] = colour
}
}
// Fill out outside
outside := [][]int{{0, 0}}
for len(outside) > 0 {
o := outside[0]
outside = outside[1:]
if grid[o[0]][o[1]] == "." {
grid[o[0]][o[1]] = " "
v = o[0]
h = o[1]
if v > 0 {
outside = append(outside, []int{v - 1, h})
}
if h > 0 {
outside = append(outside, []int{v, h - 1})
}
if v < len(grid)-1 {
outside = append(outside, []int{v + 1, h})
}
if h < len(grid[0])-1 {
outside = append(outside, []int{v, h + 1})
}
}
}
// Finally count fill-in
digout := 0
for v := range grid {
for h := range grid {
if grid[v][h] != " " {
digout += 1
}
}
}
print := false
if print {
for v := range grid {
for h := range grid[v] {
if len(grid[v][h]) == 1 {
fmt.Print(grid[v][h])
} else {
fmt.Print("#")
}
}
fmt.Println()
}
}
return digout
}