day 20 part 1
[aoc_eblake.git] / 2023 / day19.m4
blob8a3b308ecb0db06b0d1c088860c2598d48b86c41
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 define(`cmp', `eval($1$4)eval($2$4), $1, $2, $3')
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, $8), substr($8, 1))')
49 define(`fork1', ``', `,$2,$3,$4', cmp(shift$1$5)')
50 define(`fork2', ``$1,', `,$3,$4', cmp(shift$2$5)')
51 define(`fork3', ``$1,$2,', `,$4', cmp(shift$3$5)')
52 define(`fork4', ``$1,$2,$3,', `', cmp(shift$4$5)')
53 define(`_use', `$3_($1)use(`$2', shift(shift(shift($@))))')
54 define(`use', `ifelse(`$1', `', `', `$3', `', `$2_($1)', `_$0(fork($1,
55   shift$2), shift(shift($@)))')')
56 in_((,1,4000,1,), (,1,4000,2,), (,1,4000,3,), (,1,4000,4,))
58 divert`'part1
59 part2