day 6 fix bug
[aoc_eblake.git] / 2015 / day22.m4
blobb0c796b49c72c662e04b7a26a43da712a3e251b0
1 divert(-1)dnl -*- m4 -*-
2 # Usage: m4 [-Dfile=day22.input] [-Dhashsize=H] day22.m4
4 include(`common.m4')ifelse(common(22, 65537), `ok', `',
5 `errprint(`Missing common initialization
6 ')m4exit(1)')
8 define(`prep', `define(`boss', $3)define(`damage', $5)')
9 prep(translit(include(defn(`file')), ` 'nl, `,,'))
10 define(`part1', 100000)define(`part2', 1000000)
12 define(`cost0', 53)define(`cast0', `define(`boss', eval(boss - 4))')
13 define(`cost1', 73)define(`cast1', `define(`boss', decr(decr(boss)))define(`hp',
14   incr(incr(hp)))')
15 define(`cost2', 113)define(`cast2', `define(`shield', 6)')
16 define(`cost3', 173)define(`cast3', `define(`poison', 6)')
17 define(`cost4', 229)define(`cast4', `define(`recharge', 5)')
18 define(`cast', `ifelse(eval($2 > mana), 1, -, `define(`mana',
19   eval(mana - $2))define(`spent', eval(spent + $2))cast$1()')')
20 define(`win', `_$0($1, `part'incr(hard))')
21 define(`_win', `ifelse(eval($1 < $2), 1, `define(`$2', $1)')')
23 # gen spell hp mana spent shield poison recharge boss
24 define(`queue', `_$0(incr($1), shift($@))')
25 define(`_queue', `ifdef(`b$2_$3_$4_$5_$6_$7_$8_$9_'hard, `', `pushdef(`gen$1',
26   `$@')define(`b$2_$3_$4_$5_$6_$7_$8_$9_'hard)')')
27 define(`battle', `ifelse(eval($5 > defn(`part'incr(hard)) || $3 == hard), 1,
28   `', `define(`hp', eval($3 - hard))
29   define(`mana', $4)
30   define(`spent', $5)
31   define(`boss', $9)
32   define(`shield', ifelse($6, 0, 0, `decr($6)'))
33   define(`poison', ifelse($7, 0, 0, `decr($7)define(`boss', eval(boss - 3))'))
34   define(`recharge', ifelse($8, 0, 0, `decr($8)define(`mana',
35     eval(mana + 101))'))
36   ifelse(cast($2, cost$2), `', `
37   ifelse(shield, 0, `', `define(`shield', decr(shield))')
38   ifelse(poison, 0, `', `define(`boss', eval(boss - 3))define(`poison',
39     decr(poison))')
40   ifelse(recharge, 0, `', `define(`mana', eval(mana + 101))define(`recharge',
41     decr(recharge))')
42   ifelse(eval(boss <= 0), 1, `win(spent)', `
43   define(`hp', eval(hp - damage + ifelse(shield, 0, 0, 7)))
44   ifelse(eval(hp > 0), 1, `
45   queue($1, 0, hp, mana, spent, shield, poison, recharge, boss)
46   queue($1, 1, hp, mana, spent, shield, poison, recharge, boss)
47   ifelse(eval(shield | 1), 1, `queue($1, 2, hp, mana, spent, shield, poison,
48     recharge, boss)')
49   ifelse(eval(poison | 1), 1, `queue($1, 3, hp, mana, spent, shield, poison,
50     recharge, boss)')
51   ifelse(recharge, 0, `queue($1, 4, hp, mana, spent, shield, poison, recharge,
52     boss)')
53   ')')')')')
55 define(`do', `output(1, $1)_$0($1)ifdef(`gen'incr($1), `$0(incr($1))')')
56 define(`_do', `ifdef(`gen$1', `battle(gen$1)popdef(`gen$1')$0($1)')')
57 pushdef(`boss', boss)define(`hard', 0)
58 forloop(0, 4, `queue(-1, ', `, 50, 500, 0, 0, 0, 0, boss)')
59 do(0)
60 popdef(`boss')define(`hard', 1)
61 forloop(0, 4, `queue(-1, ', `, 50, 500, 0, 0, 0, 0, boss)')
62 do(0)
64 divert`'part1
65 part2