day 1 more robust
[aoc_eblake.git] / 2022 / day13.m4
blobb701309bc16e222983523a7cf1d8df7be4f53ece
1 divert(-1)dnl -*- m4 -*-
2 # Usage: m4 [-Dfile=day13.input] day13.m4
4 include(`common.m4')ifelse(common(13), `ok', `',
5 `errprint(`Missing common initialization
6 ')m4exit(1)')
8 define(`input', translit((include(defn(`file'))), nl`,()', `;.');)
9 define(`part1', 0)define(`lo', 1)define(`hi', 1)define(`cnt', 1)
10 define(`eat')
11 define(`cmp', `ifelse(`$1', `$2', `$0(', `$1', (), `1eat(', `$2',
12   (), `0eat(', eat$1eat$2, `', `$0(first$1, first$2, (shift$1), (shift$2),',
13   eat$1, `', `$0(first$1, `$2', (shift$1), `()',', eat$2, `', `$0(`$1',
14   first$2, `()', (shift$2),', `eval(`$1<$2')eat(')shift(shift($@)))')
15 define(`arrange', `ifelse(cmp(`$2', `((2))'), 1, `define(`lo', incr(incr(lo)))',
16   `ifelse(cmp(`((6))', `$1'), 1, `', `ifelse(cmp(`$1', `((2))'), 1, `define(
17   `lo', incr(lo))define(`hi', eval(hi+cmp(`$2', `((6))')))', `define(`hi',
18   eval(hi+1+cmp(`$2', `((6))')))')')')')
19 define(`_do', `ifelse(cmp(`$2', `$3'), 1, `define(`part1',
20   eval(part1 + $1))arrange(`$2', `$3')', `arrange(`$3', `$2')')')
21 define(`do', `_$0(cnt, translit(`$1', `[.;]', `(,,)'))define(`cnt', incr(cnt))')
23 ifdef(`__gnu__', `
24   patsubst(defn(`input'), `\([^;]*;[^;]*\);;', `do(`\1')')
25 ', `
26   define(`_chew', `do(substr(`$1', 0, index(`$1', `;;')))define(
27     `tail', substr(`$1', incr(incr(index(`$1', `;;')))))ifelse(index(defn(
28     `tail'), `;;'), -1, `', `$0(defn(`tail'))')')
29   define(`chew', `ifelse(eval($1 < 205), 1, `_$0(`$2')', `$0(eval($1/2),
30     substr(`$2', 0, eval($1/2)))$0(eval(len(defn(`tail')) + $1 - $1/2),
31     defn(`tail')substr(`$2', eval($1/2)))')')
32   chew(len(defn(`input')), defn(`input'))
34 define(`part2', eval(lo*(lo+hi)))
36 divert`'part1
37 part2