Compare commits

...

3 Commits

  1. 19
      2024/aggregate.go
  2. 92
      2024/day02.go

19
2024/aggregate.go

@ -0,0 +1,19 @@
package adventoc2024
func anyt(b []bool) bool {
for i := range b {
if b[i] {
return true
}
}
return false
}
func allt(b []bool) bool {
for i := range b {
if !b[i] {
return false
}
}
return true
}

92
2024/day02.go

@ -4,6 +4,7 @@ import (
"bufio" "bufio"
"fmt" "fmt"
"io" "io"
"slices"
"strings" "strings"
) )
@ -13,7 +14,6 @@ func (d Day2) Part1(r io.Reader) string {
s := bufio.NewScanner(r) s := bufio.NewScanner(r)
var sum int var sum int
Scan:
for s.Scan() { for s.Scan() {
sz := strings.Count(s.Text(), " ") + 1 sz := strings.Count(s.Text(), " ") + 1
@ -26,40 +26,23 @@ Scan:
fmt.Sscan(s.Text(), levelprts...) fmt.Sscan(s.Text(), levelprts...)
increasing := level[1]-level[0] > 0 if layerOk(level) {
if increasing {
for i := 0; i < len(level)-1; i++ {
if diff := level[i+1] - level[i]; diff > 3 || diff < 1 {
continue Scan
}
}
sum++ sum++
} else { } else {
for i := 0; i < len(level)-1; i++ { slices.Reverse(level)
if diff := level[i] - level[i+1]; diff > 3 || diff < 1 { if layerOk(level) {
continue Scan
}
}
sum++ sum++
} }
} }
}
return printi(sum) return printi(sum)
} }
// part 2 does not yet work because this code makes a false assumption.
// that assumption is that in order to fix a broken level, you can only skip the
// one that made it broken.
//
// this is not true because of the following level
// 5 6 3 2
// 5 and 6 would be OK, so the algorithm will blame the 3 and attempt to skip it.
// the real solution however, is to skip the 6 because it would be fine if all descending
func (d Day2) Part2(r io.Reader) string { func (d Day2) Part2(r io.Reader) string {
s := bufio.NewScanner(r) s := bufio.NewScanner(r)
var sum int var sum int
Scan:
for s.Scan() { for s.Scan() {
sz := strings.Count(s.Text(), " ") + 1 sz := strings.Count(s.Text(), " ") + 1
@ -72,55 +55,46 @@ Scan:
fmt.Sscan(s.Text(), levelprts...) fmt.Sscan(s.Text(), levelprts...)
increasing := level[1]-level[0] > 0 if layerOkWithDampen(level) {
var dampened bool sum++
if increasing { } else {
for i := 0; i < len(level)-1; i++ { slices.Reverse(level)
if diff := level[i+1] - level[i]; !inrange(diff) { if layerOkWithDampen(level) {
if dampened { sum++
continue Scan
}
if i+2 > len(level)-1 {
continue Scan
} }
d2 := level[i+2] - level[i]
if !inrange(d2) {
continue Scan
} }
dampened = true
i++
}
} }
sum++ return printi(sum)
} else {
for i := 0; i < len(level)-1; i++ {
if diff := level[i] - level[i+1]; !inrange(diff) {
if dampened {
continue Scan
} }
if i+2 > len(level)-1 { func inrange(i int) bool {
continue Scan return i < 4 && i > 0
} }
d2 := level[i] - level[i+2] func layerOk(layer []int) bool {
if !inrange(d2) { for i := 0; i < len(layer)-1; i++ {
continue Scan if !inrange(layer[i] - layer[i+1]) {
return false
} }
dampened = true
i++
} }
return true
} }
sum++
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 printi(sum) return false
} }
}
func inrange(i int) bool { return true
return i < 4 && i > 0
} }

Loading…
Cancel
Save