day 16 optimize
[aoc_eblake.git] / 2017 / day16.m4
blob12db7069bd2a3e8d159de9c131860b5a2cbfab45
1 divert(-1)dnl -*- m4 -*-
2 # Usage: m4 [-Dfile=day16.input] day16.m4
4 include(`common.m4')ifelse(common(16), `ok', `',
5 `errprint(`Missing common initialization
6 ')m4exit(1)')
8 define(`perm', substr(ALPHA, 0, 16))
9 define(`name', substr(ALPHA, 0, 16))
10 define(`spin', `define(`perm', substr(perm, $1)`'substr(perm, 0, $1))')
11 define(`prep', `define(`S$1', `spin('eval(`16-$1')`)')')
12 forloop_arg(0, 15, `prep')
13 define(`xchg', `define(`perm', substr(perm, 0, $1)`'substr(perm, $2,
14   1)`'substr(perm, incr($1), eval(`$2-$1-1'))`'substr(perm, $1, 1)`'substr(
15   perm, incr($2)))')
16 define(`_prep', `define(`X$1_$2', `xchg($1, $2)')define(`X$2_$1',
17   defn(`X$1_$2'))')
18 define(`prep', `forloop(incr($1), 15, `_$0($1,', `)')')
19 forloop_arg(0, 14, `prep')
20 define(`part', `define(`name', translit(name, `$1$2', `$2$1'))')
21 define(`_prep', `$0_(substr(ALPHA, $1, 1), substr(ALPHA, $2, 1))')
22 define(`_prep_', `define(`P$1_$2', `part(`$1', `$2')')define(`P$2_$1',
23   defn(`P$1_$2'))')
24 forloop_arg(0, 14, `prep')
25 translit((include(defn(`file'))), alpha/, ALPHA`_')
26 define(`part1', translit(translit(perm, ALPHA, name), ALPHA, alpha))
28 define(`perm1e0', perm)define(`name1e0', name)
29 define(`grow', `_$0(`perm', $@)_$0(`name', $@)')
30 define(`_grow', `define(`$1$4', translit($1$2, ALPHA, $1$3))')
31 define(`grow10', `grow(`1e$1', `1e$1', `2e$1')grow(`2e$1', `2e$1',
32   `4e$1')grow(`1e$1', `4e$1', `5e$1')grow(`5e$1', `5e$1', `1e'incr($1))')
33 forloop_arg(0, 8, `grow10')
34 define(`part2', translit(translit(perm1e9, ALPHA, name1e9), ALPHA, alpha))
36 divert`'part1
37 part2