From 0657d17578c299f9c6cac31eb4c025b7189fcd36 Mon Sep 17 00:00:00 2001 From: Jonathan Chan Date: Fri, 21 Dec 2018 14:24:24 -0800 Subject: [PATCH] Day 21 - decompiled. --- README.md | 2 +- app/Main.hs | 2 +- input/21.txt | 32 ++++++++++++++++++++++++++++++++ input/21_notes.txt | 36 ++++++++++++++++++++++++++++++++++++ src/Day21.hs | 28 ++++++++++++++++++++++++++-- 5 files changed, 96 insertions(+), 4 deletions(-) create mode 100644 input/21.txt create mode 100644 input/21_notes.txt diff --git a/README.md b/README.md index 1aae072..2b866df 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ Now located in this repository's wiki. | 18 | ~ 6 | | 19 | ~ 3 | | 20 | ~ 40 | -| 21 | | +| 21 | ~ 1 | | 22 | | | 23 | | | 24 | | diff --git a/app/Main.hs b/app/Main.hs index a81d67f..4eeb883 100644 --- a/app/Main.hs +++ b/app/Main.hs @@ -30,4 +30,4 @@ import qualified Day24 import qualified Day25 main :: IO () -main = Day20.main +main = Day21.main diff --git a/input/21.txt b/input/21.txt new file mode 100644 index 0000000..3fd660d --- /dev/null +++ b/input/21.txt @@ -0,0 +1,32 @@ +#ip 1 +seti 123 0 3 +bani 3 456 3 +eqri 3 72 3 +addr 3 1 1 +seti 0 0 1 +seti 0 9 3 +bori 3 65536 5 +seti 15028787 4 3 +bani 5 255 2 +addr 3 2 3 +bani 3 16777215 3 +muli 3 65899 3 +bani 3 16777215 3 +gtir 256 5 2 +addr 2 1 1 +addi 1 1 1 +seti 27 3 1 +seti 0 9 2 +addi 2 1 4 +muli 4 256 4 +gtrr 4 5 4 +addr 4 1 1 +addi 1 1 1 +seti 25 1 1 +addi 2 1 2 +seti 17 8 1 +setr 2 4 5 +seti 7 3 1 +eqrr 3 0 2 +addr 2 1 1 +seti 5 3 1 diff --git a/input/21_notes.txt b/input/21_notes.txt new file mode 100644 index 0000000..a12717a --- /dev/null +++ b/input/21_notes.txt @@ -0,0 +1,36 @@ +#ip 1 + +0 1 2 3 4 5 6 +a ip c d e f g + + 0 seti 123 0 3 d = 123 + 1 bani 3 456 3 L1: d = 123 & 456 + 2 eqri 3 72 3 if (123 & 456 != 72) + 3 addr 3 1 1 then + 4 seti 0 0 1 goto L1 int f; int d = 0; + 5 seti 0 9 3 else d = 0 while (true) { + 6 bori 3 65536 5 L0: f = d | 65536 f = d | 65536; + 7 seti 15028787 4 3 d = 15028787 d = 15028787; + 8 bani 5 255 2 L8: c = f & 255 + 9 addr 3 2 3 d += c +10 bani 3 16777215 3 d &= 16777215 +11 muli 3 65899 3 d *= 65899 +12 bani 3 16777215 3 d &= 16777215 d = (d + f & 255) & 16777215 * 65899 & 16777215; +13 gtir 256 5 2 if (256 > f) while (f >= 256) { +14 addr 2 1 1 then goto L2 +15 addi 1 1 1 else goto L3 +16 seti 27 3 1 L2: goto L4 +17 seti 0 9 2 L3: c = 0 +18 addi 2 1 4 L9: e = c + 1 +19 muli 4 256 4 e *= 256 +20 gtrr 4 5 4 if (e > f) +21 addr 4 1 1 then goto L5 +22 addi 1 1 1 else goto L6 +23 seti 25 1 1 L5: goto L7 +24 addi 2 1 2 L6: c += 1 +25 seti 17 8 1 goto L9 +26 setr 2 4 5 L7: f = c f /= 256; +27 seti 7 3 1 goto L8 d = (d + f & 255) & 16777215 * 65899 & 16777215; +28 eqrr 3 0 2 L4: if (a == d) } +29 addr 2 1 1 then return if (a == d) return; +30 seti 5 3 1 goto L0 } \ No newline at end of file diff --git a/src/Day21.hs b/src/Day21.hs index d7a8630..f592a8f 100644 --- a/src/Day21.hs +++ b/src/Day21.hs @@ -1,6 +1,30 @@ module Day21 (main) where +import Data.Bits ((.|.), (.&.), shiftR) +import Data.Set (empty, member, insert) + +loop :: Int -> [Int] +loop d = + let d' = innerLoop (d .|. 0x10000) 15028787 + in d':(loop d') + where + innerLoop f d = + let d' = math f d + f' = shiftR f 8 + in if f < 0x100 then d' else innerLoop f' d' + math f d = (d + f .&. 0xFF) .&. 0xFFFFFF * 65899 .&. 0xFFFFFF + +part1 :: Int +part1 = head $ loop 0 + +part2 :: Int +part2 = + let vals = loop 0 + in prevRepeat (head vals) (tail vals) empty + where + prevRepeat p (v:vals) set = if member v set then p else prevRepeat v vals (insert v set) + main :: IO () main = do - input <- readFile "input/21.txt" - print input \ No newline at end of file + print $ part1 + print $ part2