@@ -8,7 +8,46 @@ import (
8
8
"strings"
9
9
)
10
10
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
+
11
49
func main () {
50
+ // fi, err := os.Open("day2_sample")
12
51
fi , err := os .Open ("day2_input" )
13
52
if err != nil {
14
53
panic (err )
@@ -29,39 +68,54 @@ func main() {
29
68
}
30
69
list = append (list , row )
31
70
}
32
- fmt .Println (list )
33
71
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 ++
41
80
}
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
56
108
break
57
109
}
58
- prev = curr
59
110
}
60
- if finished {
61
- candidates = append (candidates , row )
111
+ }
112
+
113
+ partB := 0
114
+ for _ , v := range candidates {
115
+ if v {
116
+ partB ++
62
117
}
63
118
}
64
- fmt .Println (len ( candidates ) )
119
+ fmt .Println (partB )
65
120
66
- // sort the
67
121
}
0 commit comments