1 divert(-1)dnl -*- m4 -*-
2 # Usage: m4 [-Dfile=day12.input] day12.m4
4 include(`common.m4')ifelse(common(12), `ok', `',
5 `errprint(`Missing common initialization
8 define(`list', translit(include(file), nl, `;'))
9 define(`act', `$1_1($2)$1_2($2)')
11 define(`do', `patsubst(defn(`list'), `\([A-Z]\)\([^;]*\);', `act(`\1',\2)')')
13 define(`chew', `act(substr(`$1', 0, 1), (substr(`$1', 1, decr(index(`$1',
14 `;')))))define(`tail', substr(`$1', incr(index(`$1', `;'))))ifelse(index(
15 defn(`tail'), `;'), -1, `', `$0(defn(`tail'))')')
16 define(`split', `ifelse(eval($1 < 10), 1, `chew(`$2')', `$0(eval($1/2),
17 substr(`$2', 0, eval($1/2)))$0(eval(len(defn(`tail')) + $1 - $1/2),
18 defn(`tail')substr(`$2', eval($1/2)))')')
19 define(`do', `split(len(defn(`list')), defn(`list'))')
21 define(`abs', `ifelse(index($1, -), 0, `substr($1, 1)', $1)')
23 define(`x', 0)define(`y', 0)
25 define(`N_1', `define(`y', eval(y + $1))')
26 define(`E_1', `define(`x', eval(x + $1))')
27 define(`S_1', `define(`y', eval(y - $1))')
28 define(`W_1', `define(`x', eval(x - $1))')
29 define(`F_1', `dir()_1($1)')
30 define(`R_1', `define(`dir', substr(`ESWNESWN',
31 eval(index(`ESWN', dir) + $1/90), 1))')
32 define(`L_1', `R_1(eval(360 - $1))')
34 define(`X', 0)define(`Y', 0)define(`w', 10)define(`z', 1)
35 define(`N_2', `define(`z', eval(z + $1))')
36 define(`E_2', `define(`w', eval(w + $1))')
37 define(`S_2', `define(`z', eval(z - $1))')
38 define(`W_2', `define(`w', eval(w - $1))')
39 define(`F_2', `define(`X', eval(X + w * $1))define(`Y', eval(Y + z * $1))')
40 define(`R_2', `R_$1(w, z)')
41 define(`R_90', `define(`w', $2)define(`z', eval(- $1))')
42 define(`R_180', `define(`w', eval(- $1))define(`z', eval(- $2))')
43 define(`R_270', `define(`w', eval(- $2))define(`z', $1)')
44 define(`L_2', `R_2(eval(360 - $1))')
47 define(`part1', eval(abs(x) + abs(y)))
48 define(`part2', eval(abs(X) + abs(Y)))