day 6 fix bug
[aoc_eblake.git] / 2022 / day23.m4
blob819f65f83d5e27736ebbefa7d88f122925d3379c
1 divert(-1)dnl -*- m4 -*-
2 # Usage: m4 [-Dfile=day23.input] day23.m4
3 # Optionally use -Dverbose=1 to see some progress
5 include(`common.m4')ifelse(common(23), `ok', `',
6 `errprint(`Missing common initialization
7 ')m4exit(1)')
9 # My 71x71 input grid expands to around 140x140 before stabilizing; this
10 # is small enough to map into a 1D position (256x256 with offset 50)
11 define(`input', translit(include(defn(`file')), nl`.#', `;01'))
12 define(`n', 0)define(`offset', 50)
13 define(`y', offset)define(`x', eval(offset+(y<<8)))
14 define(`do', `ifelse(`$3', `;', `define(`y', incr($2))define(`x',
15   eval(offset+(($2+1)<<8)))', `define(`p$1', ifelse(`$3', 1, `define(`e'n,
16   n`,$1')define(`n', incr(n))1'))define(`x', incr($1))')')
18 ifdef(`__gnu__', `
19   patsubst(defn(`input'), `.', `do(x, y, `\&')')
20 ',`
21   define(`chew', `ifelse($1, 1, `do(x, y, `$2')', `$0(eval($1/2), substr(
22     `$2', 0, eval($1/2)))$0(eval($1-$1/2), substr(`$2', eval($1/2)))')')
23   chew(len(defn(`input')), defn(`input'))
26 # At most two elves compete for a position
27 define(`D', defn(`define'))define(`P', defn(`pushdef'))
28 define(`U', defn(`popdef'))define(`I', defn(`ifdef'))
29 define(`E', defn(`ifelse'))define(`V', defn(`eval'))
30 define(`M', defn(`decr'))define(`N', defn(`incr'))
31 define(`qa')
32 define(`q', `D(`q$2',I(`q$2',,``m(e$1,$2)'P(`qa',`q$2(U(`q$2'))U(`qa')qa')'))')
33 define(`qx')
34 define(`q0', `q($1,V($2-256))')
35 define(`q1', `q($1,V($2+256))')
36 define(`q2', `q($1,M($2))')
37 define(`q3', `q($1,N($2))')
38 define(`c0', `E(`$2$3$4$5$6$7$8$9',,`qx',`$2$3$4',,`q0','dnl
39 ``$7$8$9',,`q1',`$2$5$7',,`q2',`$4$6$9',,`q3',`qx')')
40 define(`c1', `E(`$2$3$4$5$6$7$8$9',,`qx',`$7$8$9',,`q1','dnl
41 ``$2$5$7',,`q2',`$4$6$9',,`q3',`$2$3$4',,`q0',`qx')')
42 define(`c2', `E(`$2$3$4$5$6$7$8$9',,`qx',`$2$5$7',,`q2','dnl
43 ``$4$6$9',,`q3',`$2$3$4',,`q0',`$7$8$9',,`q1',`qx')')
44 define(`c3', `E(`$2$3$4$5$6$7$8$9',,`qx',`$4$6$9',,`q3','dnl
45 ``$2$3$4',,`q0',`$7$8$9',,`q1',`$2$5$7',,`q2',`qx')')
46 define(`_at', `I(`p$1',,`D(`p$1')')`,p$1'')
47 define(`at', `D(`a$1',_at(V($1-257))_at(V($1-256))_at(V($1-255))'dnl
48 `_at(M($1))_at(N($1))_at(V($1+255))_at(V($1+256))_at(V($1+257)))')
49 define(`p', `I(`a$2',,`at($2)')c$3(a$2)($1,$2)')
50 define(`m', `D(`p$2')D(`p$3',1)D(`e$1',`$1,$3')')
51 define(`act', `E(defn(`qa'),,`D(`part2', $1)P(`round')', `qa`'')')
52 define(`_round', forloop(0, decr(n), ``p(e'', ``,$'1`)''))
53 define(`round', `ifelse($1, 11, `define(`part1', bound)', eval($1%50), 0,
54   `output(1, ...$1)')_$0(eval(`($1+3)%4'))act($1)$0(incr($1))')
55 define(`prep', `define(`x1', eval($2&255))define(`x2', x1)define(`y1',
56   eval($2>>8))define(`y2', y1)')
57 define(`_bound', `ifelse(eval(($2&255)<x1), 1, `define(`x1', `($2&255)')',
58   `ifelse(eval(($2&255)>x2), 1, `define(`x2', `($2&255)')')')ifelse(
59   eval(($2>>8)<y1), 1, `define(`y1', `($2>>8)')', `ifelse(eval(($2>>8)>y2),
60   1, `define(`y2', `($2>>8)')')')')
61 define(`bound', `prep(e0)forloop(0, decr(n), `_$0(first(`e'', `))')eval(
62   (x2-x1+1)*(y2-y1+1)-n)')
63 round(1)
64 ifdef(`part1', `', `define(`part1', bound)')
66 divert`'part1
67 part2