@@ -2,6 +2,7 @@ package main
2
2
3
3
import (
4
4
"bufio"
5
+ "flag"
5
6
"fmt"
6
7
"github.com/fxnn/adventofcode2024/util"
7
8
"os"
@@ -48,7 +49,32 @@ func firstUnsafeIndex(levels []int) int {
48
49
return - 1
49
50
}
50
51
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
+
51
73
func main () {
74
+ var bruteforceEnabled bool
75
+ flag .BoolVar (& bruteforceEnabled , "bruteforce" , false , "enable bruteforcing the solution" )
76
+ flag .Parse ()
77
+
52
78
scanner := bufio .NewScanner (os .Stdin )
53
79
54
80
safeReports := 0
@@ -63,17 +89,17 @@ func main() {
63
89
safeReports ++
64
90
dampenedSafeReports ++
65
91
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
+ }
77
103
}
78
104
}
79
105
}
0 commit comments