day 6 fix bug
[aoc_eblake.git] / 2022 / day21.m4
blob5b40776aac1879eaab823da5ee00159c1a866e78
1 divert(-1)dnl -*- m4 -*-
2 # Usage: m4 [-Dfile=day21.input] day21.m4
4 include(`common.m4')ifelse(common(21), `ok', `',
5 `errprint(`Missing common initialization
6 ')m4exit(1)')
8 include(`math64.m4')
9 # div64 is not in math64.m4 because it is not fully generic; but it is good
10 # enough for the few large divisions seen in this puzzle
11 define(`bits', `_$0(eval($1, 2))')
12 define(`_bits', ifdef(`__gnu__', ``shift(patsubst($1, ., `, \&'))'',
13   ``ifelse(len($1), 1, `$1', `substr($1, 0, 1),$0(substr($1, 1))')''))
14 define(`bits64', `ifelse(eval(len($1) < 10), 1, `bits($1)', `_$0(mul64($1,
15   5)), eval(substr($1, decr(len($1))) & 1)')')
16 define(`_bits64', `bits64(substr($1, 0, decr(len($1))))')
17 define(`div64p', `ifelse($4, `', `$1,$2', `$0(_$0(add64($1, $1), add64(add64($2,
18   $2), $4), $3), $3, shift(shift(shift(shift($@)))))')')
19 define(`_div64p', `ifelse(lt64($2, $3), 0, `add64($1, 1), sub64($2, $3)',
20   `$1, $2')')
21 define(`div64', `ifelse(eval(`$1'), `$1', `eval(`$1/$2')',
22   `first($0p(0, 0, $2, bits64(`$1')))')')
24 # Input can contain `nl' as substring; avoid macro collisions
25 define(`input', translit(include(defn(`file')), defn(`alpha')nl`:',
26   defn(`ALPHA')`;'))
27 define(`_do', `define(`$1_', `e(`$2', `$3', `$4')')')
28 define(`do', `_$0(translit(`$1', ` ', `,'))')
30 ifdef(`__gnu__', `
31   patsubst(defn(`input'), `\([^;]*\);', `do(`\1')')
32 ', `
33   define(`_chew', `do(substr(`$1', 0, index(`$1', `;')))define(
34     `tail', substr(`$1', incr(index(`$1', `;'))))ifelse(index(defn(`tail'),
35     `;'), -1, `', `$0(defn(`tail'))')')
36   define(`chew', `ifelse(eval($1 < 35), 1, `_$0(`$2')', `$0(eval($1/2),
37     substr(`$2', 0, eval($1/2)))$0(eval(len(defn(`tail')) + $1 - $1/2),
38     defn(`tail')substr(`$2', eval($1/2)))')')
39   chew(len(defn(`input')), defn(`input'))
41 define(`_e', `ifelse(`$1', `@', `pushdef(`undo', `popdef(`undo')undo(_e(
42   $'1`,'translit(`$2', `-*/+', `+/*-')`,`$3'))')@', `$3', `@', `pushdef(`undo',
43   `popdef(`undo')undo(_e('ifelse(`$2', `+', ``$'1`,-,$1'', `$2', `-',
44   ``$1,-,$'1', `$2', `*', ``$'1`,/,$1'', ``$1,/,$'1')`))')@', `ifelse(`$2',
45   `+', `add', `$2', `-', `sub', `$2', `*', `mul', `div')64(`$1', `$3')')')
46 define(`e', `ifelse(`$2', `', `$1', `_$0($1_, $2, $3_)')')
47 define(`part1', ROOT_)
48 define(`undo', `$1')
49 pushdef(`HUMN_', `@')
50 ROOT_
51 pushdef(`_e', `popdef(`$0')$1$3')
52 define(`part2', undo)
54 divert`'part1
55 part2