day 21 preliminary refactoring
[aoc_eblake.git] / 2020 / day18.m4
blob2843cd2c73e06c65d9e8b30227816cfe9612b632
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
6 ')m4exit(1)')
8 include(`math64.m4')
9 ifdef(`__gnu__', `
10   define(`do', `patsubst(`$1', `\([^;]*\);', `line(`\1')')')
11 ',`
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, `<>;'))
31 divert`'part1
32 part2