day 6 fix bug
[aoc_eblake.git] / 2022 / day22.m4
blobe5353d9571596cfe05fd84c46da1f2daef2d0391
1 divert(-1)dnl -*- m4 -*-
2 # Usage: m4 [-Dfile=day22.input] day22.m4
4 include(`common.m4')ifelse(common(22), `ok', `',
5 `errprint(`Missing common initialization
6 ')m4exit(1)')
8 # https://www.reddit.com/r/adventofcode/comments/zsgbe7/2022_day_22_question_about_your_input/
9 # There are 11 possible cube nets (compounded by which reflection and
10 # rotation a given net is presented in), but rather than generically
11 # coding all of them, I'm limiting effort by just hardcoding those
12 # two puzzle layouts.
13 define(`input', translit(include(defn(`file')), nl`# ', `;@-'))
14 define(`idx', index(defn(`input'), `.'))
15 define(`_map', `define(`m'eval($1)`_'eval($2)`_$3', eval($4)`,'eval($5))define(
16   `M'eval($1)`_'eval($2)`_$3', eval($6)`,'eval($7)`,$8')')
17 define(`R', 0)define(`D', 1)define(`L', 2)define(`U', 3)
18 ifelse(idx, 8, `
19 dnl sample input
20 dnl ..1.
21 dnl 234.
22 dnl ..56
23 define(`map', `forloop_var(`v', 1, 4, `_$0($@)')')
24 map( `8+v',     0, U,  `8+v',    12,  `5-v',      5, D)dnl 1U/5D/2U
25 map(     8,   `v', L,     12,   `v',  `4+v',      5, D)dnl 1L/1R/3U
26 map(    13,   `v', R,      9,   `v',     16, `13-v', L)dnl 1R/1L/6R
27 map(   `v',     4, U,    `v',     8, `13-v',      1, D)dnl 2U/2D/1U
28 map( `4+v',     4, U,  `4+v',     8,      9,    `v', R)dnl 3U/3D/1L
29 map(     0, `4+v', L,     12, `4+v', `17-v',     12, U)dnl 2L/4R/6D
30 map(    13, `4+v', R,      1, `4+v', `17-v',      9, D)dnl 4R/2L/6U
31 map(   `v',     9, D,    `v',     5, `13-v',     12, U)dnl 2D/2U/5D
32 map( `4+v',     9, D,  `4+v',     5,      9, `13-v', R)dnl 3D/3U/5L
33 map(`12+v',     8, U, `12+v',    12,     12,  `9-v', L)dnl 6U/6D/4R
34 map(     8, `8+v', L,     16, `8+v',  `9-v',      8, U)dnl 5L/6R/3D
35 map(    17, `8+v', R,      9, `8+v',     12,  `5-v', L)dnl 6R/5L/1R
36 map( `8+v',    13, D,  `8+v',     1,  `5-v',      8, U)dnl 5D/1U/2D
37 map(`12+v',    13, D, `12+v',     9,      1,  `9-v', R)dnl 6D/6U/2L
38 ', idx, 50, `
39 dnl puzzle input
40 dnl .12
41 dnl .3.
42 dnl 45.
43 dnl 6..
44 define(`map', `forloop_var(`v', 1, 50, `_$0($@)')')
45 map( `50+v',       0, U,  `50+v',     150,       1, `150+v', R)dnl 1U/5D/6L
46 map(`100+v',       0, U, `100+v',      50,     `v',     200, U)dnl 2U/2D/6D
47 map(     50,     `v', L,     150,     `v',       1, `151-v', R)dnl 1L/2R/4L
48 map(    151,     `v', R,      51,     `v',     100, `151-v', L)dnl 2R/1L/5R
49 map(`100+v',      51, D, `100+v',       1,     100,  `50+v', L)dnl 2D/2U/3R
50 map(     50,  `50+v', L,     100,  `50+v',     `v',     101, D)dnl 3L/3R/4U
51 map(    101,  `50+v', R,      51,  `50+v', `100+v',      50, U)dnl 3R/3L/2D
52 map(    `v',     100, U,     `v',     200,      51,  `50+v', R)dnl 4U/6D/3L
53 map(      0, `100+v', L,     100, `100+v',      51,  `51-v', R)dnl 4L/5R/1L
54 map(    101, `100+v', R,       1, `100+v',     150,  `51-v', L)dnl 5R/4L/2R
55 map( `50+v',     151, D,  `50+v',       1,      50, `150+v', L)dnl 5D/1U/6R
56 map(      0, `150+v', L,      50, `150+v',  `50+v',       1, D)dnl 6L/6R/1U
57 map(     51, `150+v', R,       1, `150+v',  `50+v',     150, U)dnl 6R/6L/5D
58 map(    `v',     201, D,     `v',     101, `100+v',       1, D)dnl 6D/4U/2U
59 ', `fatal(`unexpected input layout')')
61 define(`set3', `define(`$1', $4)define(`$2', $5)define(`$3', $6)')
62 set3(`x', `y', `a', 1, 1, 0)
63 define(`dx', `define(`x', incr($1))')
64 define(`dy', `ifelse(`$1', 1, `popdef(`do')s()',
65   `define(`x', 1)define(`y', incr($2))')')
66 define(`dp', `define(`p$1_$2', `$3')dx($1)')
67 pushdef(`dp', `set3(`X', `Y', `F', $1, $2, 0)define(`s', `set3(`x',
68   `y', `f', $1, $2, 0)')popdef(`$0')$0($@)')
69 define(`try', `ifelse(p$3_$4, `@', `$1', `decr($2), $3, $4, $5')')
70 define(`try1', `try(`0, $4, $5, $6', `$1', ifdef(`p$2_$3', `$2, $3',
71   `m$2_$3_$6'), $6)')
72 define(`try2', `try(`0, $4, $5, $6', `$1', ifdef(`p$2_$3', `$2, $3, $6',
73   `M$2_$3_$6'))')
74 define(`_move0', `incr($1), $2')
75 define(`_move1', `$1, incr($2)')
76 define(`_move2', `decr($1), $2')
77 define(`_move3', `$1, decr($2)')
78 define(`_move', `ifelse($1, 0, `$2, $3, $4', `$0(try$5($1,
79   $0$4($2, $3), $2, $3, $4), $5)')')
80 define(`move', `set3(`x', `y', `f', _$0($1, x, y, f, 1))define(`f',
81   eval((f+$2)%4))set3(`X', `Y', `F', _$0($1, X, Y, F, 2))define(`F',
82   eval((F+$2)%4))define(`a', 0)')
83 define(`do', `ifelse(`$1', `L', `move(a, 3)', `$1', `R', `move(a, 1)', `$1',
84   `;', `move(a, 0)define(`part1', eval(y*1000+x*4+f))define(`part2',
85   eval(Y*1000+X*4+F))', `define(`a', eval(a*10+$1))')')
86 pushdef(`do', `ifelse(`$1', `;', `dy(x, y)', `$1', `-', `dx(x)', `dp(x, y,
87   `$1')')')
89 ifdef(`__gnu__', `
90   patsubst(defn(`input'), `.', `do(`\&')')
91 ',`
92   define(`chew', `ifelse($1, 1, `do(`$2')', `$0(eval($1/2), substr(
93     `$2', 0, eval($1/2)))$0(eval($1-$1/2), substr(`$2', eval($1/2)))')')
94   chew(len(defn(`input')), defn(`input'))
97 divert`'part1
98 part2