Skip to content

Instantly share code, notes, and snippets.

@bluebear94
Created December 22, 2015 16:53
Show Gist options
  • Save bluebear94/0d9331712d8fa56af34f to your computer and use it in GitHub Desktop.
Save bluebear94/0d9331712d8fa56af34f to your computer and use it in GitHub Desktop.
use v6;
my %stats =
:boss-hp(51),
:player-hp(50),
:player-mana(500),
:shield(0),
:poison(0),
:recharge(0),
:elapsed(0);
my $recharge-max-mana = 229 + 53;
my $recharge-min-mana = 229;
my $boss-dmg = 9;
sub evolve(%stats is copy, $move) {
if %stats<poison> {
%stats<boss-hp> -= 3;
--%stats<poison>;
}
if %stats<recharge> {
%stats<player-mana> += 101;
--%stats<recharge>;
}
if %stats<shield> {
--%stats<shield>;
}
my $om = %stats<player-mana>;
given $move {
when "MagicMissile" {
%stats<player-mana> -= 53;
%stats<boss-hp> -= 4;
}
when "Drain" {
%stats<player-mana> -= 73;
%stats<boss-hp> -= 2;
%stats<player-hp> += 2;
}
when "Shield" {
return Nil if %stats<shield>;
%stats<player-mana> -= 113;
%stats<shield> = 6;
}
when "Poison" {
return Nil if %stats<poison>;
%stats<player-mana> -= 173;
%stats<poison> = 6;
}
when "Recharge" {
return Nil if %stats<recharge>;
%stats<player-mana> -= 229;
%stats<recharge> = 5;
}
}
%stats<elapsed> += $om - %stats<player-mana>;
return Nil if %stats<player-mana> < 0;
if %stats<poison> {
%stats<boss-hp> -= 3;
--%stats<poison>;
}
if %stats<recharge> {
%stats<player-mana> += 101;
--%stats<recharge>;
}
if %stats<shield> {
%stats<player-hp> += 7;
--%stats<shield>;
}
%stats<player-hp> -= $boss-dmg;
return Nil if %stats<player-hp> <= 0 && %stats<boss-hp> > 0;
return Nil if %stats<player-mana> < 53 && %stats<boss-hp> > 0;
return %stats;
}
sub min-turns(%stats, $elapsed) {
state $min = Inf;
return Inf if %stats<elapsed> >= $min;
if %stats<boss-hp> <= 0 && %stats<elapsed> < $min {
$min = %stats<elapsed>;
say "New record $min at $elapsed";
return $min;
}
my @res = <MagicMissile Drain Shield Poison Recharge>.map({evolve(%stats, $_)}).grep(Associative);
if my @winners = @res.grep({$_<boss-hp> <= 0 && $_<elapsed> < $min}) {
$min = min @winners.map(*<elapsed>);
say "New record $min at $elapsed";
return $min;
}
return min @res.map({min-turns($_, $elapsed + 1)});
}
say min-turns(%stats, 0);
use v6;
my %stats =
:boss-hp(51),
:player-hp(50),
:player-mana(500),
:shield(0),
:poison(0),
:recharge(0),
:elapsed(0);
my $recharge-max-mana = 229 + 53;
my $recharge-min-mana = 229;
my $boss-dmg = 9;
sub evolve(%stats is copy, $move) {
if %stats<poison> {
%stats<boss-hp> -= 3;
--%stats<poison>;
}
if %stats<recharge> {
%stats<player-mana> += 101;
--%stats<recharge>;
}
if %stats<shield> {
--%stats<shield>;
}
return Nil if --%stats<player-hp> <= 0;
my $om = %stats<player-mana>;
given $move {
when "MagicMissile" {
%stats<player-mana> -= 53;
%stats<boss-hp> -= 4;
}
when "Drain" {
%stats<player-mana> -= 73;
%stats<boss-hp> -= 2;
%stats<player-hp> += 2;
}
when "Shield" {
return Nil if %stats<shield>;
%stats<player-mana> -= 113;
%stats<shield> = 6;
}
when "Poison" {
return Nil if %stats<poison>;
%stats<player-mana> -= 173;
%stats<poison> = 6;
}
when "Recharge" {
return Nil if %stats<recharge>;
%stats<player-mana> -= 229;
%stats<recharge> = 5;
}
}
%stats<elapsed> += $om - %stats<player-mana>;
return Nil if %stats<player-mana> < 0;
if %stats<poison> {
%stats<boss-hp> -= 3;
--%stats<poison>;
}
if %stats<recharge> {
%stats<player-mana> += 101;
--%stats<recharge>;
}
if %stats<shield> {
%stats<player-hp> += 7;
--%stats<shield>;
}
%stats<player-hp> -= $boss-dmg;
return Nil if %stats<player-hp> <= 0 && %stats<boss-hp> > 0;
return Nil if %stats<player-mana> < 53 && %stats<boss-hp> > 0;
return %stats;
}
sub min-turns(%stats, $elapsed) {
state $min = Inf;
return Inf if %stats<elapsed> >= $min;
if %stats<boss-hp> <= 0 && %stats<elapsed> < $min {
$min = %stats<elapsed>;
say "New record $min at $elapsed";
return $min;
}
my @res = <MagicMissile Drain Shield Poison Recharge>.map({evolve(%stats, $_)}).grep(Associative);
if my @winners = @res.grep({$_<boss-hp> <= 0 && $_<elapsed> < $min}) {
$min = min @winners.map(*<elapsed>);
say "New record $min at $elapsed";
return $min;
}
return min @res.map({min-turns($_, $elapsed + 1)});
}
say min-turns(%stats, 0);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment