1 divert(-1)dnl -*- m4 -*-
2 # Usage: m4 [-Dfile=day9.input] day9.m4
4 include(`common.m4')ifelse(common(9), `ok', `',
5 `errprint(`Missing common initialization
9 define(`list', translit(include(defn(`file')), `()'nl, `<>'))
10 define(`part1', 0)define(`part2', 0)define(`c', 0)
11 define(`_visit_0', `ifelse(`$1', `<', `define(`a', 0)define(`$0',
12 defn(`$0_1'))', `ifdef(`g', `', `define(`part1', incr(part1))')define(
13 `part2', add64(part2, 1))')')
14 define(`_visit_1', `ifelse(`$1', `x', `define(`b', 0)define(`$0',
15 defn(`$0_2'))', `define(`a', eval(a*10 + $1))')')
16 define(`_visit_2', `ifelse(`$1', `>', `ifdef(`g', `', `define(`part1',
17 eval(part1 + a*b))')define(`$0', defn(`$0_0'))pushdef(`part1',
18 0)pushdef(`part2', 0)pushdef(`g', eval(c + a))pushdef(`b')', `define(`b',
20 define(`check', `ifelse(c, g, `define(`part2', add64(mul64(part2,
21 popdef(`b')b), popdef(`part2')part2))popdef(`part1')popdef(`g')$0()')')
22 define(`_visit', defn(`_visit_0'))
23 define(`visit', `define(`c', incr(c))_$0(`$1')check()')
25 patsubst(defn(`list'), `.', `visit(`\&')')
27 define(`Split', `ifelse($1, 1, `visit(`$2')', `$0(eval($1/2), substr(`$2',
28 0, eval($1/2)))$0(eval($1 - $1/2), substr(`$2', eval($1/2)))')')
29 Split(len(defn(`list')), defn(`list'))