day 25 optimize and improve heuristics
[aoc_eblake.git] / 2019 / day17.m4
blob07a4c607579df550dd9bddac1d2555a8d8df009e
1 divert(-1)dnl -*- m4 -*-
2 # Usage: m4 [-Dfile=day17.input] day17.m4
4 include(`intcode.m4')ifelse(intcode(17), `ok', `',
5 `errprint(`Missing IntCode initialization
6 ')m4exit(1)')
8 parse(input)
9 define(`g', `ifelse($1, -1, 0, $2, -1, 0, `ifdef(`g_$1_$2', 1, 0)')')
10 define(`write', `ifelse(process($1), 1, `define(`g_'x`_'y)')define(`x',
11   incr(x))')
12 define(`process', `ifdef(`process$1', `process$1()', `oops()')')
13 define(`process10', `ifelse(x, 0, `define(`x', -1)',
14   `define(`y', incr(y))define(`x', -1)')0') # \n
15 define(`process46', 0) # .
16 define(`process94', `define(`d', `U,' x`,' y)1') # ^
17 define(`process62', `define(`d', `R,' x`,' y)1') # >
18 define(`process118', `define(`d', `D,' x`,' y)1') # v
19 define(`process60', `define(`d', `L,' x`,' y)1') # <
20 define(`process35', `ifelse(eval(x > 1 && y), 1, `check(decr(x), y)')1') # #
21 define(`check', `ifelse(g($1, $2)g(decr($1), $2)g($1, decr($2)), 111,
22   `define(`part1', eval(part1 + $1 * $2))')')
24 save()
25 define(`part1', 0)
26 define(`x', 0)
27 define(`y', 0)
28 run(0)
29 restore()
31 define(`turn', `$0$1($2, $3)')
32 define(`_turn', `ifelse($1, 10, ``L,'walk($2)', $1, 01, ``R,'walk($3)')')
33 define(`turnU', `_turn(g(decr($1), $2)g(incr($1), $2), `L,$@', `R,$@')')
34 define(`turnR', `_turn(g($1, decr($2))g($1, incr($2)), `U,$@', `D,$@')')
35 define(`turnD', `_turn(g(incr($1), $2)g(decr($1), $2), `R,$@', `L,$@')')
36 define(`turnL', `_turn(g($1, incr($2))g($1, decr($2)), `D,$@', `U,$@')')
37 define(`walk', `$0$1($2, $3, 0)')
38 define(`_walk', `ifelse(g($2, $3), 1, `walk$1($2, $3, incr($6))',
39   ``$6,'turn($1, $4, $5)')')
40 define(`walkU', `_walk(U, $1, decr($2), $@)')
41 define(`walkR', `_walk(R, incr($1), $2, $@)')
42 define(`walkD', `_walk(D, $1, incr($2), $@)')
43 define(`walkL', `_walk(L, decr($1), $2, $@)')
44 define(`path', turn(d))
46 define(`tuple', `oops()')
47 forloop_var(`a', 2, 5, `forloop_var(`b', 2, 5, `forloop_var(`c', 2, 5,
48   `oneshot(`tuple', ``A_','a`,`B_','b`,`C_','c)')')')
49 define(`compress', `ifelse(_$0(defn(`path'), tuple), `', `', `$0()')')
50 define(`_compress', `ifelse($#, 2, ``$1'', `$0(set(`$1', `$2', $3),
51   shift(shift(shift($@))))')')
52 define(`set', `define(`$2', quote(pair$3($1)))ifelse(eval(len(defn(`$2'))
53   <= 20), 1, `replace(`$1', defn(`$2'))', ``$1'')')
54 define(`pair2', `$1,$2,$3,$4,')
55 define(`pair3', `$1,$2,pair2(shift(shift($@)))')
56 define(`pair4', `$1,$2,pair3(shift(shift($@)))')
57 define(`pair5', `$1,$2,pair4(shift(shift($@)))')
58 define(`replace', `_$0(index(`$1', `$2'), $@)')
59 define(`_replace', `ifelse($1, -1, ``$2'', `replace(quote(substr(`$2', 0,
60   $1)`$4'substr(`$2', eval($1 + len(`$3')))), `$3', `$4')')')
62 define(`prepread', `ifelse($#, 2, `_$0(10)',
63   `$0(shift($@))_$0(44)')ifdef(`$0$1', `$0$1()', `oops()')')
64 define(`_prepread', `oneshot(`read', `$1')')
65 define(`prepreadA', `_prepread(65)')
66 define(`prepreadB', `_prepread(66)')
67 define(`prepreadC', `_prepread(67)')
68 define(`prepreadL', `_prepread(76)')
69 define(`prepreadR', `_prepread(82)')
70 define(`prepreadn', `_prepread(110)')
71 define(`prepready', `_prepread(121)')
72 define(`prepread4', `_prepread(52)')
73 define(`prepread6', `_prepread(54)')
74 define(`prepread8', `_prepread(56)')
75 define(`prepread10', `_prepread(48)_prepread(49)')
76 define(`prepread12', `_prepread(50)_prepread(49)')
78 # Compute the path compression, then prep read in LIFO order
79 compress()
80 define(`M_', replace(replace(replace(defn(`path'), defn(`A_'), `A,'),
81   defn(`B_'), `B,'), defn(`C_'), `C,'))
82 prepread(n,)
83 prepread(C_)
84 prepread(B_)
85 prepread(A_)
86 prepread(M_)
87 define(`write', `define(`data', $1)')
88 define(`mem0', 2)
89 run(0)
90 define(`part2', data)
92 divert`'part1
93 part2