day 12 part 2 incomplete
[aoc_eblake.git] / 2020 / day4.m4
blob159dab21c6636fa499eac4a4ae8fa89ebfcc5a3e
1 divert(-1)dnl -*- m4 -*-
2 # Usage: m4 [-Dfile=day4.input] day4.m4
4 include(`common.m4')ifelse(common(4), `ok', `',
5 `errprint(`Missing common initialization
6 ')m4exit(1)')
8 define(`part1', 0)define(`part2', 0)
9 define(`list', translit(include(defn(`file'))nl, `#: 'nl, `H_..')))
10 ifdef(`__gnu__', `
11   define(`list', patsubst(defn(`list'), `\.\.', `;'))
12   patsubst(defn(`list'), `\([^;]*\);', `pushdef(`line', `\1')')
13 ', `
14   define(`chew', `pushdef(`line', substr(`$1', 0, index(`$1', `..')))define(
15     `tail', substr(`$1', incr(incr(index(`$1', `..')))))ifelse(
16     index(defn(`tail'), `..'), -1, `', `$0(defn(`tail'))')')
17   define(`split', `ifelse(eval($1 < 160), 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(`list')), defn(`list'))
22 define(`bound', `eval($1 >= $2 && $1 <= $3)')
23 define(`byr_', `bound($1, 1920, 2002)')
24 define(`iyr_', `bound($1, 2010, 2020)')
25 define(`eyr_', `bound($1, 2020, 2030)')
26 define(`hgt_', `translit($1, 0123456789)vh(translit($1, `cmin'))')
27 define(`vh', 0)
28 define(`cmvh', `bound($1, 150, 193)')
29 define(`invh', `bound($1, 59, 76)')
30 define(`hcl_', `ifelse(`H'substr(`$1', 0, 1)`'len(`$1'), translit(`$1',
31   `0123456789abcdef')`H7', 1, 0)')
32 define(`ecl_', `ifelse(`$1', `amb', 1, `$1', `blu', 1, `$1', `brn', 1,
33   `$1', `gry', 1, `$1', `grn', 1, `$1', `hzl', 1, `$1', `oth', 1, 0)')
34 define(`pid_', `ifelse(len($1)len(translit($1, 0123456789)), 90, 1, 0)')
35 define(`cid_')
36 define(`wrap', `define(`$1_', `define(`r', defn(`r')'defn(`$1_')`)')')
37 wrap(`byr')wrap(`iyr')wrap(`eyr')wrap(`hgt')wrap(`hcl')wrap(`ecl')wrap(`pid')
38 define(`_', `ifelse(r, 1111111, `define(`part2', incr(part2))', len(r), 7,
39   `define(`part1', incr(part1))')define(`r')')
40 define(`do', `substr(`$1', 0, 3)_(substr(`$1', 4))')
41 define(`doline', `foreach(`do', translit(`$1', `.', `,'),)')
42 stack_foreach(`line', `doline')
43 define(`part1', eval(part1 + part2))
45 divert`'part1
46 part2