1 divert(-1)dnl -*- m4 -*-
2 # Usage: m4 [-Dhashsize=H] [-Dfile=day5.input] day5.m4
3 # Optionally use -Donly=[12] to skip a part
4 # Optionally use -Dverbose=1 to see some progress
6 include(`common.m4')ifelse(common(5, 65537), `ok', `',
7 `errprint(`Missing common initialization
10 define(`input', translit(include(defn(`file')), nl, `;'))
12 patsubst(defn(`input'), `\([^;]*\);', `pushdef(`list', `\1')')
14 define(`chew', `pushdef(`list', substr(`$1', 0, index(`$1', `;')))define(
15 `tail', substr(`$1', incr(index(`$1', `;'))))ifelse(index(defn(
16 `tail'), `;'), -1, `', `$0(defn(`tail'))')')
17 define(`split', `ifelse(eval($1 < 12), 1, `chew(`$2')', `$0(eval($1/2),
18 substr(`$2', 0, eval($1/2)))$0(eval(len(defn(`tail')) + $1 - $1/2),
19 defn(`tail')substr(`$2', eval($1/2)))')')
20 split(len(defn(`input')), defn(`input'))
22 define(`D', defn(`define'))define(`I', defn(`incr'))define(`C', defn(`decr'))
23 define(`N', defn(`defn'))define(`F', defn(`ifdef'))define(`E', defn(`ifelse'))
24 define(`rename', `define(`$2', defn(`$1'))popdef(`$1')')
25 define(`stat', `output(1, `...'decr($2))rename(`$0',
26 `do'eval(`$2+99999'))do($@)')
27 define(`prep', `define(`m$1_', eval($1+$2))define(`m$1', defn(ifdef(`m_$2',
29 define(`run', `define(`cnt', 0)define(`do0', defn(`stat'))_stack_foreach(
30 `list', `prep(cnt, ', `)define(`cnt', incr(cnt))', `t')do(0, 0)')
31 define(`do', `F(`m$1',`F(`$0$2',`$0$2',`$0')(m$1(`$1',m$1_),I(`$2'))',`$2')')
33 ifelse(defn(`only'), 2, `', `
34 define(`m', `D(`$0_',I(`$2'))`$2'')
35 define(`part1', run())
37 ifelse(defn(`only'), 1, `', `
38 define(`m', `E(`$1',`$2',`D(`$0',N(`m_1'))')D(`$0_',I(`$2'))`$2'')
39 define(`m_1', `D(`$0',N(`m_2'))D(`$0_',I(`$2'))`$2'')
40 define(`m_2', `D(`$0',N(`m_3'))D(`$0_',I(`$2'))`$2'')
41 define(`m_3', `D(`$0',N(`m_2'))D(`$0_',C(`$2'))`$2'')
42 define(`part2', run())