-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathsol_19.aes
64 lines (57 loc) · 3.15 KB
/
sol_19.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
56
57
58
59
60
61
62
63
@compiler >= 4.2.0
include "/Users/hans/Personal/Repos/AoC2019/11/Intcode.aes"
contract Day19 =
stateful entrypoint solve_1() =
let p0 = Intcode.init_proc(input(), [])
calc_pts(50, p0)
stateful entrypoint solve_2() =
let p0 = Intcode.init_proc(input(), [])
// Start at a reasonable place (below the beam)
trace_beam(1000, 1000, p0, 100)
stateful function calc_pts(max : int, p : Intcode.process) =
calc_pts'(0, 0, max, p, 0)
stateful function calc_pts'(x : int, y : int, max : int, p : Intcode.process, n : int) =
if(x == max) calc_pts'(0, y + 1, max, p, n)
elif(y == max) n
else
let n = if(in_beam(x, y, p)) n + 1 else n
calc_pts'(x + 1, y, max, p, n)
function trace_beam(x : int, y : int, p : Intcode.process, s : int) =
switch(in_beam(x, y, p))
true =>
let s' = s - 1
switch(in_beam(x + s', y - s', p))
true => (x, y - s', x * 10000 + (y - s'))
false => trace_beam(x, y + 1, p, s)
false =>
trace_beam(x + 1, y, p, s)
function in_beam(x : int, y : int, p : Intcode.process) =
let p' = Intcode.run_proc_step(p{ input = [x, y] })
[1] == p'.output
function input() =
[109, 424, 203, 1, 21102, 11, 1, 0, 1105, 1, 282, 21102, 1, 18, 0, 1105, 1,
259, 1201, 1, 0, 221, 203, 1, 21101, 0, 31, 0, 1105, 1, 282, 21102, 38, 1,
0, 1106, 0, 259, 21001, 23, 0, 2, 22101, 0, 1, 3, 21101, 0, 1, 1, 21102,
1, 57, 0, 1105, 1, 303, 2101, 0, 1, 222, 21001, 221, 0, 3, 20102, 1, 221,
2, 21102, 259, 1, 1, 21101, 80, 0, 0, 1106, 0, 225, 21101, 0, 111, 2,
21102, 1, 91, 0, 1105, 1, 303, 2102, 1, 1, 223, 20101, 0, 222, 4, 21102,
1, 259, 3, 21102, 1, 225, 2, 21102, 1, 225, 1, 21101, 0, 118, 0, 1105, 1,
225, 20101, 0, 222, 3, 21102, 148, 1, 2, 21102, 1, 133, 0, 1106, 0, 303,
21202, 1, -1, 1, 22001, 223, 1, 1, 21102, 148, 1, 0, 1106, 0, 259, 2101,
0, 1, 223, 20102, 1, 221, 4, 21001, 222, 0, 3, 21101, 0, 17, 2, 1001, 132,
-2, 224, 1002, 224, 2, 224, 1001, 224, 3, 224, 1002, 132, -1, 132, 1, 224,
132, 224, 21001, 224, 1, 1, 21101, 0, 195, 0, 106, 0, 109, 20207, 1, 223,
2, 20102, 1, 23, 1, 21102, -1, 1, 3, 21101, 0, 214, 0, 1105, 1, 303,
22101, 1, 1, 1, 204, 1, 99, 0, 0, 0, 0, 109, 5, 2102, 1, -4, 249, 22101,
0, -3, 1, 21202, -2, 1, 2, 21202, -1, 1, 3, 21102, 1, 250, 0, 1105, 1,
225, 22102, 1, 1, -4, 109, -5, 2106, 0, 0, 109, 3, 22107, 0, -2, -1,
21202, -1, 2, -1, 21201, -1, -1, -1, 22202, -1, -2, -2, 109, -3, 2105, 1,
0, 109, 3, 21207, -2, 0, -1, 1206, -1, 294, 104, 0, 99, 22102, 1, -2, -2,
109, -3, 2106, 0, 0, 109, 5, 22207, -3, -4, -1, 1206, -1, 346, 22201, -4,
-3, -4, 21202, -3, -1, -1, 22201, -4, -1, 2, 21202, 2, -1, -1, 22201, -4,
-1, 1, 21202, -2, 1, 3, 21101, 0, 343, 0, 1105, 1, 303, 1105, 1, 415,
22207, -2, -3, -1, 1206, -1, 387, 22201, -3, -2, -3, 21202, -2, -1, -1,
22201, -3, -1, 3, 21202, 3, -1, -1, 22201, -3, -1, 2, 21201, -4, 0, 1,
21102, 384, 1, 0, 1106, 0, 303, 1105, 1, 415, 21202, -4, -1, -4, 22201,
-4, -3, -4, 22202, -3, -2, -2, 22202, -2, -4, -4, 22202, -3, -2, -3,
21202, -4, -1, -2, 22201, -3, -2, 1, 21202, 1, 1, -4, 109, -5, 2106, 0, 0]