1 divert(-1)dnl -*- m4 -*-
2 # Usage: m4 [-Dfile=day15.input] day15.m4
4 include(`common.m4')ifelse(common(15), `ok', `',
5 `errprint(`Missing common initialization
8 define(`positions', `(')define(`position', `)')
10 define(`disc', `define(`d$2', $4)define(`o$2',
11 eval(`(10 * $4 - $2 - $6) % $4'))define(`discs', incr(discs))')
12 translit(include(file), define(`Disc', `disc(')` .#', `,)')
14 define(`bits', `_$0(eval($1, 2))')
15 define(`_bits', ifdef(`__gnu__', ``shift(patsubst($1, ., `, \&'))'',
16 ``ifelse(len($1), 1, `$1', `substr($1, 0, 1),$0(substr($1, 1))')''))
17 define(`modmul', `define(`d', 0)define(`a', ifelse(index($1, -), 0,
18 `eval(`$1 + $3')', $1))define(`b', ifelse(index($2, -), 0, `eval(`$2 + $3')',
19 $2))pushdef(`m', $3)foreach(`_$0', bits(a))popdef(`m')d`'')
20 define(`_modmul', `define(`d', eval(d + d))ifelse(eval(m < d), 1, `define(`d',
21 eval(d - m))')ifelse($1, 1, `define(`d', eval(d + b))')ifelse(eval(m < d), 1,
22 `define(`d', eval(d - m))')')
23 define(`pair', `define(`$1', $3)define(`$2', $4)')
24 define(`ext', `pair(`r_', `r', $1, $2)pair(`m', `s', 1, 0)pair(`n', `T', 0,
26 define(`_ext', `ifelse(r, 0, `', `define(`q', eval(r_ / r))pair(`r_', `r', r,
27 eval(r_ - q * r))pair(`m', `s', s, eval(m - q * s))pair(`n', `T', T,
28 eval(n - q * T))$0()')')
29 define(`p', 1)define(`r', 0)
30 define(`crt', `_$0($1, $2, `p', `r', eval($1 * p), r)')
31 define(`_crt', `ifelse($3, 1, `pair(`$3', `$4', $1, $2)', `ext($3,
32 $1)pair(`$3', `$4', $5, eval((modmul(modmul($6, n, $5), $1, $5) +
33 modmul(modmul($2, m, $5), $3, $5)) % $5))')')
34 define(`do', `crt(d$1, o$1)')
35 forloop_arg(1, discs, `do')
37 crt(11, eval((`2 * 11 - 1 - 'discs) % 11))