day 14 finish
[aoc_eblake.git] / 2016 / day9.m4
blob968d5582af5bbd9d1184e643dfe104e059ce59a1
1 divert(-1)dnl -*- m4 -*-
2 # Usage: m4 [-Dfile=day9.input] day9.m4
4 include(`common.m4')ifelse(common(9), `ok', `',
5 `errprint(`Missing common initialization
6 ')m4exit(1)')
8 include(`math64.m4')
9 define(`list', translit(include(defn(`file')), `()'nl, `<>'))
10 define(`part1', 0)define(`part2', 0)define(`c', 0)
11 define(`_visit_0', `ifelse(`$1', `<', `define(`a', 0)define(`$0',
12   defn(`$0_1'))', `ifdef(`g', `', `define(`part1', incr(part1))')define(
13   `part2', add64(part2, 1))')')
14 define(`_visit_1', `ifelse(`$1', `x', `define(`b', 0)define(`$0',
15   defn(`$0_2'))', `define(`a', eval(a*10 + $1))')')
16 define(`_visit_2', `ifelse(`$1', `>', `ifdef(`g', `', `define(`part1',
17   eval(part1 + a*b))')define(`$0', defn(`$0_0'))pushdef(`part1',
18   0)pushdef(`part2', 0)pushdef(`g', eval(c + a))pushdef(`b')', `define(`b',
19   eval(b*10 + $1))')')
20 define(`check', `ifelse(c, g, `define(`part2', add64(mul64(part2,
21   popdef(`b')b), popdef(`part2')part2))popdef(`part1')popdef(`g')$0()')')
22 define(`_visit', defn(`_visit_0'))
23 define(`visit', `define(`c', incr(c))_$0(`$1')check()')
24 ifdef(`__gnu__', `
25   patsubst(defn(`list'), `.', `visit(`\&')')
26 ',`
27   define(`Split', `ifelse($1, 1, `visit(`$2')', `$0(eval($1/2), substr(`$2',
28     0, eval($1/2)))$0(eval($1 - $1/2), substr(`$2', eval($1/2)))')')
29   Split(len(defn(`list')), defn(`list'))
32 divert`'part1
33 part2