day 17 m4 optimize
[aoc_eblake.git] / 2020 / day2.m4
blob40c59661a754e12e731f66f706fca7c63f9ab191
1 divert(-1)dnl -*- m4 -*-
2 # Usage: m4 [-Dfile=day2.input] day2.m4
4 include(`common.m4')ifelse(common(2), `ok', `',
5 `errprint(`Missing common initialization
6 ')m4exit(1)')
8 define(`part1', 0)define(`part2', 0)
9 define(`list', translit(include(defn(`file')), nl`:', `.'))
10 define(`check1', `define(`part1', eval(part1 + ($3 >= $1 && $3 <= $2)))')
11 define(`check2', `define(`part2', eval(part2 + ($1 != $2)))')
12 define(`at', `ifelse(substr(`$1', decr($2), 1), `$3', 1, 0)')
13 define(`parse', `check1($1, $2, len(`$4') - len(translit(``$4'', `$3')))
14   check2(at(`$4', $1, `$3'), at(`$4', $2, `$3'))')
15 ifdef(`__gnu__', `
16   patsubst(defn(`list'), `\([0-9]*\)-\([0-9]*\) \(.\) \([^.]*\)\.',
17     `parse(\1, \2, `\3', `\4')')
18 ', `
19   define(`chew', `parse(translit(substr(`$1', 0, index(`$1', `.')), `- ',
20     `,,'))define(`tail', substr(`$1', incr(index(`$1', `.'))))ifelse(
21     index(defn(`tail'), `.'), -1, `', `$0(defn(`tail'))')')
22   define(`split', `ifelse(eval($1 < 60), 1, `chew(`$2')', `$0(eval($1/2),
23     substr(`$2', 0, eval($1/2)))$0(eval(len(defn(`tail')) + $1 - $1/2),
24     defn(`tail')substr(`$2', eval($1/2)))')')
25   split(len(defn(`list')), defn(`list'))
28 divert`'part1
29 part2