Compare commits
23 Commits
9b2497f31e
...
64cb7fb370
Author | SHA1 | Date | |
---|---|---|---|
64cb7fb370 | |||
99430e8e26 | |||
0dec0bbf82 | |||
2a91587ae5 | |||
dbf878baf1 | |||
013b85fbbf | |||
4dcf7001ee | |||
05c88e5e56 | |||
4c62525fa7 | |||
fa52f5bd13 | |||
a141026754 | |||
6abd6c7d66 | |||
b429585457 | |||
5a17373244 | |||
eae352413b | |||
0b4e2449a1 | |||
daead25413 | |||
5b2e4a38d1 | |||
4e6399f5e2 | |||
1db00c45db | |||
a6731d4a67 | |||
5bd059970e | |||
9329c9f77a |
179
day22.js
179
day22.js
@ -1,179 +0,0 @@
|
||||
'use strict';
|
||||
|
||||
var bossStats = {
|
||||
hp: 71,
|
||||
damageAmt: 10,
|
||||
}
|
||||
|
||||
class Player {
|
||||
constructor(initial, isWizard) {
|
||||
this.history = [];
|
||||
this.initial = initial;
|
||||
this.isWizard = !!isWizard;
|
||||
|
||||
if (this.isWizard) {
|
||||
this.spells = [
|
||||
{
|
||||
cost: 53,
|
||||
effect: (m, o) => o.damage(4),
|
||||
},
|
||||
{
|
||||
cost: 73,
|
||||
effect: (m, o) => { o.damage(2); m.hp += 2; },
|
||||
},
|
||||
{
|
||||
cost: 113,
|
||||
start: (m, o) => m.armor += 7,
|
||||
effect: (m, o) => { },
|
||||
end: (m, o) => m.armor -= 7,
|
||||
duration: 6,
|
||||
},
|
||||
{
|
||||
cost: 173,
|
||||
effect: (m, o) => o.damage(3),
|
||||
duration: 6,
|
||||
},
|
||||
{
|
||||
cost: 229,
|
||||
effect: (m, o) => m.mana += 101,
|
||||
duration: 5,
|
||||
},
|
||||
];
|
||||
}
|
||||
|
||||
this.start();
|
||||
}
|
||||
|
||||
attack(opponent, spellIdx) {
|
||||
if (!this.isWizard) {
|
||||
opponent.damage(this.damageAmt);
|
||||
} else {
|
||||
this.history.push(spellIdx);
|
||||
var spell = this.spells[spellIdx];
|
||||
this.spent += spell.cost;
|
||||
this.mana -= spell.cost;
|
||||
|
||||
if (spell.duration) {
|
||||
var newSpell = {
|
||||
idx: spellIdx,
|
||||
effect: spell.effect,
|
||||
duration: spell.duration,
|
||||
};
|
||||
if (spell.start) {
|
||||
spell.start(this, opponent);
|
||||
}
|
||||
if (spell.end) {
|
||||
newSpell.end = spell.end;
|
||||
}
|
||||
this.activeSpells.push(newSpell);
|
||||
} else {
|
||||
spell.effect(this, opponent);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
damage(n) {
|
||||
this.hp -= Math.max(1, n - this.armor);
|
||||
}
|
||||
|
||||
duplicate() {
|
||||
var newPlayer = new Player(this.initial, this.isWizard);
|
||||
newPlayer.hp = this.hp;
|
||||
newPlayer.spent = this.spent;
|
||||
newPlayer.armor = this.armor;
|
||||
newPlayer.turn = this.turn;
|
||||
for (var i = 0; i < this.activeSpells.length; i++) {
|
||||
newPlayer.activeSpells.push(Object.assign({}, this.activeSpells[i]));
|
||||
}
|
||||
for (var i = 0; i < this.history.length; i++) {
|
||||
newPlayer.history.push(this.history[i]);
|
||||
}
|
||||
|
||||
if (this.isWizard)
|
||||
newPlayer.mana = this.mana;
|
||||
else
|
||||
newPlayer.damageAmt = this.damageAmt;
|
||||
|
||||
return newPlayer;
|
||||
}
|
||||
|
||||
takeTurn(opponent) {
|
||||
this.turn++;
|
||||
|
||||
for (var i = 0; i < this.activeSpells.length; i++) {
|
||||
var spell = this.activeSpells[i];
|
||||
|
||||
if (spell.duration > 0) {
|
||||
spell.effect(this, opponent);
|
||||
spell.duration--;
|
||||
|
||||
if (spell.duration === 0 && spell.end) {
|
||||
spell.end(this, opponent);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
start() {
|
||||
this.hp = this.initial.hp;
|
||||
this.spent = 0;
|
||||
this.armor = 0;
|
||||
this.turn = 0;
|
||||
this.activeSpells = [];
|
||||
if (this.isWizard)
|
||||
this.mana = this.initial.mana;
|
||||
else
|
||||
this.damageAmt = this.initial.damageAmt;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
var me = new Player({ hp: 50, mana: 500 }, true);
|
||||
var boss = new Player(bossStats);
|
||||
|
||||
var cheapestSpent = Infinity;
|
||||
|
||||
function playAllGames(me, boss, partTwo, depth) {
|
||||
depth = depth || 0;
|
||||
for (var i = 0; i < me.spells.length; i++) {
|
||||
var spellMatch = false;
|
||||
for (var j = 0; j < me.activeSpells.length; j++) {
|
||||
if (me.activeSpells[j].duration > 1 && i === me.activeSpells[j].idx) {
|
||||
spellMatch = true;;
|
||||
}
|
||||
}
|
||||
if (spellMatch)
|
||||
continue;
|
||||
if (me.spells[i].cost > me.mana) {
|
||||
continue;
|
||||
}
|
||||
|
||||
var newMe = me.duplicate();
|
||||
var newBoss = boss.duplicate();
|
||||
|
||||
if (partTwo)
|
||||
newMe.hp--;
|
||||
|
||||
newMe.takeTurn(newBoss);
|
||||
newBoss.takeTurn(newMe);
|
||||
newMe.attack(newBoss, i);
|
||||
|
||||
newMe.takeTurn(newBoss);
|
||||
newBoss.takeTurn(newMe);
|
||||
newBoss.attack(newMe);
|
||||
|
||||
|
||||
if (newBoss.hp <= 0) {
|
||||
cheapestSpent = Math.min(cheapestSpent, newMe.spent);
|
||||
}
|
||||
|
||||
if (newMe.hp > (partTwo ? 1 : 0) && newBoss.hp > 0 && newMe.spent < cheapestSpent)
|
||||
playAllGames(newMe, newBoss, partTwo, depth + 1);
|
||||
}
|
||||
}
|
||||
|
||||
playAllGames(me, boss);
|
||||
console.log('Part One:', cheapestSpent);
|
||||
cheapestSpent = Infinity;
|
||||
playAllGames(me, boss, true);
|
||||
console.log('Part Two:', cheapestSpent);
|
Loading…
Reference in New Issue
Block a user