Day 21 - decompiled.

This commit is contained in:
Jonathan Chan 2018-12-21 14:24:24 -08:00
parent d2924d7265
commit 0657d17578
5 changed files with 96 additions and 4 deletions

View File

@ -32,7 +32,7 @@ Now located in this repository's wiki.
| 18 | ~ 6 | | 18 | ~ 6 |
| 19 | ~ 3 | | 19 | ~ 3 |
| 20 | ~ 40 | | 20 | ~ 40 |
| 21 | | | 21 | ~ 1 |
| 22 | | | 22 | |
| 23 | | | 23 | |
| 24 | | | 24 | |

View File

@ -30,4 +30,4 @@ import qualified Day24
import qualified Day25 import qualified Day25
main :: IO () main :: IO ()
main = Day20.main main = Day21.main

32
input/21.txt Normal file
View File

@ -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

36
input/21_notes.txt Normal file
View File

@ -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 }

View File

@ -1,6 +1,30 @@
module Day21 (main) where 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 :: IO ()
main = do main = do
input <- readFile "input/21.txt" print $ part1
print input print $ part2