4
4
"advent-of-code/util"
5
5
"bufio"
6
6
"fmt"
7
+ "math/rand"
7
8
"strings"
8
9
)
9
10
@@ -29,34 +30,49 @@ func main() {
29
30
})
30
31
}
31
32
32
- var result int
33
- var update map [int ]int
33
+ var result , invalidResult int
34
34
for scan .Scan () {
35
- valid := true
35
+ row := scan .Text ()
36
+ ints := util .StringToInts (row , "," )
36
37
37
- parts = strings .Split (scan .Text (), "," )
38
- update = map [int ]int {}
39
- for i := range parts {
40
- update [util .MustAtoi (parts [i ])] = i
41
- }
42
-
43
- var pos1 , pos2 int
44
- var ok1 , ok2 bool
45
- for i := range rules {
46
- pos1 , ok1 = update [rules [i ][0 ]]
47
- pos2 , ok2 = update [rules [i ][1 ]]
38
+ if isValidRow (ints , rules ) {
39
+ mid := int (len (ints ) / 2 )
40
+ result += ints [mid ]
41
+ } else {
42
+ for {
43
+ rand .Shuffle (len (ints ), func (i , j int ) {
44
+ ints [i ], ints [j ] = ints [j ], ints [i ]
45
+ })
48
46
49
- if ok1 && ok2 && pos1 >= pos2 {
50
- valid = false
51
- break
47
+ if isValidRow (ints , rules ) {
48
+ mid := int (len (ints ) / 2 )
49
+ invalidResult += ints [mid ]
50
+ break
51
+ }
52
52
}
53
53
}
54
+ }
55
+
56
+ fmt .Println (result )
57
+ fmt .Println (invalidResult )
58
+ }
59
+
60
+ func isValidRow (ints []int , rules [][2 ]int ) bool {
61
+ update := map [int ]int {}
62
+ for i := range ints {
63
+ update [ints [i ]] = i
64
+ }
54
65
55
- if valid {
56
- mid := int (len (parts ) / 2 )
57
- result += util .MustAtoi (parts [mid ])
66
+ var pos1 , pos2 int
67
+ var ok1 , ok2 bool
68
+ for i := range rules {
69
+ pos1 , ok1 = update [rules [i ][0 ]]
70
+ pos2 , ok2 = update [rules [i ][1 ]]
71
+
72
+ if ok1 && ok2 && pos1 >= pos2 {
73
+ return false
58
74
}
59
75
}
60
76
61
- fmt . Println ( result )
77
+ return true
62
78
}
0 commit comments