1 divert(-1)dnl -*- m4 -*-
2 # Usage: m4 [-Dfile=day18.input] day18.m4
4 include(`common.m4')ifelse(common(18), `ok', `',
5 `errprint(`Missing common initialization
10 define(`do', `patsubst(`$1', `\([^;]*\);', `line(`\1')')')
12 define(`_chew', `line(substr(`$1', 0, index(`$1', `;')))define(`tail',
13 substr(`$1', incr(index(`$1', `;'))))ifelse(index(defn(`tail'), `;'), -1,
14 `', `$0(defn(`tail'))')')
15 define(`chew', `ifelse(eval($1 < 380), 1, `_$0(`$2')', `$0(eval($1/2),
16 substr(`$2', 0, eval($1/2)))$0(eval(len(defn(`tail')) + $1 - $1/2),
17 defn(`tail')substr(`$2', eval($1/2)))')')
18 define(`do', `chew(len(`$1'), `$1')')
20 define(`part1', 0)define(`part2', 0)
21 define(`op', `ifelse($2, +, `add64', `mul64')($1, $3)')
22 define(`math', `ifelse(index(`$1', `('), 0, `math(math$1, shift($@))',
23 index(`$3', `('), 0, `math($1, $2, math$3, shift(shift(shift($@))))',
24 $2, `', $1, p($@)`math(op($1, $2, $3), shift(shift(shift($@))))')')
25 define(`p', `$2$4, `*+', `math($1, $2, math(shift(shift($@))))', ')
26 define(`line', `_$0(translit($1, `<> ', `(),'))')
27 define(`_line', `pushdef(`p')define(`part1', add64(part1,
28 math($@)))popdef(`p')define(`part2', add64(part2, math($@)))')
29 do(translit(include(defn(`file')), `()'nl, `<>;'))