@@ -2,6 +2,7 @@ package main
22
33import (
44 "bufio"
5+ "flag"
56 "fmt"
67 "github.com/fxnn/adventofcode2024/util"
78 "os"
@@ -48,7 +49,32 @@ func firstUnsafeIndex(levels []int) int {
4849 return - 1
4950}
5051
52+ func isSafeWithIndexRemoved (levels []int , index int ) bool {
53+ dampenedLevels , err := util .RemoveElement (levels , index )
54+ if err != nil {
55+ fmt .Fprintf (os .Stderr , "Error in RemoveElement: %s\n " , err )
56+ os .Exit (1 )
57+ }
58+ return firstUnsafeIndex (dampenedLevels ) == - 1
59+ }
60+
61+ func isSafeWithDampening (levels []int , unsafeIndex int ) bool {
62+ // HINT (0, 1): those we use for determining the gradient
63+ // HINT (i-1, i): these are the ones we compare for their difference and gradient
64+ dampeningIndices := []int {0 , 1 , unsafeIndex - 1 , unsafeIndex }
65+ for _ , dampeningIndex := range dampeningIndices {
66+ if isSafeWithIndexRemoved (levels , dampeningIndex ) {
67+ return true
68+ }
69+ }
70+ return false
71+ }
72+
5173func main () {
74+ var bruteforceEnabled bool
75+ flag .BoolVar (& bruteforceEnabled , "bruteforce" , false , "enable bruteforcing the solution" )
76+ flag .Parse ()
77+
5278 scanner := bufio .NewScanner (os .Stdin )
5379
5480 safeReports := 0
@@ -63,17 +89,17 @@ func main() {
6389 safeReports ++
6490 dampenedSafeReports ++
6591 fmt .Printf (" safe\n " )
66- } else {
67- var err error
68- levels , err = util . RemoveElement ( levels , index )
69- fmt . Printf ( " dampened %v \n " , levels )
70- if err != nil {
71- fmt . Fprintf ( os . Stderr , "Error in RemoveElement: %s \n " , err )
72- os . Exit ( 1 )
73- }
74- if firstUnsafeIndex ( levels ) == - 1 {
75- dampenedSafeReports ++
76- fmt . Printf ( " safe with dampener \n " )
92+ } else if isSafeWithDampening ( levels , index ) {
93+ dampenedSafeReports ++
94+ fmt . Printf ( " safe with dampener at index %d \n " , index )
95+ } else if bruteforceEnabled {
96+ for bruteforceIndex := range levels {
97+ if isSafeWithIndexRemoved ( levels , bruteforceIndex ) {
98+ dampenedSafeReports ++
99+ fmt . Printf ( " BRUTEFORCED: safe with dampener at index %d (we tried at %d, %d) \n " ,
100+ bruteforceIndex , index - 1 , index )
101+ break
102+ }
77103 }
78104 }
79105 }
0 commit comments