day 19 part 2 wrong
[aoc_eblake.git] / 2023 / day19.m4
blob2851c04f6ee52309bd09e96d51e429f973cb67c6
1 divert(-1)dnl -*- m4 -*-
2 # Usage: m4 [-Dfile=day19.input] day19.m4
4 include(`common.m4')ifelse(common(19), `ok', `',
5 `errprint(`Missing common initialization
6 ')m4exit(1)')
8 # The input contains the substring nl, but no upper case other than A or R,
9 # and no lower case vowels.  Rename the macros that would interfere.
10 define(`Nl', defn(`nl'))undefine(`nl')
11 define(`Dnl', defn(`dnl'))undefine(`dnl')
12 define(`errprintn', `errprint(`$1'Nl())')
14 define(`x', `$`1'')define(`m', `$`2'')define(`a', `$`3'')define(`s', `$`4'')
15 define(`input', translit((include(defn(`file'))), Nl`,()', `;.'))
16 popdef(`x')popdef(`m')popdef(`a')popdef(`s')
17 define(`part1', 0)define(`part2', 0)
18 define(`R_')
19 define(`A_', `define(`part1', eval(part1+$1+$2+$3+$4))')
20 define(`use', `ifelse(`$3', `', `$2_($1)', `ifelse(eval($2), 1, `$3_($1)',
21   `$0(`$1', shift(shift(shift($@))))')')')
22 define(`run', `in_($2,$4,$6,$8)')
23 define(`do', `run(translit(`$1', `.=${}', `,,'))')
24 define(`build', `define(`$2_', `use'(``$$1','shift(shift($@))))')
25 pushdef(`do', `ifelse(`$1', `', `popdef(`$0')', `build(`@', translit(`$1',
26   `{:.}', `,,,'))')')
28 ifdef(`__gnu__', `
29   patsubst(defn(`input'), `\([^;]*\);', `do(`\1')')
30 ', `
31   define(`_chew', `do(substr(`$1', 0, index(`$1', `;')))define(
32     `tail', substr(`$1', incr(index(`$1', `;'))))ifelse(index(defn(`tail'),
33     `;'), -1, `', `$0(defn(`tail'))')')
34   define(`chew', `ifelse(eval($1 < 100), 1, `_$0(`$2')', `$0(eval($1/2),
35     substr(`$2', 0, eval($1/2)))$0(eval(len(defn(`tail')) + $1 - $1/2),
36     defn(`tail')substr(`$2', eval($1/2)))')')
37   chew(len(defn(`input')), defn(`input'))
40 include(`math64.m4')
41 define(`diff', `($3-$2+1)')
42 define(`A_', `define(`part2', add64(part2, mul64(eval(diff$1*diff$2),
43   eval(diff$3*diff$4))))')
44 # _fork(pre, suf, eval, lo,hi,n,mid)
45 define(`_fork', `ifelse($3, 00, `,`$1(,$4,$5,$6,)$2'', $3, 11,
46   ``$1(,$4,$5,$6,)$2',', $3, 01, ``$1(,incr($7),$5,$6,)$2',`$1(,$4,$7,$6,)$2'',
47   ``$1(,$4,decr($7),$6,)$2',`$1(,$7,$5,$6,)$2'')')
48 define(`fork', `_$0(fork$7($1, $2, $3, $4), eval($5$8)eval($6$8),
49   $5, $6, $7, substr($8, 1))')
50 define(`fork1', ``', `,$2,$3,$4'')
51 define(`fork2', ``$1,', `,$3,$4'')
52 define(`fork3', ``$1,$2,', `,$4'')
53 define(`fork4', ``$1,$2,$3,', `'')
54 define(`_use', `$3_($1)use(`$2', shift(shift(shift($@))))')
55 define(`use', `ifelse(`$1', `', `', `$3', `', `$2_($1)', `_$0(fork($1,
56   shift$2), shift(shift($@)))')')
57 in_((,1,4000,1,), (,1,4000,2,), (,1,4000,3,), (,1,4000,4,))
59 divert`'part1
60 part2