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
8 define(`input', translit(include(defn(`file')), nl, `;'))
9 define(`width', incr(index(defn(`input'), `;')))
10 define(`g', `g$1()')define(`idx', width)
11 forloop(0, decr(width), `define(`g'', `, 9)')
12 define(`do', `ifelse(`$2', `;', `define(`g$1', 9)', `define(`g$1',
13 `$2')ifelse(eval($2<g(decr($1)) && $2<g(eval($1-''width``))), 1,
14 `pushdef(`v', $1)')')define(`idx', incr(idx))')
16 patsubst(defn(`input'), `.', `do(idx, `\&')')
18 define(`chew', `ifelse($1, 1, `do(idx, `$2')', `$0(eval($1/2), substr(
19 `$2', 0, eval($1/2)))$0(eval($1-$1/2), substr(`$2', eval($1/2)))')')
20 chew(len(defn(`input')), defn(`input'))
22 forloop(idx, eval(idx+width), `define(`g'', `, 9)')
23 define(`part1', 0)define(`b1', 0)define(`b2', 0)define(`b3', 0)
24 define(`rank', `ifelse(eval($1>$2), 1, `define(`b3', $3)define(`b2',
25 $2)define(`b1', $1)', eval($1>$3), 1, `define(`b3', $3)define(`b2',
26 $1)', eval($1>$4), 1, `define(`b3', $1)')')
27 define(`_basin', `basin($1, g($1))')
28 define(`basin', `ifelse($2, 9, `', `ifdef(`s$1', `', `-define(`s$1')_$0(
29 incr($1))_$0(decr($1))_$0(eval($1-''width``))_$0(eval($1+''width``))')')')
30 define(`check', `ifelse(eval($2<g(incr($1)) && $2<g(eval($1+'width`))), 1,
31 `define(`part1', eval(part1+1+$2))rank(len(basin($1, $2)), b1, b2, b3)')')
32 define(`loop', `ifdef(`v', `check(v, g(v))popdef(`v')loop()')')
33 loop()define(`part2', eval(b1*b2*b3))