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