1 divert(-1)dnl -*- m4 -*-
2 # Usage: m4 [-Dlimit=N] [-Dhashsize=H] [-Dfile=day6.input] day6.m4
3 # Optionally use -Dverbose=1 to see some progress
5 include(`common.m4')ifelse(common(6, 65537), `ok', `',
6 `errprint(`Missing common initialization
9 ifdef(`limit', `', `define(`limit', 10000)')
11 define(`input', translit((include(defn(`file'))), nl`,()', `;'))
12 define(`minx', 400)define(`miny', 400)define(`maxx', 0)define(`maxy', 0)
13 define(`setmax', `ifelse(eval(`$1 > '$2), 1, `define(`$2', `$1')')')
14 define(`setmin', `ifelse(eval(`$1 < '$2), 1, `define(`$2', `$1')$3')')
15 define(`diff', ``($1-$2)*(1-2*($1<$2))'')
16 define(`dist', `eval(diff(`$1', `$3')+diff(`$2', `$4'))')
18 define(`point', `setmin(`$1', `minx')setmax(`$1', `maxx')setmin(`$2',
19 `miny')setmax(`$2', `maxy')define(`cnt', incr(cnt))define(`p'cnt,
20 `$1,$2')define(`x$1')define(`y$2')')
22 patsubst(defn(`input'), `\([^;]*\) \([^;]*\);', `point(`\1', `\2')')
24 define(`_chew', `point(translit(substr(`$1', 0, index(`$1', `;')), ` ',
25 `,'))define(`tail', substr(`$1', incr(index(`$1', `;'))))ifelse(index(
26 defn(`tail'), `;'), -1, `', `$0(defn(`tail'))')')
27 define(`chew', `ifelse(eval(`$1 < 16'), 1, `_$0(`$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 chew(len(defn(`input')), defn(`input'))
33 define(`closest', `ifdef(`c$1_$2', `', `define(`d', 0)define(`best',
34 800)forloop(1, 'cnt`, `_$0(`$1', `$2', ', `)')define(`c$1_$2',
35 p)define(`d$1_$2', d)')c$1_$2')
36 define(`total', `ifelse(closest(`$1', `$2'))d$1_$2')
37 define(`_closest', `$0_(dist(`$1', `$2', p$3), `$3')')
38 define(`_closest_', `ifelse(`$1', best, `define(`p', 0)', `setmin(`$1', `best',
39 `define(`p', `$2')')')define(`d', eval(d + $1))')
40 define(`edge', `ifdef(ifelse(`$3', `-', ``x$1'', ``y$2''),
41 `define(`i'closest(`$1', `$2'))')')
42 forloop(minx, maxx, `edge(', `, 'miny`, `-')')
43 forloop(minx, maxx, `edge(', `, 'maxy`, `-')')
44 forloop(incr(miny), decr(maxy), `edge('minx`, ', `)')
45 forloop(incr(miny), decr(maxy), `edge('maxx`, ', `)')
46 define(`fill', `output(1, `...$1')ifdef(`i$1', `', `fill1(decr(first(p$1)),
47 p$1, `$1', `close')')')
48 define(`close', `ifelse(closest(`$1', `$2'), `$3', 1, 0)')
49 define(`fill1', `ifelse($5(`$1', `$3', `$4'), 1, `$0(decr(`$1'), `$2', `$3',
50 `$4', `$5')', `fill2(incr(`$1'), incr(`$2'), `$3', `$4', `$5')')')
51 define(`fill2', `ifelse($5(`$2', `$3', `$4'), 1, `$0(`$1', incr(`$2'), `$3',
52 `$4', `$5')', `define(`s', eval(`$2 - $1'))fill3(`$1', decr(`$2'), decr(`$3'),
53 `$4', `decr', `$5')fill3(`$1', decr(`$2'), incr(`$3'), `$4', `incr', `$5')')')
54 define(`fill3', `ifelse($6(`$1', `$3', `$4'), 1, `ifelse(`$1', `$2',
55 `define(`s', incr(s))$0(`$1', `$2', $5(`$3'), `$4', `$5', `$6')', `fill4(
56 $@)')', `$1', `$2', `', `$0(incr(`$1'), `$2', `$3', `$4', `$5', `$6')')')
57 define(`fill4', `ifelse($6(`$2', `$3', `$4'), 1, `define(`s', eval(s +
58 $2 - $1 + 1))fill3(`$1', `$2', $5(`$3'), `$4', `$5', `$6')', `$0(`$1',
59 decr(`$2'), `$3', `$4', `$5', `$6')')')
60 forloop(1, cnt, `define(`s', 0)fill(', `)setmax(s, `part1')')
61 define(`range', `eval(total(`$1', `$2')` < $3')')
62 define(`fill0', `_$0(total(`$1', decr(`$2')), total(`$1', `$2'),
63 total(`$1', incr(`$2')), `$1', `$2')')
64 define(`_fill0', `ifelse(eval(`$1 < $2'), 1, `fill0(`$4', decr(`$5'))',
65 eval(`$3 < $2'), 1, `fill0(`$4', incr(`$5'))', `fill1(decr(`$4'), `$4', `$5',
68 fill0(eval((maxx-minx)/2), eval((maxy-miny)/2))