package adventoc2024 import ( "bufio" "fmt" "io" "strings" ) type Day2 struct{} func (d Day2) Part1(r io.Reader) string { s := bufio.NewScanner(r) var sum int for s.Scan() { sz := strings.Count(s.Text(), " ") + 1 level := make([]int, sz) levelprts := make([]any, sz) for i := range levelprts { levelprts[i] = &level[i] } fmt.Sscan(s.Text(), levelprts...) if layerOk(level) { sum++ } else { reverse(level) if layerOk(level) { sum++ } } } return printi(sum) } func (d Day2) Part2(r io.Reader) string { s := bufio.NewScanner(r) var sum int for s.Scan() { sz := strings.Count(s.Text(), " ") + 1 level := make([]int, sz) levelprts := make([]any, sz) for i := range levelprts { levelprts[i] = &level[i] } fmt.Sscan(s.Text(), levelprts...) if layerOkWithDampen(level) { sum++ } else { reverse(level) if layerOkWithDampen(level) { sum++ } } } return printi(sum) } func inrange(i int) bool { return i < 4 && i > 0 } func layerOk(layer []int) bool { for i := 0; i < len(layer)-1; i++ { if !inrange(layer[i] - layer[i+1]) { return false } } return true } func layerOkWithDampen(layer []int) bool { layerc := make([]int, len(layer)-1) for i := 0; i < len(layer)-1; i++ { if !inrange(layer[i] - layer[i+1]) { copy(layerc, layer[i:i+1]) for i := range layer { copy(layerc, layer[:i]) copy(layerc[i:], layer[i+1:]) if layerOk(layerc) { return true } } return false } } return true }