aoc2023/day-14/one.go

58 lines
912 B
Go
Raw Normal View History

2023-12-14 22:22:41 +00:00
package main
const MAX = 10
func getload(raw []string) int {
load := 0
for _, line := range raw {
for i, r := range line {
if r == 'O' {
load += (i + 1)
}
}
}
return load
}
func spacesToRight(i int, line string) int {
num := 0
outer:
for i += 1; i < len(line); i++ {
switch line[i] {
case '.':
num++
case '#', 'O':
break outer
}
}
return num
}
func rollRight(line string) string {
for i := len(line) - 1; i >= 0; i-- {
if line[i] == 'O' {
n := spacesToRight(i, line)
if n == 0 {
continue
}
line = replaceAtIndex(line, '.', i)
line = replaceAtIndex(line, 'O', i+n)
}
}
return line
}
// one returns the load of all boulders after a single image cycle
func one(lines []string) int {
image := newImg(len(lines))
copy(image.raw, lines)
for i, line := range image.transposed() {
image.raw[i] = rollRight(line)
}
return getload(image.raw)
}