day 6 fix bug
[aoc_eblake.git] / 2021 / day10.m4
blob9ee4b8595ba9502979885bb546c584c16295af8a
1 divert(-1)dnl -*- m4 -*-
2 # Usage: m4 [-Dfile=day10.input] day10.m4
4 include(`common.m4')ifelse(common(10), `ok', `',
5 `errprint(`Missing common initialization
6 ')m4exit(1)')
8 # Mismatched () are evil. Assume that the first '(' will come before any ')',
9 # and abuse changecom to read in everything long enough to translit it.
10 # For that to work, we can't use common.m4's include() wrapper.
11 exists(defn(`file'), `', `errprintn(`Could not locate file $1')m4exit(1)')
12 define(`input', translit(_include(defn(`file')changecom(`(',
13   nl-))-changecom`'changecom(`#'), `([{<>}])'nl-, `ABCDEFGH;'))
14 include(`math64.m4')
15 define(`part1', 0)define(`count', 0)
16 define(`sH', 1)
17 define(`sG', 2)
18 define(`sF', 3)
19 define(`sE', 4)
20 define(`incomplete', `ifdef(`s', `$0(add64(mul64($1, 5), defn(`s's))popdef(
21   `s'))', `$1')')
22 define(`score', `define(`arr'count, $1)define(`count', incr(count))')
23 define(`illegal', `ifelse(s, `$1', `popdef(`s')', `define(`part1',
24   eval(part1+$2))pushdef(`do', defn(`bad'))')')
25 define(`bad', `ifelse(`$1', `;', `popdef(`$0')undefine(`s')')')
26 define(`checkA', `pushdef(`s', `H')')
27 define(`checkB', `pushdef(`s', `G')')
28 define(`checkC', `pushdef(`s', `F')')
29 define(`checkD', `pushdef(`s', `E')')
30 define(`checkH', `illegal(`H', `3')')
31 define(`checkG', `illegal(`G', `57')')
32 define(`checkF', `illegal(`F', `1197')')
33 define(`checkE', `illegal(`E', `25137')')
34 define(`do', `ifelse(`$1', `;', `score(incomplete(0))', `check$1()')')
35 ifdef(`__gnu__', `
36   patsubst(defn(`input'), `.', `do(`\&')')
37 ',`
38   define(`chew', `ifelse($1, 1, `do(`$2')', `$0(eval($1/2), substr(
39     `$2', 0, eval($1/2)))$0(eval($1-$1/2), substr(`$2', eval($1/2)))')')
40   chew(len(defn(`input')), defn(`input'))
42 define(`swap', `define(`arr$1', arr$2`'define(`arr$2', arr$1))')
43 define(`_partition', `ifelse(lt64(x, arr$1), 1, `swap(i, $1)define(`i',
44   incr(i))')')
45 define(`partition', `define(`x', arr$2)define(`i', $1)forloop_arg($1, decr($2),
46   `_$0')swap(i, $2)')
47 define(`kth', `partition($1, $2)ifelse(eval(i - $1 == $3 - 1), 1,
48   `defn(`arr'i)', eval(i - $1 > $3 - 1), 1, `kth($1, decr(i), $3)',
49   `kth(incr(i), $2, eval($3 - i + $1 - 1))')')
50 define(`part2', kth(0, decr(count), eval(count/2 + 1)))
52 divert`'part1
53 part2