File tree 1 file changed +23
-11
lines changed
1 file changed +23
-11
lines changed Original file line number Diff line number Diff line change @@ -29,50 +29,62 @@ func day7(file string) (part1, part2 int) {
29
29
n = append (n , nums )
30
30
}
31
31
ops := make ([]int , len (n )- 1 )
32
+ prevvalues := make ([]int , len (n ))
33
+ prevvalues [0 ] = n [0 ]
34
+ last := 1
32
35
a:
33
36
for {
34
- start := n [0 ]
35
- ispart2 := false
37
+ start := prevvalues [last - 1 ]
36
38
bad := len (ops ) - 1
37
- for i := 1 ; i < len (n ); i ++ {
39
+ for i := last ; i < len (n ); i ++ {
38
40
if ops [i - 1 ] == 0 {
39
41
start += n [i ]
40
42
} else if ops [i - 1 ] == 1 {
41
43
start *= n [i ]
42
44
} else {
43
- ispart2 = true
45
+ // ispart2 = true
44
46
for range len (rs [i ]) {
45
47
start *= 10
46
48
}
47
49
start += n [i ]
48
50
}
51
+ prevvalues [i ] = start
49
52
if start > testv {
50
- // Early exit
53
+ // Early exit, so we know all operators
54
+ // after this is "bad", jump to the next
55
+ // op.
51
56
bad = i - 1
52
57
break
53
58
}
54
59
}
55
60
if start == testv {
56
- if ispart2 {
57
- part2 += testv
58
- } else {
59
- part1 += testv
61
+ // Need to recheck, since we cached old values, unsure
62
+ // if we're using part2 ops or not
63
+ for _ , v := range ops {
64
+ if v == 2 {
65
+ part2 += testv
66
+ break a
67
+ }
60
68
}
69
+ part1 += testv
61
70
break a
62
71
}
63
72
73
+ // Iterate to the next ops, starting with the
74
+ // one we know it's bad, no need to test everything
64
75
for i := bad ; i >= 0 ; i -- {
65
76
ops [i ]++
66
77
if ops [i ] == 3 {
67
78
ops [i ] = 0
68
79
} else {
80
+ // Remember where we're continuing, don't
81
+ // need to recalc everything
82
+ last = i + 1
69
83
continue a
70
84
}
71
85
}
72
86
break
73
87
}
74
-
75
- // log.Println(testv, n)
76
88
}
77
89
part2 += part1
78
90
return
You can’t perform that action at this time.
0 commit comments