day 25 optimize and improve heuristics
[aoc_eblake.git] / 2019 / day21.m4
blob1861ea361ef0bccb9288565ddc7c38edb0f94da4
1 divert(-1)dnl -*- m4 -*-
2 # Usage: m4 [-Dfile=day21.input] day21.m4
3 # Optionally use -Dverbose=[12] to see some progress
5 include(`intcode.m4')ifelse(intcode(21), `ok', `',
6 `errprint(`Missing IntCode initialization
7 ')m4exit(1)')
9 ifelse(verbose, 0, `', `ifdef(`__gnu__', `',
10   `errprintn(`verbose mode requires GNU m4')m4exit(1)')')
12 parse(input)
13 define(`write', `ifelse(verbose, 0, `', eval($1 < 128 && $1 != 96), 1,
14   `_$0(format(``%c'',$1))')define(`data', $1)')
15 define(`_write', `divert`$1'divert(-1)')
17 define(`prepread', `ifelse($#, 1, `_$0(10)',
18   `$0(shift($@))_$0(32)')ifdef(`$0$1', `$0$1()', `oops()')')
19 define(`_prepread', `oneshot(`read', `$1')')
20 define(`prepreadAND', `_prepread(68)_prepread(78)_prepread(65)')
21 define(`prepreadOR', `_prepread(82)_prepread(79)')
22 define(`prepreadNOT', `_prepread(84)_prepread(79)_prepread(78)')
23 define(`prepreadRUN', `_prepread(78)_prepread(85)_prepread(82)')
24 define(`prepreadWALK', `_prepread(75)_prepread(76)_prepread(65)_prepread(87)')
25 define(`prepreadA', `_prepread(65)')
26 define(`prepreadB', `_prepread(66)')
27 define(`prepreadC', `_prepread(67)')
28 define(`prepreadD', `_prepread(68)')
29 define(`prepreadE', `_prepread(69)')
30 define(`prepreadF', `_prepread(70)')
31 define(`prepreadG', `_prepread(71)')
32 define(`prepreadH', `_prepread(72)')
33 define(`prepreadI', `_prepread(73)')
34 define(`prepreadJ', `_prepread(74)')
35 define(`prepreadT', `_prepread(84)')
36 define(`loop', `ifdef(`script', `prepread(script)popdef(`script')loop()')')
38 pushdef(`script', `NOT, C, J')
39 pushdef(`script', `AND, D, J')
40 pushdef(`script', `NOT, A, T')
41 pushdef(`script', `OR, T, J')
42 pushdef(`script', `WALK')
43 loop()
45 save()
46 run(0)
47 define(`part1', data)
48 restore()
50 pushdef(`script', `NOT, H, J')
51 pushdef(`script', `OR, C, J')
52 pushdef(`script', `AND, A, J')
53 pushdef(`script', `AND, B, J')
54 pushdef(`script', `NOT, J, J')
55 pushdef(`script', `AND, D, J')
56 pushdef(`script', `RUN')
57 loop()
59 run(0)
60 define(`part2', data)
62 divert`'part1
63 part2