Day 21 - decompiled.
This commit is contained in:
parent
d2924d7265
commit
0657d17578
|
@ -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 | |
|
||||||
|
|
|
@ -30,4 +30,4 @@ import qualified Day24
|
||||||
import qualified Day25
|
import qualified Day25
|
||||||
|
|
||||||
main :: IO ()
|
main :: IO ()
|
||||||
main = Day20.main
|
main = Day21.main
|
||||||
|
|
|
@ -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
|
|
@ -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 }
|
28
src/Day21.hs
28
src/Day21.hs
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue