this repo has no description
1<!-- livebook:{"persist_outputs":true} -->
2
3# Day 24
4
5## Section
6
7```elixir
8defmodule Day24 do
9 def parse("inp " <> reg), do: {:inp, String.to_atom(reg)}
10
11 def parse(<<op::binary-size(3)>> <> " " <> <<reg>> <> " " <> arg) do
12 {String.to_atom(op), String.to_atom(<<reg>>), parse_arg(arg)}
13 end
14
15 defp parse_arg(arg) do
16 case Integer.parse(arg) do
17 {num, ""} -> num
18 :error -> String.to_atom(arg)
19 end
20 end
21
22 def evaluate(ops, input), do: evaluate(ops, Integer.digits(input), %{w: 0, x: 0, y: 0, z: 0})
23
24 defp evaluate([], _, regs), do: regs
25
26 defp evaluate([:nop | rest], input, regs), do: evaluate(rest, input, regs)
27
28 defp evaluate([{:inp, reg} | rest], [v | input], regs),
29 do: evaluate(rest, input, %{regs | reg => v})
30
31 defp evaluate([{:eql, reg, v} | rest], input, regs) do
32 val = if get(reg, regs) == get(v, regs), do: 1, else: 0
33
34 evaluate(rest, input, %{regs | reg => val})
35 end
36
37 defp evaluate([{:add, reg, v} | rest], input, regs),
38 do: evaluate(rest, input, %{regs | reg => get(reg, regs) + get(v, regs)})
39
40 defp evaluate([{:mul, reg, v} | rest], input, regs),
41 do: evaluate(rest, input, %{regs | reg => get(reg, regs) * get(v, regs)})
42
43 defp evaluate([{:div, reg, v} | rest], input, regs),
44 do: evaluate(rest, input, %{regs | reg => div(get(reg, regs), get(v, regs))})
45
46 defp evaluate([{:mod, reg, v} | rest], input, regs),
47 do: evaluate(rest, input, %{regs | reg => rem(get(reg, regs), get(v, regs))})
48
49 defp get(imm, _regs) when is_integer(imm), do: imm
50 defp get(reg, regs) when is_atom(reg), do: Map.get(regs, reg, 0)
51end
52
53input =
54 File.stream!("day24.txt")
55 |> Stream.map(&String.trim/1)
56 |> Enum.map(&Day24.parse/1)
57 |> IO.inspect(limit: :infinity)
58
59length(input)
60```
61
62<!-- livebook:{"output":true} -->
63
64```
65[
66 {:inp, :w},
67 {:mul, :x, 0},
68 {:add, :x, :z},
69 {:mod, :x, 26},
70 {:div, :z, 1},
71 {:add, :x, 11},
72 {:eql, :x, :w},
73 {:eql, :x, 0},
74 {:mul, :y, 0},
75 {:add, :y, 25},
76 {:mul, :y, :x},
77 {:add, :y, 1},
78 {:mul, :z, :y},
79 {:mul, :y, 0},
80 {:add, :y, :w},
81 {:add, :y, 16},
82 {:mul, :y, :x},
83 {:add, :z, :y},
84 {:inp, :w},
85 {:mul, :x, 0},
86 {:add, :x, :z},
87 {:mod, :x, 26},
88 {:div, :z, 1},
89 {:add, :x, 12},
90 {:eql, :x, :w},
91 {:eql, :x, 0},
92 {:mul, :y, 0},
93 {:add, :y, 25},
94 {:mul, :y, :x},
95 {:add, :y, 1},
96 {:mul, :z, :y},
97 {:mul, :y, 0},
98 {:add, :y, :w},
99 {:add, :y, 11},
100 {:mul, :y, :x},
101 {:add, :z, :y},
102 {:inp, :w},
103 {:mul, :x, 0},
104 {:add, :x, :z},
105 {:mod, :x, 26},
106 {:div, :z, 1},
107 {:add, :x, 13},
108 {:eql, :x, :w},
109 {:eql, :x, 0},
110 {:mul, :y, 0},
111 {:add, :y, 25},
112 {:mul, :y, :x},
113 {:add, :y, 1},
114 {:mul, :z, :y},
115 {:mul, :y, 0},
116 {:add, :y, :w},
117 {:add, :y, 12},
118 {:mul, :y, :x},
119 {:add, :z, :y},
120 {:inp, :w},
121 {:mul, :x, 0},
122 {:add, :x, :z},
123 {:mod, :x, 26},
124 {:div, :z, 26},
125 {:add, :x, -5},
126 {:eql, :x, :w},
127 {:eql, :x, 0},
128 {:mul, :y, 0},
129 {:add, :y, 25},
130 {:mul, :y, :x},
131 {:add, :y, 1},
132 {:mul, :z, :y},
133 {:mul, :y, 0},
134 {:add, :y, :w},
135 {:add, :y, 12},
136 {:mul, :y, :x},
137 {:add, :z, :y},
138 {:inp, :w},
139 {:mul, :x, 0},
140 {:add, :x, :z},
141 {:mod, :x, 26},
142 {:div, :z, 26},
143 {:add, :x, -3},
144 {:eql, :x, :w},
145 {:eql, :x, 0},
146 {:mul, :y, 0},
147 {:add, :y, 25},
148 {:mul, :y, :x},
149 {:add, :y, 1},
150 {:mul, :z, :y},
151 {:mul, :y, 0},
152 {:add, :y, :w},
153 {:add, :y, 12},
154 {:mul, :y, :x},
155 {:add, :z, :y},
156 {:inp, :w},
157 {:mul, :x, 0},
158 {:add, :x, :z},
159 {:mod, :x, 26},
160 {:div, :z, 1},
161 {:add, :x, 14},
162 {:eql, :x, :w},
163 {:eql, :x, 0},
164 {:mul, :y, 0},
165 {:add, :y, 25},
166 {:mul, :y, :x},
167 {:add, :y, 1},
168 {:mul, :z, :y},
169 {:mul, :y, 0},
170 {:add, :y, :w},
171 {:add, :y, 2},
172 {:mul, :y, :x},
173 {:add, :z, :y},
174 {:inp, :w},
175 {:mul, :x, 0},
176 {:add, :x, :z},
177 {:mod, :x, 26},
178 {:div, :z, 1},
179 {:add, :x, 15},
180 {:eql, :x, :w},
181 {:eql, :x, 0},
182 {:mul, :y, 0},
183 {:add, :y, 25},
184 {:mul, :y, :x},
185 {:add, :y, 1},
186 {:mul, :z, :y},
187 {:mul, :y, 0},
188 {:add, :y, :w},
189 {:add, :y, 11},
190 {:mul, :y, :x},
191 {:add, :z, :y},
192 {:inp, :w},
193 {:mul, :x, 0},
194 {:add, :x, :z},
195 {:mod, :x, 26},
196 {:div, :z, 26},
197 {:add, :x, -16},
198 {:eql, :x, :w},
199 {:eql, :x, 0},
200 {:mul, :y, 0},
201 {:add, :y, 25},
202 {:mul, :y, :x},
203 {:add, :y, 1},
204 {:mul, :z, :y},
205 {:mul, :y, 0},
206 {:add, :y, :w},
207 {:add, :y, 4},
208 {:mul, :y, :x},
209 {:add, :z, :y},
210 {:inp, :w},
211 {:mul, :x, 0},
212 {:add, :x, :z},
213 {:mod, :x, 26},
214 {:div, :z, 1},
215 {:add, :x, 14},
216 {:eql, :x, :w},
217 {:eql, :x, 0},
218 {:mul, :y, 0},
219 {:add, :y, 25},
220 {:mul, :y, :x},
221 {:add, :y, 1},
222 {:mul, :z, :y},
223 {:mul, :y, 0},
224 {:add, :y, :w},
225 {:add, :y, 12},
226 {:mul, :y, :x},
227 {:add, :z, :y},
228 {:inp, :w},
229 {:mul, :x, 0},
230 {:add, :x, :z},
231 {:mod, :x, 26},
232 {:div, :z, 1},
233 {:add, :x, 15},
234 {:eql, :x, :w},
235 {:eql, :x, 0},
236 {:mul, :y, 0},
237 {:add, :y, 25},
238 {:mul, :y, :x},
239 {:add, :y, 1},
240 {:mul, :z, :y},
241 {:mul, :y, 0},
242 {:add, :y, :w},
243 {:add, :y, 9},
244 {:mul, :y, :x},
245 {:add, :z, :y},
246 {:inp, :w},
247 {:mul, :x, 0},
248 {:add, :x, :z},
249 {:mod, :x, 26},
250 {:div, :z, 26},
251 {:add, :x, -7},
252 {:eql, :x, :w},
253 {:eql, :x, 0},
254 {:mul, :y, 0},
255 {:add, :y, 25},
256 {:mul, :y, :x},
257 {:add, :y, 1},
258 {:mul, :z, :y},
259 {:mul, :y, 0},
260 {:add, :y, :w},
261 {:add, :y, 10},
262 {:mul, :y, :x},
263 {:add, :z, :y},
264 {:inp, :w},
265 {:mul, :x, 0},
266 {:add, :x, :z},
267 {:mod, :x, 26},
268 {:div, :z, 26},
269 {:add, :x, -11},
270 {:eql, :x, :w},
271 {:eql, :x, 0},
272 {:mul, :y, 0},
273 {:add, :y, 25},
274 {:mul, :y, :x},
275 {:add, :y, 1},
276 {:mul, :z, :y},
277 {:mul, :y, 0},
278 {:add, :y, :w},
279 {:add, :y, 11},
280 {:mul, :y, :x},
281 {:add, :z, :y},
282 {:inp, :w},
283 {:mul, :x, 0},
284 {:add, :x, :z},
285 {:mod, :x, 26},
286 {:div, :z, 26},
287 {:add, :x, -6},
288 {:eql, :x, :w},
289 {:eql, :x, 0},
290 {:mul, :y, 0},
291 {:add, :y, 25},
292 {:mul, :y, :x},
293 {:add, :y, 1},
294 {:mul, :z, :y},
295 {:mul, :y, 0},
296 {:add, :y, :w},
297 {:add, :y, 6},
298 {:mul, :y, :x},
299 {:add, :z, :y},
300 {:inp, :w},
301 {:mul, :x, 0},
302 {:add, :x, :z},
303 {:mod, :x, 26},
304 {:div, :z, 26},
305 {:add, :x, -11},
306 {:eql, :x, :w},
307 {:eql, :x, 0},
308 {:mul, :y, 0},
309 {:add, :y, 25},
310 {:mul, :y, :x},
311 {:add, :y, 1},
312 {:mul, :z, :y},
313 {:mul, :y, 0},
314 {:add, :y, :w},
315 {:add, :y, 15},
316 {:mul, :y, :x},
317 {:add, :z, :y}
318]
319```
320
321<!-- livebook:{"output":true} -->
322
323```
324252
325```
326
327```elixir
32844..52 |> Enum.map(&rem(&1, 26))
329```
330
331<!-- livebook:{"output":true} -->
332
333```
334[18, 19, 20, 21, 22, 23, 24, 25, 0]
335```
336
337```elixir
338IO.inspect(Day24.evaluate(input, 11_111_111_111_161))
339```
340
341<!-- livebook:{"output":true} -->
342
343```
344%{w: 1, x: 1, y: 16, z: 207697766}
345```
346
347<!-- livebook:{"output":true} -->
348
349```
350%{w: 1, x: 1, y: 16, z: 207697766}
351```