day 16 part 2 wrong
[aoc_eblake.git] / 2016 / day17.m4
blob0e4c2e54cf2186a0eee1139aa344e72478121fe3
1 divert(-1)dnl -*- m4 -*-
2 # Usage: m4 [-Dprefix=XXX] [-Dhashsize=H] [-Dfile=day17.input] day17.m4
3 # Optionally use -Donly=[12] to skip a part
4 # Optionally use -Dverbose=[12] to see some progress
6 include(`common.m4')ifelse(common(17), `ok', `',
7 `errprint(`Missing common initialization
8 ')m4exit(1)')
10 ifdef(`prefix', `', `define(`prefix', translit(include(defn(`file')), nl))')
12 # Assume that prefix is [a-z]*.  Path uses U, D, L, R; but D and L are
13 # macros we use elsewhere.  Work around it by mapping U, W, Y, Z to the
14 # desired ascii values, then translit them for display.  Use _ for string end.
15 define(`N', defn(`define'))define(`E', defn(`eval'))
16 define(`L', ``($1<<$2|($1>>1&0x7fffffff)>>31-$2)'')
17 define(`F', `N(`$1',E(`$2+'L(E($1`+($4^$2&($3^$4))+$5+$7'),`$6')))')
18 define(`G', `N(`$1',E(`$2+'L(E($1`+($3^$4&($2^$3))+$5+$7'),`$6')))')
19 define(`H', `N(`$1',E(`$2+'L(E($1`+($2^$3^$4)+$5+$7'),`$6')))')
20 define(`I', `N(`$1',E(`$2+'L(E($1`+($3^($2|~$4))+$5+$7'),`$6')))')
21 define(`set', `define(`V$1', eval($1 + $2))')
22 forloop(0, 9, `set(', `, 48)')
23 define(`set', `define(`V'eval(9 + $1, 36), eval($1 + $2))')
24 forloop(1, 26, `set(', `, 96)')
25 define(`VU', 85)define(`VW', 68)define(`VY', 76)define(`VZ', 82)
26 define(`V_', 128)
27 define(`S0', `N(`X$2',$1)')
28 define(`S1', `N(`X$2',E(X$2|$1`<<8'))')
29 define(`S2', `N(`X$2',E(X$2|$1`<<16'))')
30 define(`S3', `N(`X$2',E(X$2|$1`<<24'))')
31 define(`_P', `ifelse(`$1',,,`S$3(`V'substr(`$1',0,1),$2,$3)$0(
32   substr(`$1',1),ifelse($3,3,`incr($2),0',`$2,incr($3)'))')')
33 define(`P', forloop(0, 15, ``N(`X''', ``,0)'')`_$0(`$1',0,0)')
34 define(`K', `E(`($1&0x00f0)>0x00a0'),E(`($1&0x000f)>0x000a'),'dnl
35 `E(`($1&0xf000)>0xa000'),E(`($1&0x0f00)>0x0a00')')
36 define(`md5', `K($0_(translit(`$1_',`DLR',`WYZ'),len(`$1'),`1732584193','dnl
37 ``-271733879',`-1732584194',`271733878'))')
38 define(`md5_', `ifelse(E(len(`$1')<=56),1,`P(`$1')N(`X14',E(`$2*8'))_md5(''dnl
39 ```$3',`$4',`$5',`$6')',`$0(substr(`$1',64),`$2',P(substr(`$1',0,64))_md5(''dnl
40 ```$3',`$4',`$5',`$6'))')')
41 define(`_md5', `N(`A',`$1')N(`B',`$2')N(`C',`$3')N(`D',`$4')'dnl
42 `F(`A',B,C,D,X0,7,`0xd76aa478')'dnl
43 `F(`D',A,B,C,X1,12,`0xe8c7b756')'dnl
44 `F(`C',D,A,B,X2,17,`0x242070db')'dnl
45 `F(`B',C,D,A,X3,22,`0xc1bdceee')'dnl
46 `F(`A',B,C,D,X4,7,`0xf57c0faf')'dnl
47 `F(`D',A,B,C,X5,12,`0x4787c62a')'dnl
48 `F(`C',D,A,B,X6,17,`0xa8304613')'dnl
49 `F(`B',C,D,A,X7,22,`0xfd469501')'dnl
50 `F(`A',B,C,D,X8,7,`0x698098d8')'dnl
51 `F(`D',A,B,C,X9,12,`0x8b44f7af')'dnl
52 `F(`C',D,A,B,X10,17,`0xffff5bb1')'dnl
53 `F(`B',C,D,A,X11,22,`0x895cd7be')'dnl
54 `F(`A',B,C,D,X12,7,`0x6b901122')'dnl
55 `F(`D',A,B,C,X13,12,`0xfd987193')'dnl
56 `F(`C',D,A,B,X14,17,`0xa679438e')'dnl
57 `F(`B',C,D,A,X15,22,`0x49b40821')'dnl
58 `G(`A',B,C,D,X1,5,`0xf61e2562')'dnl
59 `G(`D',A,B,C,X6,9,`0xc040b340')'dnl
60 `G(`C',D,A,B,X11,14,`0x265e5a51')'dnl
61 `G(`B',C,D,A,X0,20,`0xe9b6c7aa')'dnl
62 `G(`A',B,C,D,X5,5,`0xd62f105d')'dnl
63 `G(`D',A,B,C,X10,9,`0x02441453')'dnl
64 `G(`C',D,A,B,X15,14,`0xd8a1e681')'dnl
65 `G(`B',C,D,A,X4,20,`0xe7d3fbc8')'dnl
66 `G(`A',B,C,D,X9,5,`0x21e1cde6')'dnl
67 `G(`D',A,B,C,X14,9,`0xc33707d6')'dnl
68 `G(`C',D,A,B,X3,14,`0xf4d50d87')'dnl
69 `G(`B',C,D,A,X8,20,`0x455a14ed')'dnl
70 `G(`A',B,C,D,X13,5,`0xa9e3e905')'dnl
71 `G(`D',A,B,C,X2,9,`0xfcefa3f8')'dnl
72 `G(`C',D,A,B,X7,14,`0x676f02d9')'dnl
73 `G(`B',C,D,A,X12,20,`0x8d2a4c8a')'dnl
74 `H(`A',B,C,D,X5,4,`0xfffa3942')'dnl
75 `H(`D',A,B,C,X8,11,`0x8771f681')'dnl
76 `H(`C',D,A,B,X11,16,`0x6d9d6122')'dnl
77 `H(`B',C,D,A,X14,23,`0xfde5380c')'dnl
78 `H(`A',B,C,D,X1,4,`0xa4beea44')'dnl
79 `H(`D',A,B,C,X4,11,`0x4bdecfa9')'dnl
80 `H(`C',D,A,B,X7,16,`0xf6bb4b60')'dnl
81 `H(`B',C,D,A,X10,23,`0xbebfbc70')'dnl
82 `H(`A',B,C,D,X13,4,`0x289b7ec6')'dnl
83 `H(`D',A,B,C,X0,11,`0xeaa127fa')'dnl
84 `H(`C',D,A,B,X3,16,`0xd4ef3085')'dnl
85 `H(`B',C,D,A,X6,23,`0x04881d05')'dnl
86 `H(`A',B,C,D,X9,4,`0xd9d4d039')'dnl
87 `H(`D',A,B,C,X12,11,`0xe6db99e5')'dnl
88 `H(`C',D,A,B,X15,16,`0x1fa27cf8')'dnl
89 `H(`B',C,D,A,X2,23,`0xc4ac5665')'dnl
90 `I(`A',B,C,D,X0,6,`0xf4292244')'dnl
91 `I(`D',A,B,C,X7,10,`0x432aff97')'dnl
92 `I(`C',D,A,B,X14,15,`0xab9423a7')'dnl
93 `I(`B',C,D,A,X5,21,`0xfc93a039')'dnl
94 `I(`A',B,C,D,X12,6,`0x655b59c3')'dnl
95 `I(`D',A,B,C,X3,10,`0x8f0ccc92')'dnl
96 `I(`C',D,A,B,X10,15,`0xffeff47d')'dnl
97 `I(`B',C,D,A,X1,21,`0x85845dd1')'dnl
98 `I(`A',B,C,D,X8,6,`0x6fa87e4f')'dnl
99 `I(`D',A,B,C,X15,10,`0xfe2ce6e0')'dnl
100 `I(`C',D,A,B,X6,15,`0xa3014314')'dnl
101 `I(`B',C,D,A,X13,21,`0x4e0811a1')'dnl
102 `I(`A',B,C,D,X4,6,`0xf7537e82')'dnl
103 `I(`D',A,B,C,X11,10,`0xbd3af235')'dnl
104 `I(`C',D,A,B,X2,15,`0x2ad7d2bb')'dnl
105 `I(`B',C,D,A,X9,21,`0xeb86d391')($1+A),($2+B),($3+C),($4+D)')
107 define(`cnt', 0)define(`part2', 0)
108 define(`visit', `ifelse(E(cnt%1000), 0, `output(1, `...'cnt)')N(`cnt',
109   incr(cnt))ifelse($1$2,  33, `ifelse(ifdef(`part1', `eval(len(`$3') <
110   len(part1))', 1), 1, `define(`part1', `$3')')ifelse(eval(len(`$3') > part2),
111   1, `define(`part2', len(`$3'))')', `_$0($1, $2, `$3', md5(''prefix```$3'))')')
112 define(`_visit', `ifelse($2, 0, `', $4, 1, `visit($1, decr($2),
113   `$3U')')ifelse($2, 3, `', $5, 1, `visit($1, incr($2), `$3D')')ifelse($1, 0,
114   `', $6, 1, `visit(decr($1), $2, `$3L')')ifelse($1, 3, `', $7, 1,
115   `visit(incr($1), $2, `$3R')')')
116 ifelse(ifdef(`only', `only', 0), 1, `
117   define(`_visit', `ifelse(ifdef(`part1', `eval(len(`$3') > len(part1))', 0),
118   1, `','dquote(defn(`_visit'))`)')
120 visit(0, 0, `')
122 divert`'part1
123 part2