day 25 optimize and improve heuristics
[aoc_eblake.git] / 2019 / day15.m4
blob2c30b20769b0768004e114e4d693708394bd864b
1 divert(-1)dnl -*- m4 -*-
2 # Usage: m4 [-Dfile=day15.input] day15.m4
4 include(`intcode.m4')ifelse(intcode(15), `ok', `',
5 `errprint(`Missing IntCode initialization
6 ')m4exit(1)')
8 parse(input)
9 define(`try', `try_$1()')
10 define(`try_n', 1)
11 define(`try_s', 2)
12 define(`try_w', 3)
13 define(`try_e', 4)
14 define(`right', `define(`dir', right_$1())')
15 define(`right_n', `e')
16 define(`right_e', `s')
17 define(`right_s', `w')
18 define(`right_w', `n')
19 define(`left', `define(`dir', left_$1())')
20 define(`left_n', `w')
21 define(`left_w', `s')
22 define(`left_s', `e')
23 define(`left_e', `n')
24 define(`move', `_move($1, incr(g($1, x, y))move_$2(), x, y)')
25 define(`_move', `ifdef(`g$1_$3_$4', `', `define(`g$1_$3_$4',
26   $2)ifelse(eval($2 > part$1), 1, `define(`part$1', $2)')')')
27 define(`move_n', `define(`y', decr(y))')
28 define(`move_e', `define(`x', incr(x))')
29 define(`move_s', `define(`y', incr(y))')
30 define(`move_w', `define(`x', decr(x))')
31 define(`g', `ifdef(`g$1_$2_$3', `g$1_$2_$3')')
33 define(`read', `try(dir)')
34 define(`write', `ifelse($1, 2, `oneshot(`loop')')define(`data', $1)')
35 define(`loop', `
36   oneshot(`io', defn(`pause_after_write'))
37   oneshot(`io', defn(`run_after_read'))
38   run()
39   ifelse(data, 0, `right(dir)',
40   `move($1, dir)ifelse(eval(x & y & 1), 1, `left(dir)')')
41   loop($1)')
43 define(`x', 25)
44 define(`y', 25)
45 define(`dir', `n')
46 define(`g1_'x`_'y, 0)
47 define(`part1', 0)
48 loop(1)
49 define(`part1', g(1, x, y))
51 define(`g2_'x`_'y, 0)
52 define(`part2', 0)
53 loop(2)
55 divert`'part1
56 part2