Skip to content

Commit a84bf81

Browse files
committed
Complete Day 2 part 2
1 parent 74119fc commit a84bf81

File tree

1 file changed

+81
-27
lines changed

1 file changed

+81
-27
lines changed

2024/day2/day2.go

+81-27
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,46 @@ import (
88
"strings"
99
)
1010

11+
func RemoveIndex(s []int, index int) []int {
12+
new_s := []int{}
13+
for i, v := range s {
14+
if i != index {
15+
new_s = append(new_s, v)
16+
}
17+
}
18+
return new_s
19+
}
20+
21+
func pop(slice []int) (int, []int) {
22+
return slice[0], slice[1:]
23+
}
24+
25+
func isSafeRow(row []int) bool {
26+
prev := row[0]
27+
curr := row[1]
28+
increasing := true
29+
if prev > curr {
30+
increasing = false
31+
}
32+
for j := 1; j < len(row); j++ {
33+
curr = row[j]
34+
diff := int(math.Abs(float64(prev - curr)))
35+
if !(diff >= 1 && diff <= 3) {
36+
return false
37+
}
38+
if increasing && prev > curr {
39+
return false
40+
}
41+
if !increasing && prev < curr {
42+
return false
43+
}
44+
prev = curr
45+
}
46+
return true
47+
}
48+
1149
func main() {
50+
// fi, err := os.Open("day2_sample")
1251
fi, err := os.Open("day2_input")
1352
if err != nil {
1453
panic(err)
@@ -29,39 +68,54 @@ func main() {
2968
}
3069
list = append(list, row)
3170
}
32-
fmt.Println(list)
3371

34-
candidates := [][]int{}
35-
for _, row := range list {
36-
prev := row[0]
37-
curr := row[1]
38-
increasing := true
39-
if prev > curr {
40-
increasing = false
72+
candidates := make(map[int]bool)
73+
for i, row := range list {
74+
candidates[i] = isSafeRow(row)
75+
}
76+
partA := 0
77+
for _, v := range candidates {
78+
if v {
79+
partA++
4180
}
42-
finished := true
43-
for i := 1; i < len(row); i++ {
44-
curr = row[i]
45-
diff := int(math.Abs(float64(prev - curr)))
46-
if !(diff >= 1 && diff <= 3) {
47-
finished = false
48-
break
49-
}
50-
if increasing && prev > curr {
51-
finished = false
52-
break
53-
}
54-
if !increasing && prev < curr {
55-
finished = false
81+
}
82+
83+
fmt.Println(partA)
84+
85+
// brute force approach for b
86+
// 1. get all unsafe indexes (false)
87+
// 2. for each unsafe row, remove first element and check if it is safe, second element, and so on, if at least one is safe, then it is safe
88+
// and we can remove it from the unsafe list
89+
unsafe := []int{}
90+
for i, v := range candidates {
91+
if !v {
92+
unsafe = append(unsafe, i)
93+
}
94+
}
95+
96+
for len(unsafe) > 0 {
97+
i, rest := pop(unsafe)
98+
unsafe = rest
99+
row := list[i]
100+
n := len(row)
101+
for j := 0; j < n; j++ {
102+
new_row := RemoveIndex(row, j)
103+
104+
fmt.Println(new_row)
105+
if isSafeRow(new_row) {
106+
fmt.Println("safe")
107+
candidates[i] = true
56108
break
57109
}
58-
prev = curr
59110
}
60-
if finished {
61-
candidates = append(candidates, row)
111+
}
112+
113+
partB := 0
114+
for _, v := range candidates {
115+
if v {
116+
partB++
62117
}
63118
}
64-
fmt.Println(len(candidates))
119+
fmt.Println(partB)
65120

66-
// sort the
67121
}

0 commit comments

Comments
 (0)