1 divert(-1)dnl -*- m4 -*-
2 # Usage: m4 [-Dfile=day11.input] day11.m4
4 include(`common.m4')ifelse(common(11), `ok', `',
5 `errprint(`Missing common initialization
8 define(`input', translit((include(defn(`file'))), nl`,()', `;;'))
9 define(`x', 0)define(`y', 0)define(`part2', 0)
10 define(`abs', `ifelse(index(`$1', `-'), 0, `substr(`$1', 1)', `$1')')
11 define(`dist', `_$0(abs($1), abs($2))')
12 define(`_dist', `eval($1 + ($2 > $1) * ($2 - $1) / 2)')
13 define(`check', `_$0(dist(x, y))')
14 define(`_check', `ifelse(eval($1 > part2), 1, `define(`part2', $1)')')
15 define(`n_', `define(`y', decr(decr(y)))check()')
16 define(`ne_', `define(`x', incr(x))define(`y', decr(y))check()')
17 define(`se_', `define(`x', incr(x))define(`y', incr(y))check()')
18 define(`s_', `define(`y', incr(incr(y)))check()')
19 define(`sw_', `define(`x', decr(x))define(`y', incr(y))check()')
20 define(`nw_', `define(`x', decr(x))define(`y', decr(y))check()')
22 patsubst(defn(`input'), `\([^;]*\);', `\1_()')
24 define(`chew', `substr(`$1', 0, index(`$1', `;'))_()define(`tail',
25 substr(`$1', incr(index(`$1', `;'))))ifelse(index(defn(`tail'), `;'),
26 -1, `', `$0(defn(`tail'))')')
27 define(`split', `ifelse(eval($1 < 6), 1, `chew(`$2')', `$0(eval($1/2),
28 substr(`$2', 0, eval($1/2)))$0(eval(len(defn(`tail')) + $1 - $1/2),
29 defn(`tail')substr(`$2', eval($1/2)))')')
30 split(len(defn(`input')), defn(`input'))
32 define(`part1', dist(x, y))