day 15 golfed m4, 829 effective bytes
[aoc_eblake.git] / 2020 / day3.m4
blob814a56bda2b50333d1be2277c98e1da484008b68
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
6 ')m4exit(1)')
8 include(`math64.m4')define(`e')
9 define(`list', quote(translit(include(defn(`file')), `.#'nl, `e1;')))
10 define(`width', index(defn(`list'), `;'))
11 ifdef(`__gnu__', `
12   patsubst(defn(`list'), `\([^;]*\);', `pushdef(`row', `\1')')
13 ', `
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)))))
28 divert`'part1
29 part2