this repo has no description
at master 13 kB view raw
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```