day 16 part 2 wrong
[aoc_eblake.git] / 2021 / day16.m4
blobf1c29c87749c19785efba7040d6cad8eae2f75e3
1 divert(-1)dnl -*- m4 -*-
2 # Usage: m4 [-Dpacket=HEX | -Dfile=day16.input] day16.m4
4 include(`common.m4')ifelse(common(16), `ok', `',
5 `errprint(`Missing common initialization
6 ')m4exit(1)')
8 include(`math64.m4')
9 ifdef(`packet', `define(`input', defn(`packet'))',
10   `define(`input', translit(include(defn(`file')), nl))')
11 ifdef(`__gnu__', `
12   patsubst(defn(`input'), `.', `pushdef(`hex', `\&')')
13 ',`
14   define(`chew', `ifelse($1, 1, `pushdef(`hex', `$2')', `$0(eval($1/2), substr(
15     `$2', 0, eval($1/2)))$0(eval($1-$1/2), substr(`$2', eval($1/2)))')')
16   chew(len(defn(`input')), defn(`input'))
18 define(`_h2b', `pushdef(`bits', $4)pushdef(`bits', $3)pushdef(`bits',
19   $2)pushdef(`bits', $1)')
20 define(`h2b', `_$0(translit(`A,B,C,D', `ABCD', eval(`0x'$1, 2, 4)))')
21 define(`loop', `ifdef(`hex', `h2b(hex)popdef(`hex')loop()')')
22 loop()define(`part1', 0)
23 define(`remain', eval(len(defn(`input'))*4))define(`need', 0)
24 define(`pop', `define(`remain', decr(remain))bits`'popdef(`bits')')
25 define(`pop3', `eval(pop*4+pop*2+pop)')
26 define(`pop4', `eval(pop*8+pop*4+pop*2+pop)')
27 define(`pop11', `eval((pop3<<8)+(pop4<<4)+pop4)')
28 define(`pop15', `eval((pop3<<12)+(pop4<<8)+(pop4<<4)+pop4)')
30 define(`_parse', `parse$1(pop)')
31 define(`parse', `define(`part1', eval(part1+pop3))_$0(pop3)define(`need',
32   decr(need))ifelse(cond, `popdef(`cond')popdef(`need')', `,parse()')')
33 define(`parselit', `ifelse($1, 1, `$0(pop, add64(mul64(16, $2), pop4))', $2)')
34 define(`parseop', `ifelse($1, 0, `parselen(pop15)', `parsecnt(pop11)')')
35 define(`parse0', `add(parseop($1))')
36 define(`parse1', `mul(parseop($1))')
37 define(`parse2', `min(parseop($1))')
38 define(`min', `ifelse(`$2', `', $1, `$0(ifelse(lt64($1, $2), 1, $1, $2),
39   shift(shift($@)))')')
40 define(`parse3', `max(parseop($1))')
41 define(`max', `ifelse(`$2', `', $1, `$0(ifelse(lt64($2, $1), 1, $1, $2),
42   shift(shift($@)))')')
43 define(`parse4', `parselit($1, pop4)')
44 define(`parse5', `gt(parseop($1))')
45 define(`gt', `lt64($2, $1)')
46 define(`parse6', `lt64(parseop($1))')
47 define(`parse7', `ifelse(parseop($1), 1, 0)')
48 define(`parsecnt', `pushdef(`cond', `need,0')pushdef(`need', $1)parse()')
49 define(`parselen', `pushdef(`cond', `remain,'eval(remain-$1))pushdef(`need',
50   remain)parse()')
51 define(`part2', parsecnt(1))
53 divert`'part1
54 part2