1 divert(-1)dnl -*- m4 -*-
2 # Usage: m4 [-Dfile=day10.input] day10.m4
4 include(`common.m4')ifelse(common(10), `ok', `',
5 `errprint(`Missing common initialization
8 define(`goes', `eat')define(`gives', `eat')define(`and', `eat')
9 pushdef(`output', `out')define(`eat', `Eat(')define(`to', `)')define(`Eat')
10 define(`list', translit(include(defn(`file')), nl, `;'))
12 define(`givebot', `define(`b$1', ifdef(`b$1', `defn(`b$1')`,'')`$2')')
13 define(`giveout', `define(`o$1', `$2')ifelse(eval($1 > max), 1,
14 `define(`max', $1)')')
15 define(`line', `_$0(translit(`$1', ` ', `,'))')
16 define(`_line', `ifelse(`$1', `value', `give$4($5, $2)', `give$4($5,
17 `lo($2)')give$7($8, `hi($2)')')')
19 patsubst(defn(`list'), `\([^;]*\);', `line(`\1')')
21 define(`chew', `line(substr(`$1', 0, index(`$1', `;')))define(`tail',
22 substr(`$1', incr(index(`$1', `;'))))ifelse(index(defn(`tail'), `;'), -1,
23 `', `$0(defn(`tail'))')')
24 define(`split', `ifelse(eval($1 < 70), 1, `chew(`$2')', `$0(eval($1/2),
25 substr(`$2', 0, eval($1/2)))$0(eval(len(defn(`tail')) + $1 - $1/2),
26 defn(`tail')substr(`$2', eval($1/2)))')')
27 split(len(defn(`list')), defn(`list'))
29 define(`lo', `ifdef(`l$1', `', `define(`l$1', _$0(b$1, $1))')l$1')
30 define(`_lo', `ifelse(index(.17.61.17., .$1.$2.), -1, `', `define(`part1',
31 $3)')ifelse(eval($1 < $2), 1, $1, $2)')
32 define(`hi', `ifdef(`h$1', `', `define(`h$1', _$0(b$1, $1))')h$1')
33 define(`_hi', `ifelse(eval($1 > $2), 1, $1, $2)')
35 forloop_arg(0, max, `o')
36 define(`part2', eval(o(0) * o(1) * o(2)))