day 21 preliminary refactoring
[aoc_eblake.git] / 2020 / day21.m4
blob64b8ac912ab4f7fcb56e117f9cc9e8c3ceb4abdf
1 divert(-1)dnl -*- m4 -*-
2 # Usage: m4 [-Dfile=day21.input] day21.m4
4 include(`common.m4')ifelse(common(21), `ok', `',
5 `errprint(`Missing common initialization
6 ')m4exit(1)')
8 define(`n_', 0)
9 define(`lexlt', `_$0(substr(`$1', 0, 1), substr(`$2', 0, 1), substr(`$1', 1),
10   substr(`$2', 1))')
11 define(`_lexlt', `ifelse(`$1', `$2', `lexlt(`$3', `$4')', `eval(index(-'alpha`,
12   `$1') < index(-'alpha`, `$2'))')')
13 define(`sort', `ifelse(`$2', `', ``,$1'', `ifelse(lexlt(`$1', `$2'), 1,
14   ``,$@'', ``,$2'sort(`$1', shift(shift($@)))')')')
15 define(`row', `_row(translit(`$1', ` ()', `,'))define(`n_', incr(n_))')
16 define(`_row', `ifelse(`$1', `', `', `pushdef(`r'n_`_i', `$1')$0(shift($@))')')
17 define(`contains', `_$0('))
18 define(`_contains', `foreach(`allergen', $@)))row(')
19 define(`allergens')
20 define(`allergen', `ifdef(`a_$1', `', `define(`allergens',
21   sort(`$1'allergens))')pushdef(`a_$1', n_)')
22 row(include(defn(`file')))define(`n_', decr(n_))
24 define(`whiledef', `ifdef(`$1', `$2`'popdef(`$1')$0($@)')')
25 define(`settle', `ifdef(`e_$1', `', `define(`cnt', 0)_stack_foreach(`a_$1',
26   `_$0(', `)', `t2')ifelse(whiledef(`set', `ifelse('cnt`, defn(`s_'set),
27   `ifdef(`match', `-', `define(`match', set)')')undefine(`s_'set)'), `',
28   `define(`e_$1', match)define(`e_'match, `$1')', `define(`done',
29   0)')undefine(`match')')')
30 define(`_settle', `define(`cnt', incr(cnt))_stack_foreach(`r$1_i',
31   `bump(', `)', `t3')')
32 define(`bump', `ifdef(`e_$1', `', `ifdef(`s_$1', `define(`s_$1', incr(s_$1))',
33   `pushdef(`set', `$1')define(`s_$1', 1)')')')
34 define(`do', `define(`done', 1)
35 foreach(`settle', shift(allergens))
36 ifelse(done, 0, `$0()')')do()
37 define(`part1', 0)
38 define(`count', `stack_foreach(`r$1_i', `_$0')')
39 define(`_count', `ifdef(`e_$1', `', `define(`part1', incr(part1))')')
40 forloop_arg(0, n_ - 1, `count')
41 define(`part2', quote(shift(_foreach(`,defn(`e_'', `)', allergens))))
43 divert`'part1
44 part2