1 divert(-1)dnl -*- m4 -*-
2 # Usage: m4 [-Dfile=day3.input] day3.m4
4 include(`common.m4')ifelse(common(3), `ok', `',
5 `errprint(`Missing common initialization
8 include(`math64.m4')define(`e')
9 define(`list', quote(translit(include(defn(`file')), `.#'nl, `e1;')))
10 define(`width', index(defn(`list'), `;'))
12 patsubst(defn(`list'), `\([^;]*\);', `pushdef(`row', `\1')')
14 define(`half', `eval($1/'width`/2*'width`)')
15 define(`Split', `ifelse($1, 'width`, `pushdef(`row', `$2')', `$0(half($1),
16 substr(`$2', 0, half($1)))$0(eval($1-half($1)), substr(`$2', half($1)))')')
17 Split(eval(len(defn(`list'))/(width+1)*width), translit(defn(`list'), `;'))
19 define(`check', `substr(`$1', eval($2 % 'width`), 1)`'')
20 define(`iter', `ifelse(eval(y % $2), 0,
21 `check(`$3', x)define(`x', eval(x + $1))')define(`y', incr(y))')
22 define(`run', `define(`x', 0)define(`y', 0)_stack_foreach(`row',
23 `iter($@,', `)', `t')')
24 define(`part1', len(run(3, 1)))
25 define(`part2', mul64(eval(part1 * len(run(1, 1)) * len(run(5, 1))),
26 eval(len(run(7, 1)) * len(run(1, 2)))))