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
9 define(`list', translit(include(file), nl, `;'))
11 patsubst(defn(`list'), `\([^;]*\);', `pushdef(`val', `\1')')
13 define(`chew', `pushdef(`val', substr(`$1', 0, index(`$1', `;')))define(
14 `tail',substr(`$1', incr(index(`$1', `;'))))ifelse(index(defn(`tail'),
15 `;'), -1, `', `$0(defn(`tail'))')')
16 define(`Split', `ifelse(eval($1 < 35), 1, `chew(`$2')', `$0(eval($1/2),
17 substr(`$2', 0, eval($1/2)))$0(eval(len(defn(`tail')) + $1 - $1/2),
18 defn(`tail')substr(`$2', eval($1/2)))')')
19 Split(len(defn(`list')), defn(`list'))
22 define(`inc', `define(`$1', incr($1))')
23 define(`c1', 0)define(`c3', 0)define(`r', 0)define(`max', 0)define(`part2', 1)
24 define(`n', `ifdef(`n$1', 1, 0)')define(`n0')
25 define(`tr', `ifdef(`tr$1', `', `define(`tr$1', eval(tr(decr($1)) +
26 tr(decr(decr($1))) + tr(eval($1 - 3))))')tr$1`'')
27 define(`tr0', 1)define(`tr1', 1)define(`tr2', 2)
28 define(`prep', `ifelse(eval($1 > max), 1, `define(`max', $1)')define(`n$1')')
29 stack_foreach(`val', `prep')
30 define(`l', `ifdef(`n$1', `ifdef(`n'incr($1), `inc(`r')inc(`c1')',
31 `inc(`c3')define(`part2', mul64(part2, tr(r)))define(`r', 0)')')')
32 forloop_arg(0, max, `l')
33 define(`part1', eval(c1 * c3))