1 divert(-1)dnl -*- m4 -*-
2 # Usage: m4 [-Dfile=day20.input] day20.m4
4 include(`common.m4')ifelse(common(20), `ok', `',
5 `errprint(`Missing common initialization
8 define(`list', translit(include(defn(`file')), nl, `;'))
9 define(`merge', `ifelse($1, $3, `_stack_foreach(`l$1', `_$0(first(', `), $2,
10 $4, $1)', `t')ifdef(`in', `popdef(`in')', `pushdef(`l$1', `$2,$4')')',
11 `$0($1, $2, $1, 16777215)$0(incr($1), 0, $3, $4)')')
12 define(`_merge', `ifdef(`in', `ifelse(eval(`$2+1 >= $3'), 1, `popdef(`in')$0(
13 l$5, popdef(`l$5')l$5, $5)')', `ifelse(eval(`$3 > $2+1'),
14 1, `define(`l$5', `$3,$4')pushdef(`l$5', `$1,$2')define(`in')', eval(
15 `$3 >= $1'), 1, `ifelse(eval(`$4-1 > $2'), 1, `define(`l$5',
16 `$1,$4')')define(`in')', eval(`$4 > $2'), 1, `define(`l$5',
17 `$3,$4')define(`in')', eval(`$4+1 >= $1'), 1, `define(`l$5',
18 `$3,$2')define(`in')')')')
19 define(`line', `_$0(translit(`$1', `-', `,'))')
20 define(`_line', `merge(eval(`$1 >> 24 & 255'), eval(`$1 & 0xffffff'),
21 eval(`$2 >> 24 & 255'), eval(`$2 & 0xffffff'))')
23 patsubst(defn(`list'), `\([^;]*\);', `line(`\1')')
25 define(`chew', `line(substr(`$1', 0, index(`$1', `;')))define(`tail',
26 substr(`$1', incr(index(`$1', `;'))))ifelse(index(defn(`tail'), `;'), -1,
27 `', `$0(defn(`tail'))')')
28 define(`split', `ifelse(eval($1 < 45), 1, `chew(`$2')', `$0(eval($1/2),
29 substr(`$2', 0, eval($1/2)))$0(eval(len(defn(`tail')) + $1 - $1/2),
30 defn(`tail')substr(`$2', eval($1/2)))')')
31 split(len(defn(`list')), defn(`list'))
34 define(`_find', `ifelse($2.$3, 0.16777215, `', `define(`part1',
35 eval(`$1<<24|$3+1'))')ifdef(`prev', `define(`part2', eval(part2 + prev -
36 ($1<<24|$3) - 1))')define(`prev', `($1<<24|$2)')')
37 define(`find', `_stack_foreach(`l$1', `_$0($1, first(', `))', `t')')
38 forloop_rev(255, 0, `find(', `)')