4
4
"advent-of-code/util"
5
5
"bufio"
6
6
"fmt"
7
- "math/rand"
8
7
"strings"
9
8
)
10
9
@@ -36,20 +35,13 @@ func main() {
36
35
ints := util .StringToInts (row , "," )
37
36
38
37
if isValidRow (ints , rules ) {
39
- mid := int ( len (ints ) / 2 )
38
+ mid := len (ints ) / 2
40
39
result += ints [mid ]
41
40
} else {
42
- for {
43
- rand .Shuffle (len (ints ), func (i , j int ) {
44
- ints [i ], ints [j ] = ints [j ], ints [i ]
45
- })
46
-
47
- if isValidRow (ints , rules ) {
48
- mid := int (len (ints ) / 2 )
49
- invalidResult += ints [mid ]
50
- break
51
- }
52
- }
41
+ ints = fixInvalidRow (ints , rules )
42
+
43
+ mid := len (ints ) / 2
44
+ invalidResult += ints [mid ]
53
45
}
54
46
}
55
47
@@ -58,16 +50,16 @@ func main() {
58
50
}
59
51
60
52
func isValidRow (ints []int , rules [][2 ]int ) bool {
61
- update := map [int ]int {}
53
+ position := map [int ]int {}
62
54
for i := range ints {
63
- update [ints [i ]] = i
55
+ position [ints [i ]] = i
64
56
}
65
57
66
58
var pos1 , pos2 int
67
59
var ok1 , ok2 bool
68
60
for i := range rules {
69
- pos1 , ok1 = update [rules [i ][0 ]]
70
- pos2 , ok2 = update [rules [i ][1 ]]
61
+ pos1 , ok1 = position [rules [i ][0 ]]
62
+ pos2 , ok2 = position [rules [i ][1 ]]
71
63
72
64
if ok1 && ok2 && pos1 >= pos2 {
73
65
return false
@@ -76,3 +68,27 @@ func isValidRow(ints []int, rules [][2]int) bool {
76
68
77
69
return true
78
70
}
71
+
72
+ func fixInvalidRow (ints []int , rules [][2 ]int ) []int {
73
+ outer:
74
+ for ! isValidRow (ints , rules ) {
75
+ position := map [int ]int {}
76
+ for i := range ints {
77
+ position [ints [i ]] = i
78
+ }
79
+
80
+ var pos1 , pos2 int
81
+ var ok1 , ok2 bool
82
+ for i := range rules {
83
+ pos1 , ok1 = position [rules [i ][0 ]]
84
+ pos2 , ok2 = position [rules [i ][1 ]]
85
+
86
+ if ok1 && ok2 && pos1 >= pos2 {
87
+ ints [pos1 ], ints [pos2 ] = ints [pos2 ], ints [pos1 ]
88
+ continue outer
89
+ }
90
+ }
91
+ }
92
+
93
+ return ints
94
+ }
0 commit comments