mirror of
https://github.com/onyx-and-iris/aoc2023.git
synced 2024-11-15 15:10:49 +00:00
61 lines
1.4 KiB
Go
61 lines
1.4 KiB
Go
package main
|
|
|
|
import (
|
|
"strings"
|
|
|
|
log "github.com/sirupsen/logrus"
|
|
)
|
|
|
|
// findReflection returns the reflection point for an image
|
|
func findReflection(image []string) (int, bool) {
|
|
walkToEdge := func(lower, upper int) bool {
|
|
for lower >= 0 && upper < len(image) && strings.Compare(image[lower], image[upper]) == 0 {
|
|
lower--
|
|
upper++
|
|
}
|
|
lower++
|
|
return (lower == 0 || upper == len(image))
|
|
}
|
|
|
|
for i := 0; i < len(image)-1; i++ {
|
|
if strings.Compare(image[i], image[i+1]) == 0 {
|
|
log.Debug("start point: ", image[i], " vs ", image[i+1])
|
|
if walkToEdge(i, i+1) {
|
|
return i, true
|
|
}
|
|
}
|
|
}
|
|
return 0, false
|
|
}
|
|
|
|
// horizontalReflection returns the reflection point of a horizontal mirror
|
|
func horizontalReflection(image img, fn func(image []string) (int, bool)) (int, bool) {
|
|
return fn(image.raw)
|
|
}
|
|
|
|
// verticalReflection returns the reflection point of a vertical mirror
|
|
func verticalReflection(image img, fn func(image []string) (int, bool)) (int, bool) {
|
|
return fn(image.transposed())
|
|
}
|
|
|
|
// one returns a calculation based on reflection points for all images.
|
|
func one(lines []string) int {
|
|
parselines(lines)
|
|
|
|
sum := 0
|
|
for _, image := range images.img {
|
|
log.Debug("checking for horizontal reflection")
|
|
n, ok := horizontalReflection(image, findReflection)
|
|
if ok {
|
|
sum += 100 * (n + 1)
|
|
}
|
|
log.Debug("checking for vertical reflection")
|
|
n, ok = verticalReflection(image, findReflection)
|
|
if ok {
|
|
sum += (n + 1)
|
|
}
|
|
}
|
|
|
|
return sum
|
|
}
|