day 20 part 1
[aoc_eblake.git] / 2023 / day13.m4
blob103cfc0d07b65f5df714ff21abe93f5015adc5a4
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'))2, `.#'nl, `012'))
9 define(`x', 0)define(`y', 0)define(`g', 0)
10 define(`append', `define(`$1', eval((defn(`$1')+0)*2|$2))')
11 define(`do0', `append(`r$1_$3', $4)append(`c$1_$2', $4)define(`x', incr($2))')
12 define(`do1', defn(`do0'))
13 define(`do2', `ifelse($2, 0, `define(`g$1', g$1`,'decr($3))define(`g',
14   incr($1))define(`y', 0)', `define(`g$1', decr($2))define(`x', 0)define(`y',
15   incr($3))')')
17 ifdef(`__gnu__', `
18   patsubst(defn(`input'), `.', `do\&(g, x, y, \&)')
19 ',`
20   define(`chew', `ifelse($1, 1, `do$2(g, x, y, $2)', `$0(eval($1/2), substr(
21     `$2', 0, eval($1/2)))$0(eval($1-$1/2), substr(`$2', eval($1/2)))')')
22   chew(len(defn(`input')), defn(`input'))
25 define(`part1', 0)define(`part2', 0)
26 define(`bump', `define(`$1', eval($1+$2))')
27 define(`smudge', `eval(`($1)&(($1)-1)')')
29 # try(seen, lo, hi, name, bound, amt)
30 define(`_try', `ifelse($1$2, 0, `bump(`part1', $6)', $1$3, $5, `bump(`part1',
31   $6)', $1$2, !0, `bump(`part2', $6)', $1$3, !$5, `bump(`part2', $6)',
32   `try($1, decr($2), incr($3), `$4', $5, $6)')')
33 define(`try', `ifelse($4_$2, $4_$3, `_$0($@)', $1smudge($4_$2 ^ $4_$3), 0,
34   `_$0(!$@)')')
35 define(`_reflect', `try(`', decr($1), $@*$1)')
36 define(`reflect', `forloop(1, $2, `_$0(', `, $@)')')
37 define(`_check', `reflect(`r$1', $3, 100)reflect(`c$1', $2, 1)')
38 define(`check', `_$0($1, g$1)')
39 forloop_arg(0, decr(g), `check')
41 divert`'part1
42 part2