day 15 golfed m4, 829 effective bytes
[aoc_eblake.git] / 2016 / day20.m4
blobf7fdf9b1a7d9718be5d1c47981b31929cb2be8f5
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
6 ')m4exit(1)')
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'))')
22 ifdef(`__gnu__', `
23   patsubst(defn(`list'), `\([^;]*\);', `line(`\1')')
24 ',`
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'))
33 define(`part2', 0)
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(', `)')
40 divert`'part1
41 part2