-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathsol_02.aes
55 lines (47 loc) · 1.81 KB
/
sol_02.aes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
@compiler >= 4.2.0
include "List.aes"
contract Day2 =
entrypoint solve_1() =
run(0, setup_and_init_mem(12, 2))
entrypoint solve_2() =
let mem = setup_mem(0, input(), {})
let range = [0..99]
let vals = [ (x, y) | x <- range, y <- range ]
solve_2'(mem, vals)
function
solve_2' : (map(int, int), list(int * int)) => int
solve_2'(mem, (n, v) :: vals) =
let res = run(0, init_mem(n, v, mem))
if(res == 19690720) 100 * n + v
else solve_2'(mem, vals)
entrypoint run(pc : int, m : map(int, int)) =
switch(m[pc])
99 => m[0]
1 =>
let x = m[pc + 1]
let y = m[pc + 2]
let z = m[pc + 3]
run(pc + 4, m{[z] = m[x] + m[y]})
2 =>
let x = m[pc + 1]
let y = m[pc + 2]
let z = m[pc + 3]
run(pc + 4, m{[z] = m[x] * m[y]})
function setup_and_init_mem(noun : int, verb : int) =
let mem = setup_mem(0, input(), {})
init_mem(noun, verb, mem)
function
setup_mem : (int, list(int), map(int, int)) => map(int, int)
setup_mem(_, [], m) = m
setup_mem(ix, x :: xs, m) = setup_mem(ix + 1, xs, m{[ix] = x})
function init_mem(noun : int, verb : int, mem : map(int, int)) =
mem{ [1] = noun, [2] = verb }
function input() =
[1, 0, 0, 3, 1, 1, 2, 3, 1, 3, 4, 3, 1, 5, 0, 3, 2, 10, 1, 19, 1, 6, 19,
23, 2, 23, 6, 27, 1, 5, 27, 31, 1, 31, 9, 35, 2, 10, 35, 39, 1, 5, 39,
43, 2, 43, 10, 47, 1, 47, 6, 51, 2, 51, 6, 55, 2, 55, 13, 59, 2, 6, 59,
63, 1, 63, 5, 67, 1, 6, 67, 71, 2, 71, 9, 75, 1, 6, 75, 79, 2, 13, 79,
83, 1, 9, 83, 87, 1, 87, 13, 91, 2, 91, 10, 95, 1, 6, 95, 99, 1, 99, 13,
103, 1, 13, 103, 107, 2, 107, 10, 111, 1, 9, 111, 115, 1, 115, 10, 119,
1, 5, 119, 123, 1, 6, 123, 127, 1, 10, 127, 131, 1, 2, 131, 135, 1, 135,
10, 0, 99, 2, 14, 0, 0]