Skip to content

Commit 45703e9

Browse files
committed
day2: solved second part finally
1 parent d120fa2 commit 45703e9

File tree

1 file changed

+37
-11
lines changed

1 file changed

+37
-11
lines changed

day2/main.go

Lines changed: 37 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package main
22

33
import (
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+
5173
func 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

Comments
 (0)