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
9 ifelse(verbose, 0, `', `ifdef(`__gnu__', `',
10 `errprintn(`verbose mode requires GNU m4')m4exit(1)')')
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')
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')