day 15 avoid macro collisions
[aoc_eblake.git] / 2015 / day17.m4
blob9a1d13e7ba79c2cbb0d7ea5ef0ca023077a6f591
1 divert(-1)dnl -*- m4 -*-
2 # Usage: m4 [-Dsum=N] [-Dfile=day17.input] [-Dhashsize=H] day17.m4
3 # Optionally use -Dverbose=1 to see some progress
5 include(`common.m4')ifelse(common(17, 65537), `ok', `',
6 `errprint(`Missing common initialization
7 ')m4exit(1)')
9 ifdef(`sum', `', `define(`sum', 150)')
10 define(`part1', 0)
11 define(`sort', `ifelse(`$2', `', ``,$1'', `ifelse(eval($1 < $2), 1,
12   ``,$@'', ``,$2'$0(`$1', shift(shift($@)))')')')
13 define(`prep', `ifelse(`$2', `', `store(0$1)', `$0(sort($2$1),
14   shift(shift($@)))')')
15 define(`store', `ifelse(`$2', `', `define(`n', $1)', `define(`c$1',
16   $2)$0(incr($1), shift(shift($@)))')')
17 prep(`', translit(include(defn(`file')), nl, `,'))
18 define(`cnt', 0)
19 define(`bump', `ifelse(eval(cnt % 100), 0, `output(1, ...cnt)')define(`cnt',
20   incr(cnt))')
22 define(`body1', `_$0(eval($1 + c$2), $2)')
23 define(`_body1', `ifelse(eval(0 < $1 - sum), 0, `ifdef(`l$1', `define(
24   `l$1', defn(`l$1')`,$2')', `define(`l$1', $2)pushdef(`l', $1)')')')
25 define(`body0', `_foreach(`body1(', `, $1)',
26   _stack_foreach(`l', `,', `', `t'))')
27 define(`recur', `ifdef(`r$1_$2', `', `define(`r$1_$2', _foreach(`_$0(',
28   `, $@)', `', l$1))bump()')r$1_$2`'')
29 define(`_recur', `ifelse($1, -1, ``, `''', eval($3 <= $1), 0,
30   `_foreach(`body2(c$1, ', `)', recur(eval($2 - c$1), $1))')')
31 define(`body2', ``, `$2,$1''')
33 define(`part1', 0)define(`best', n)
34 define(`check', `define(`part1', incr(part1))ifelse(eval(`$# < 'best), 1,
35   `define(`best', `$#')define(`part2', 1)', `$#', best, `define(`part2',
36   incr(part2))')')
37 output(1, `prepping to find groups adding to 'sum)
38 define(`l0', -1)pushdef(`l', 0)
39 forloop_arg(0, decr(n), `body0')
40 output(1, `collecting groups')
41 _foreach(`check(first(', `))', recur(sum, n))
43 divert`'part1
44 part2