@@ -3,6 +3,8 @@ package main
3
3
import (
4
4
"fmt"
5
5
"github.com/terminalnode/adventofcode2024/common"
6
+ "strconv"
7
+ "strings"
6
8
)
7
9
8
10
func main () {
@@ -28,38 +30,61 @@ func part2(
28
30
return fmt .Sprintf ("Failed to parse machine: %v" , err )
29
31
}
30
32
31
- lenSeq := len (m .seq )
32
- initA := int64 (0 )
33
+ maxIdx := len (m .seq ) - 1
34
+ octArr := make ([]int , len (m .seq ))
35
+ octIdx := 0
33
36
initB := m .b
34
37
initC := m .c
35
- for initA = 0 ; true ; initA ++ {
36
- m . run ( lenSeq )
37
- if compareSeqOut ( m , lenSeq ) {
38
- break
39
- }
40
- m . a = initA
38
+
39
+ for {
40
+ seqIdx := maxIdx - octIdx
41
+
42
+ // Rig the machine
43
+ octArr [ octIdx ] += 1
41
44
m .b = initB
42
45
m .c = initC
43
46
m .out = m .out [:0 ]
44
- m .pos = 0
47
+
48
+ m .a , err = arrayToOct (octArr )
49
+ if err != nil {
50
+ return fmt .Sprintf ("Failed to read %v as octal string: %v" , octArr , err )
51
+ }
52
+
53
+ // Run the program and verify output
54
+ m .run (maxIdx + 1 )
55
+ correct := m .out [seqIdx ] == m .seq [seqIdx ]
56
+
57
+ if octIdx == maxIdx && correct {
58
+ break
59
+ } else if correct {
60
+ octIdx ++
61
+ octArr [octIdx ] = - 1
62
+ }
63
+
64
+ for octArr [octIdx ] == 7 {
65
+ octArr [octIdx ] = 0
66
+ octIdx --
67
+ }
45
68
}
46
69
47
- return fmt .Sprintf ("Registry A should be %d" , initA - 1 )
70
+ final , err := arrayToOct (octArr )
71
+ if err != nil {
72
+ return fmt .Sprintf ("Solved it, but failed to extract number: %v" , err )
73
+ }
74
+ return fmt .Sprintf ("Registry A should be %d" , final )
48
75
}
49
76
50
- func compareSeqOut (
51
- m machine ,
52
- lenSeq int ,
53
- ) bool {
54
- if len ( m . out ) != lenSeq {
55
- return false
77
+ func arrayToOct (
78
+ arr [] int ,
79
+ ) ( int64 , error ) {
80
+ strArr := make ([] string , len ( arr ))
81
+ for i , n := range arr {
82
+ strArr [ i ] = strconv . Itoa ( n )
56
83
}
57
84
58
- for i , seq := range m .seq {
59
- if m .out [i ] != seq {
60
- return false
61
- }
85
+ oct , err := strconv .ParseInt (strings .Join (strArr , "" ), 8 , 64 )
86
+ if err != nil {
87
+ return 0 , err
62
88
}
63
-
64
- return true
89
+ return oct , nil
65
90
}
0 commit comments