@@ -8,28 +8,23 @@ function day24(input::String = readInput(joinpath(@__DIR__, "..", "data", "day24
8
8
9
9
swapped_outputs = []
10
10
_, wrong_adders = check_adders (rules, Int[])
11
- println (" wrong_adders = $wrong_adders " )
12
11
13
12
sequences = find_sequences (wrong_adders)
14
-
15
13
for sequence ∈ sequences
16
14
nrules = needed_rules (rules, sequence)
17
- # ruleorder = nothing
18
15
for collection ∈ (nrules, setdiff (1 : length (rules), nrules))
19
16
stop = false
20
17
for ri ∈ collection
21
- println (" ri = $ri " )
22
18
for rj ∈ nrules
23
19
first, second = swap_outputs! (rules, ri , rj)
24
20
corrects_critical_gates, ruleorder = check_adders_at_indices (rules, sequence)
25
21
if corrects_critical_gates
26
- success, wrinds = check_adders (rules, sequence; ruleorder)
27
- if success && issubset (wrinds, wrong_adders)
28
- println (" SUCCESS: $first , $second , (ri, rj) = ($ri , $rj ), wrinds = $wrinds " )
22
+ success, _ = check_adders_at_indices (rules, setdiff (0 : 44 , wrong_adders); ruleorder)
23
+ if success
29
24
push! (swapped_outputs, first)
30
25
push! (swapped_outputs, second)
31
26
stop = true
32
- wrong_adders = wrinds
27
+ wrong_adders = setdiff (wrong_adders, sequence)
33
28
break
34
29
end
35
30
end
@@ -96,85 +91,6 @@ function parse_input(input::AbstractString)
96
91
return x, y, rule
97
92
end
98
93
99
- # function run(x::Int, y::Int, rules::Vector{NTuple{4, String}}; ruleorder::Vector{Int} = Int[])
100
- # state = Dict{String,Bool}()
101
- # unused_rules = Set(1:length(rules))
102
- # prev_length = length(unused_rules) + 1
103
- # reg = r"([xy])(\d{2})"
104
- # if isempty(ruleorder)
105
- # useruleorder = false
106
- # ruleorder = zeros(Int, length(rules))
107
- # elseif any(ruleorder .== 0)
108
- # return -1, ruleorder
109
- # else
110
- # useruleorder = true
111
- # end
112
-
113
- # i = 1
114
- # while !isempty(unused_rules) && length(unused_rules) < prev_length
115
- # prev_length = length(unused_rules)
116
-
117
- # if useruleorder
118
- # rulies = ruleorder
119
- # else
120
- # rulies = copy(unused_rules)
121
- # end
122
- # for ri ∈ rulies
123
- # rule = rules[ri]
124
- # values = [false, false]
125
- # found = false
126
- # for i ∈ 2:3
127
- # m = match(reg, rule[i])
128
- # if m !== nothing
129
- # found = true
130
- # index = parse(Int, m.captures[2])
131
- # if m.captures[1] == "x"
132
- # values[i-1] = (x >> index) % 2
133
- # else
134
- # values[i-1] = (y >> index) % 2
135
- # end
136
- # else
137
- # if haskey(state, rule[i])
138
- # found = true
139
- # values[i-1] = state[rule[i]]
140
- # else
141
- # found = false
142
- # break
143
- # end
144
- # end
145
- # end
146
- # if found
147
- # delete!(unused_rules, ri)
148
- # if i ∉ (1:222)
149
- # println(i)
150
- # end
151
- # ruleorder[i] = ri
152
- # i += 1
153
- # if rule[1] == "AND"
154
- # state[rule[4]] = values[1] & values[2]
155
- # elseif rule[1] == "OR"
156
- # state[rule[4]] = values[1] | values[2]
157
- # elseif rule[1] == "XOR"
158
- # state[rule[4]] = values[1] ⊻ values[2]
159
- # end
160
- # end
161
- # end
162
- # end
163
-
164
- # !isempty(unused_rules) && return -1, ruleorder
165
-
166
- # result = 0
167
- # i = 0
168
- # while true
169
- # id = _to_id(i, "z")
170
- # !haskey(state, id) && break
171
- # result += state[id] << i
172
- # i += 1
173
- # end
174
- # return result, ruleorder
175
- # end
176
-
177
-
178
94
function run (x:: Int , y:: Int , rules:: Vector{NTuple{4, String}} , ruleorder:: Nothing )
179
95
state = Dict {String,Bool} ()
180
96
unused_rules = Set (1 : length (rules))
0 commit comments