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, to_digits(input), %{w: 0, x: 0, y: 0, z: 0})
23
24 defp evaluate([], _, regs), do: regs
25
26 defp evaluate([{:inp, reg} | rest], [v | input], regs),
27 do: evaluate(rest, input, %{regs | reg => v})
28
29 defp evaluate([{:eql, reg, v} | rest], input, regs) do
30 val = if get(reg, regs) == get(v, regs), do: 1, else: 0
31
32 evaluate(rest, input, %{regs | reg => val})
33 end
34
35 defp evaluate([{:add, reg, v} | rest], input, regs),
36 do: evaluate(rest, input, %{regs | reg => get(reg, regs) + get(v, regs)})
37
38 defp evaluate([{:mul, reg, v} | rest], input, regs),
39 do: evaluate(rest, input, %{regs | reg => get(reg, regs) * get(v, regs)})
40
41 defp evaluate([{:div, reg, v} | rest], input, regs),
42 do: evaluate(rest, input, %{regs | reg => div(get(reg, regs), get(v, regs))})
43
44 defp evaluate([{:mod, reg, v} | rest], input, regs),
45 do: evaluate(rest, input, %{regs | reg => rem(get(reg, regs), get(v, regs))})
46
47 defp get(imm, _regs) when is_integer(imm), do: imm
48 defp get(reg, regs) when is_atom(reg), do: Map.get(regs, reg, 0)
49
50 defp to_digits(int) when is_integer(int), do: Integer.digits(int)
51 defp to_digits(digits) when is_list(digits), do: digits
52end
53
54input =
55 File.stream!("#{__DIR__}/day24.txt")
56 |> Stream.map(&String.trim/1)
57 |> Enum.map(&Day24.parse/1)
58 |> IO.inspect(limit: :infinity)
59
60length(input)
61```
62
63<!-- livebook:{"output":true} -->
64
65```
66[
67 {:inp, :w},
68 {:mul, :x, 0},
69 {:add, :x, :z},
70 {:mod, :x, 26},
71 {:div, :z, 1},
72 {:add, :x, 11},
73 {:eql, :x, :w},
74 {:eql, :x, 0},
75 {:mul, :y, 0},
76 {:add, :y, 25},
77 {:mul, :y, :x},
78 {:add, :y, 1},
79 {:mul, :z, :y},
80 {:mul, :y, 0},
81 {:add, :y, :w},
82 {:add, :y, 16},
83 {:mul, :y, :x},
84 {:add, :z, :y},
85 {:inp, :w},
86 {:mul, :x, 0},
87 {:add, :x, :z},
88 {:mod, :x, 26},
89 {:div, :z, 1},
90 {:add, :x, 12},
91 {:eql, :x, :w},
92 {:eql, :x, 0},
93 {:mul, :y, 0},
94 {:add, :y, 25},
95 {:mul, :y, :x},
96 {:add, :y, 1},
97 {:mul, :z, :y},
98 {:mul, :y, 0},
99 {:add, :y, :w},
100 {:add, :y, 11},
101 {:mul, :y, :x},
102 {:add, :z, :y},
103 {:inp, :w},
104 {:mul, :x, 0},
105 {:add, :x, :z},
106 {:mod, :x, 26},
107 {:div, :z, 1},
108 {:add, :x, 13},
109 {:eql, :x, :w},
110 {:eql, :x, 0},
111 {:mul, :y, 0},
112 {:add, :y, 25},
113 {:mul, :y, :x},
114 {:add, :y, 1},
115 {:mul, :z, :y},
116 {:mul, :y, 0},
117 {:add, :y, :w},
118 {:add, :y, 12},
119 {:mul, :y, :x},
120 {:add, :z, :y},
121 {:inp, :w},
122 {:mul, :x, 0},
123 {:add, :x, :z},
124 {:mod, :x, 26},
125 {:div, :z, 26},
126 {:add, :x, -5},
127 {:eql, :x, :w},
128 {:eql, :x, 0},
129 {:mul, :y, 0},
130 {:add, :y, 25},
131 {:mul, :y, :x},
132 {:add, :y, 1},
133 {:mul, :z, :y},
134 {:mul, :y, 0},
135 {:add, :y, :w},
136 {:add, :y, 12},
137 {:mul, :y, :x},
138 {:add, :z, :y},
139 {:inp, :w},
140 {:mul, :x, 0},
141 {:add, :x, :z},
142 {:mod, :x, 26},
143 {:div, :z, 26},
144 {:add, :x, -3},
145 {:eql, :x, :w},
146 {:eql, :x, 0},
147 {:mul, :y, 0},
148 {:add, :y, 25},
149 {:mul, :y, :x},
150 {:add, :y, 1},
151 {:mul, :z, :y},
152 {:mul, :y, 0},
153 {:add, :y, :w},
154 {:add, :y, 12},
155 {:mul, :y, :x},
156 {:add, :z, :y},
157 {:inp, :w},
158 {:mul, :x, 0},
159 {:add, :x, :z},
160 {:mod, :x, 26},
161 {:div, :z, 1},
162 {:add, :x, 14},
163 {:eql, :x, :w},
164 {:eql, :x, 0},
165 {:mul, :y, 0},
166 {:add, :y, 25},
167 {:mul, :y, :x},
168 {:add, :y, 1},
169 {:mul, :z, :y},
170 {:mul, :y, 0},
171 {:add, :y, :w},
172 {:add, :y, 2},
173 {:mul, :y, :x},
174 {:add, :z, :y},
175 {:inp, :w},
176 {:mul, :x, 0},
177 {:add, :x, :z},
178 {:mod, :x, 26},
179 {:div, :z, 1},
180 {:add, :x, 15},
181 {:eql, :x, :w},
182 {:eql, :x, 0},
183 {:mul, :y, 0},
184 {:add, :y, 25},
185 {:mul, :y, :x},
186 {:add, :y, 1},
187 {:mul, :z, :y},
188 {:mul, :y, 0},
189 {:add, :y, :w},
190 {:add, :y, 11},
191 {:mul, :y, :x},
192 {:add, :z, :y},
193 {:inp, :w},
194 {:mul, :x, 0},
195 {:add, :x, :z},
196 {:mod, :x, 26},
197 {:div, :z, 26},
198 {:add, :x, -16},
199 {:eql, :x, :w},
200 {:eql, :x, 0},
201 {:mul, :y, 0},
202 {:add, :y, 25},
203 {:mul, :y, :x},
204 {:add, :y, 1},
205 {:mul, :z, :y},
206 {:mul, :y, 0},
207 {:add, :y, :w},
208 {:add, :y, 4},
209 {:mul, :y, :x},
210 {:add, :z, :y},
211 {:inp, :w},
212 {:mul, :x, 0},
213 {:add, :x, :z},
214 {:mod, :x, 26},
215 {:div, :z, 1},
216 {:add, :x, 14},
217 {:eql, :x, :w},
218 {:eql, :x, 0},
219 {:mul, :y, 0},
220 {:add, :y, 25},
221 {:mul, :y, :x},
222 {:add, :y, 1},
223 {:mul, :z, :y},
224 {:mul, :y, 0},
225 {:add, :y, :w},
226 {:add, :y, 12},
227 {:mul, :y, :x},
228 {:add, :z, :y},
229 {:inp, :w},
230 {:mul, :x, 0},
231 {:add, :x, :z},
232 {:mod, :x, 26},
233 {:div, :z, 1},
234 {:add, :x, 15},
235 {:eql, :x, :w},
236 {:eql, :x, 0},
237 {:mul, :y, 0},
238 {:add, :y, 25},
239 {:mul, :y, :x},
240 {:add, :y, 1},
241 {:mul, :z, :y},
242 {:mul, :y, 0},
243 {:add, :y, :w},
244 {:add, :y, 9},
245 {:mul, :y, :x},
246 {:add, :z, :y},
247 {:inp, :w},
248 {:mul, :x, 0},
249 {:add, :x, :z},
250 {:mod, :x, 26},
251 {:div, :z, 26},
252 {:add, :x, -7},
253 {:eql, :x, :w},
254 {:eql, :x, 0},
255 {:mul, :y, 0},
256 {:add, :y, 25},
257 {:mul, :y, :x},
258 {:add, :y, 1},
259 {:mul, :z, :y},
260 {:mul, :y, 0},
261 {:add, :y, :w},
262 {:add, :y, 10},
263 {:mul, :y, :x},
264 {:add, :z, :y},
265 {:inp, :w},
266 {:mul, :x, 0},
267 {:add, :x, :z},
268 {:mod, :x, 26},
269 {:div, :z, 26},
270 {:add, :x, -11},
271 {:eql, :x, :w},
272 {:eql, :x, 0},
273 {:mul, :y, 0},
274 {:add, :y, 25},
275 {:mul, :y, :x},
276 {:add, :y, 1},
277 {:mul, :z, :y},
278 {:mul, :y, 0},
279 {:add, :y, :w},
280 {:add, :y, 11},
281 {:mul, :y, :x},
282 {:add, :z, :y},
283 {:inp, :w},
284 {:mul, :x, 0},
285 {:add, :x, :z},
286 {:mod, :x, 26},
287 {:div, :z, 26},
288 {:add, :x, -6},
289 {:eql, :x, :w},
290 {:eql, :x, 0},
291 {:mul, :y, 0},
292 {:add, :y, 25},
293 {:mul, :y, :x},
294 {:add, :y, 1},
295 {:mul, :z, :y},
296 {:mul, :y, 0},
297 {:add, :y, :w},
298 {:add, :y, 6},
299 {:mul, :y, :x},
300 {:add, :z, :y},
301 {:inp, :w},
302 {:mul, :x, 0},
303 {:add, :x, :z},
304 {:mod, :x, 26},
305 {:div, :z, 26},
306 {:add, :x, -11},
307 {:eql, :x, :w},
308 {:eql, :x, 0},
309 {:mul, :y, 0},
310 {:add, :y, 25},
311 {:mul, :y, :x},
312 {:add, :y, 1},
313 {:mul, :z, :y},
314 {:mul, :y, 0},
315 {:add, :y, :w},
316 {:add, :y, 15},
317 {:mul, :y, :x},
318 {:add, :z, :y}
319]
320```
321
322<!-- livebook:{"output":true} -->
323
324```
325252
326```
327
328```elixir
329digits =
330 Enum.chunk_while(
331 input,
332 [],
333 fn
334 {:inp, _} = inp, [] -> {:cont, [inp]}
335 {:inp, _} = inp, acc -> {:cont, Enum.reverse(acc), [inp]}
336 other, acc -> {:cont, [other | acc]}
337 end,
338 fn acc -> {:cont, Enum.reverse(acc), []} end
339)
340```
341
342<!-- livebook:{"output":true} -->
343
344```
345[
346 [
347 {:inp, :w},
348 {:mul, :x, 0},
349 {:add, :x, :z},
350 {:mod, :x, 26},
351 {:div, :z, 1},
352 {:add, :x, 11},
353 {:eql, :x, :w},
354 {:eql, :x, 0},
355 {:mul, :y, 0},
356 {:add, :y, 25},
357 {:mul, :y, :x},
358 {:add, :y, 1},
359 {:mul, :z, :y},
360 {:mul, :y, 0},
361 {:add, :y, :w},
362 {:add, :y, 16},
363 {:mul, :y, :x},
364 {:add, :z, :y}
365 ],
366 [
367 {:inp, :w},
368 {:mul, :x, 0},
369 {:add, :x, :z},
370 {:mod, :x, 26},
371 {:div, :z, 1},
372 {:add, :x, 12},
373 {:eql, :x, :w},
374 {:eql, :x, 0},
375 {:mul, :y, 0},
376 {:add, :y, 25},
377 {:mul, :y, :x},
378 {:add, :y, 1},
379 {:mul, :z, :y},
380 {:mul, :y, 0},
381 {:add, :y, :w},
382 {:add, :y, 11},
383 {:mul, :y, :x},
384 {:add, :z, :y}
385 ],
386 [
387 {:inp, :w},
388 {:mul, :x, 0},
389 {:add, :x, :z},
390 {:mod, :x, 26},
391 {:div, :z, 1},
392 {:add, :x, 13},
393 {:eql, :x, :w},
394 {:eql, :x, 0},
395 {:mul, :y, 0},
396 {:add, :y, 25},
397 {:mul, :y, :x},
398 {:add, :y, 1},
399 {:mul, :z, :y},
400 {:mul, :y, 0},
401 {:add, :y, :w},
402 {:add, :y, 12},
403 {:mul, :y, :x},
404 {:add, :z, :y}
405 ],
406 [
407 {:inp, :w},
408 {:mul, :x, 0},
409 {:add, :x, :z},
410 {:mod, :x, 26},
411 {:div, :z, 26},
412 {:add, :x, -5},
413 {:eql, :x, :w},
414 {:eql, :x, 0},
415 {:mul, :y, 0},
416 {:add, :y, 25},
417 {:mul, :y, :x},
418 {:add, :y, 1},
419 {:mul, :z, :y},
420 {:mul, :y, 0},
421 {:add, :y, :w},
422 {:add, :y, 12},
423 {:mul, :y, :x},
424 {:add, :z, :y}
425 ],
426 [
427 {:inp, :w},
428 {:mul, :x, 0},
429 {:add, :x, :z},
430 {:mod, :x, 26},
431 {:div, :z, 26},
432 {:add, :x, -3},
433 {:eql, :x, :w},
434 {:eql, :x, 0},
435 {:mul, :y, 0},
436 {:add, :y, 25},
437 {:mul, :y, :x},
438 {:add, :y, 1},
439 {:mul, :z, :y},
440 {:mul, :y, 0},
441 {:add, :y, :w},
442 {:add, :y, 12},
443 {:mul, :y, :x},
444 {:add, :z, :y}
445 ],
446 [
447 {:inp, :w},
448 {:mul, :x, 0},
449 {:add, :x, :z},
450 {:mod, :x, 26},
451 {:div, :z, 1},
452 {:add, :x, 14},
453 {:eql, :x, :w},
454 {:eql, :x, 0},
455 {:mul, :y, 0},
456 {:add, :y, 25},
457 {:mul, :y, :x},
458 {:add, :y, 1},
459 {:mul, :z, :y},
460 {:mul, :y, 0},
461 {:add, :y, :w},
462 {:add, :y, 2},
463 {:mul, :y, :x},
464 {:add, :z, :y}
465 ],
466 [
467 {:inp, :w},
468 {:mul, :x, 0},
469 {:add, :x, :z},
470 {:mod, :x, 26},
471 {:div, :z, 1},
472 {:add, :x, 15},
473 {:eql, :x, :w},
474 {:eql, :x, 0},
475 {:mul, :y, 0},
476 {:add, :y, 25},
477 {:mul, :y, :x},
478 {:add, :y, 1},
479 {:mul, :z, :y},
480 {:mul, :y, 0},
481 {:add, :y, :w},
482 {:add, :y, 11},
483 {:mul, :y, :x},
484 {:add, :z, :y}
485 ],
486 [
487 {:inp, :w},
488 {:mul, :x, 0},
489 {:add, :x, :z},
490 {:mod, :x, 26},
491 {:div, :z, 26},
492 {:add, :x, -16},
493 {:eql, :x, :w},
494 {:eql, :x, 0},
495 {:mul, :y, 0},
496 {:add, :y, 25},
497 {:mul, :y, :x},
498 {:add, :y, 1},
499 {:mul, :z, :y},
500 {:mul, :y, 0},
501 {:add, :y, :w},
502 {:add, :y, 4},
503 {:mul, :y, :x},
504 {:add, :z, :y}
505 ],
506 [
507 {:inp, :w},
508 {:mul, :x, 0},
509 {:add, :x, :z},
510 {:mod, :x, 26},
511 {:div, :z, 1},
512 {:add, :x, 14},
513 {:eql, :x, :w},
514 {:eql, :x, 0},
515 {:mul, :y, 0},
516 {:add, :y, 25},
517 {:mul, :y, :x},
518 {:add, :y, 1},
519 {:mul, :z, :y},
520 {:mul, :y, 0},
521 {:add, :y, :w},
522 {:add, :y, 12},
523 {:mul, :y, :x},
524 {:add, :z, :y}
525 ],
526 [
527 {:inp, :w},
528 {:mul, :x, 0},
529 {:add, :x, :z},
530 {:mod, :x, 26},
531 {:div, :z, 1},
532 {:add, :x, 15},
533 {:eql, :x, :w},
534 {:eql, :x, 0},
535 {:mul, :y, 0},
536 {:add, :y, 25},
537 {:mul, :y, :x},
538 {:add, :y, 1},
539 {:mul, :z, :y},
540 {:mul, :y, 0},
541 {:add, :y, :w},
542 {:add, :y, 9},
543 {:mul, :y, :x},
544 {:add, :z, :y}
545 ],
546 [
547 {:inp, :w},
548 {:mul, :x, 0},
549 {:add, :x, :z},
550 {:mod, :x, 26},
551 {:div, :z, 26},
552 {:add, :x, -7},
553 {:eql, :x, :w},
554 {:eql, :x, 0},
555 {:mul, :y, 0},
556 {:add, :y, 25},
557 {:mul, :y, :x},
558 {:add, :y, 1},
559 {:mul, :z, :y},
560 {:mul, :y, 0},
561 {:add, :y, :w},
562 {:add, :y, 10},
563 {:mul, :y, :x},
564 {:add, :z, :y}
565 ],
566 [
567 {:inp, :w},
568 {:mul, :x, 0},
569 {:add, :x, :z},
570 {:mod, :x, 26},
571 {:div, :z, 26},
572 {:add, :x, -11},
573 {:eql, :x, :w},
574 {:eql, :x, 0},
575 {:mul, :y, 0},
576 {:add, :y, 25},
577 {:mul, :y, :x},
578 {:add, :y, 1},
579 {:mul, :z, :y},
580 {:mul, :y, 0},
581 {:add, :y, :w},
582 {:add, :y, 11},
583 {:mul, :y, :x},
584 {:add, :z, :y}
585 ],
586 [
587 {:inp, :w},
588 {:mul, :x, 0},
589 {:add, :x, :z},
590 {:mod, :x, 26},
591 {:div, :z, 26},
592 {:add, :x, -6},
593 {:eql, :x, :w},
594 {:eql, :x, 0},
595 {:mul, :y, 0},
596 {:add, :y, 25},
597 {:mul, :y, :x},
598 {:add, :y, 1},
599 {:mul, :z, :y},
600 {:mul, :y, 0},
601 {:add, :y, :w},
602 {:add, :y, 6},
603 {:mul, :y, :x},
604 {:add, :z, :y}
605 ],
606 [
607 {:inp, :w},
608 {:mul, :x, 0},
609 {:add, :x, :z},
610 {:mod, :x, 26},
611 {:div, :z, 26},
612 {:add, :x, -11},
613 {:eql, :x, :w},
614 {:eql, :x, 0},
615 {:mul, :y, 0},
616 {:add, :y, 25},
617 {:mul, :y, :x},
618 {:add, :y, 1},
619 {:mul, :z, :y},
620 {:mul, :y, 0},
621 {:add, :y, :w},
622 {:add, :y, 15},
623 {:mul, :y, :x},
624 {:add, :z, :y}
625 ]
626]
627```
628
629```elixir
630List.myers_difference(hd(digits), Enum.at(digits, 4))
631```
632
633<!-- livebook:{"output":true} -->
634
635```
636[
637 eq: [{:inp, :w}, {:mul, :x, 0}, {:add, :x, :z}, {:mod, :x, 26}],
638 del: [{:div, :z, 1}, {:add, :x, 11}],
639 ins: [{:div, :z, 26}, {:add, :x, -3}],
640 eq: [
641 {:eql, :x, :w},
642 {:eql, :x, 0},
643 {:mul, :y, 0},
644 {:add, :y, 25},
645 {:mul, :y, :x},
646 {:add, :y, 1},
647 {:mul, :z, :y},
648 {:mul, :y, 0},
649 {:add, :y, :w}
650 ],
651 del: [{:add, :y, 16}],
652 ins: [{:add, :y, 12}],
653 eq: [{:mul, :y, :x}, {:add, :z, :y}]
654]
655```
656
657```elixir
658params =
659 Enum.map(digits, fn sub ->
660 [5, 15]
661 |> Enum.map(&Enum.at(sub, &1))
662 |> Enum.map(&elem(&1, 2))
663 end)
664```
665
666<!-- livebook:{"output":true} -->
667
668```
669[
670 [11, 16],
671 ~c"\f\v",
672 ~c"\r\f",
673 [-5, 12],
674 [-3, 12],
675 [14, 2],
676 [15, 11],
677 [-16, 4],
678 [14, 12],
679 [15, 9],
680 [-7, 10],
681 [-11, 11],
682 [-6, 6],
683 [-11, 15]
684]
685```
686
687```elixir
688defmodule ALU do
689 def solve(params, range) do
690 params |> solve(0, [], range) |> Enum.reverse() |> Integer.undigits()
691 end
692
693 defp solve([], _z, acc, _range), do: acc
694
695 defp solve([[a, b] | rest], z, acc, range) when a > 0 do
696 Enum.find_value(range, fn w ->
697 solve(rest, 26 * z + w + b, [w | acc], range)
698 end)
699 end
700
701 defp solve([[a, _] | rest], z, acc, range) when a < 0 do
702 value = rem(z, 26) + a
703
704 if value in range do
705 solve(rest, div(z, 26), [value | acc], range)
706 end
707 end
708end
709```
710
711<!-- livebook:{"output":true} -->
712
713```
714{:module, ALU, <<70, 79, 82, 49, 0, 0, 10, ...>>, {:solve, 4}}
715```
716
717## Part 1
718
719```elixir
720ALU.solve(params, 9..1//-1)
721```
722
723<!-- livebook:{"output":true} -->
724
725```
72641299994879959
727```
728
729## Part 2
730
731```elixir
732ALU.solve(params, 1..9)
733```
734
735<!-- livebook:{"output":true} -->
736
737```
73811189561113216
739```