Files
advent-of-gode/2023/14/code.go
2023-12-14 07:53:03 +02:00

99 lines
1.8 KiB
Go

package main
import (
"fmt"
"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
grid := make([][]rune, 0)
for _, l := range strings.Split(input, "\n") {
if l == "" {
continue
}
gridLine := make([]rune, 0)
for _, r := range strings.Split(l, "") {
gridLine = append(gridLine, rune(r[0]))
}
grid = append(grid, gridLine)
}
if part2 {
return "not implemented"
}
// solve part 1 here
printGrid(grid)
grid = tilt(grid, 'N')
printGrid(grid)
distToS := len(grid)
load := 0
for v := 0; v < len(grid); v++ {
for h := 0; h < len(grid[v]); h++ {
if grid[v][h] == 'O' {
load += (distToS - v)
}
}
}
return load
}
func printGrid(grid [][]rune) {
print := false
if print {
fmt.Println("-----")
for v := 0; v < len(grid); v++ {
for h := 0; h < len(grid[v]); h++ {
fmt.Printf("%v", string(grid[v][h]))
}
fmt.Println()
}
fmt.Println("-----")
}
}
func tilt(grid [][]rune, dir rune) [][]rune {
if dir == 'N' {
for v := 0; v < len(grid); v++ {
for h := 0; h < len(grid[v]); h++ {
if grid[v][h] == 'O' {
// Move up as far as possible:
rolling:
for mv := v - 1; mv >= 0; mv-- {
if grid[mv][h] == '.' {
// swap and continue
grid[mv][h] = 'O'
grid[mv+1][h] = '.'
} else {
break rolling
}
}
}
}
}
return grid
}
panic("Bad direction")
}