day 6 fix bug
[aoc_eblake.git] / 2022 / day03.m4
blob96771f534f48ae6275c93b7b9a52bfed7ad3e8be
1 divert(-1)dnl -*- m4 -*-
2 # Usage: m4 [-Dfile=day03.input] day03.m4
4 include(`common.m4')ifelse(common(03), `ok', `',
5 `errprint(`Missing common initialization
6 ')m4exit(1)')
8 dnl Input is mixed case random letters.  Avoid one-letter macro names, and
9 dnl any macro names ending in a trailing digit without _, so that we can
10 dnl ensure that an arbitrary substr of the input is either a single byte or
11 dnl concatenated with a digit to avoid accidental macro expansion.
12 define(`part1', 0)define(`part2', 0)define(`cnt', 1)
13 define(`prep', `define(substr('dquote(defn(`alpha'))`, decr($1), 1)_,
14 $1)define(substr('dquote(defn(`ALPHA'))`, decr($1), 1)_, eval($1 + 26))')
15 forloop_arg(1, 26, `prep')
16 define(`filter', `translit(``$1'', `$2''dquote(defn(`alpha'))dquote(
17 defn(`ALPHA'))`, `$2')')
18 define(`do_1', `define(`part1', eval(part1 + substr(filter(substr(`$1', $2),
19 substr(`$1', 0, $2)), 0, 1)_))')
20 define(`do_2', `define(`part2', eval(part2 + substr(filter(filter(`$1', `$2'),
21 `$3'), 0, 1)_))define(`cnt', 1)')
22 define(`do', `$0_1(`$2', eval(len(`$2')/2))ifelse($1, 3, `$0_2(defn(`s_1'),
23 defn(`s_2'), `$2')', `define(`s_$1', `$2')define(`cnt', incr($1))')')
25 define(`input', translit(include(defn(`file')), nl, `0'))
26 ifdef(`__gnu__', `
27   patsubst(defn(`input'), `\([^0]*\)0', `do(cnt, `\1')')
28 ', `
29   define(`_chew', `do(cnt, substr(`$1', 0, index(`$1', `0')))define(
30     `tail', substr(`$1', incr(index(`$1', `0')))1)ifelse(index(defn(`tail'),
31     `0'), -1, `', `$0(translit(dquote(defn(`tail')), 1))')')
32   define(`chew', `ifelse(eval($1 < 100), 1, `_$0(`$2')', `$0(eval($1/2),
33     substr(`$2', 0, eval($1/2)))$0(eval(len(defn(`tail')) - 1 + $1 - $1/2),
34     translit(dquote(defn(`tail')), 1)substr(`$2', eval($1/2)))')')
35   chew(len(defn(`input')), defn(`input'))
38 divert`'part1
39 part2