99 lines
1.8 KiB
Go
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")
|
|
}
|