fork download
  1. #!perl
  2.  
  3. use strict;
  4. use warnings;
  5.  
  6. use Data::Dumper;
  7. $Data::Dumper::Sortkeys = 1;
  8.  
  9. my $PURIFY = 1;
  10. my $SILENCE = 2;
  11. my $WATCHER = 3;
  12. my $STATUE = 4;
  13.  
  14. my $TURNS = 4;
  15. my $HAND_SIZE = 3;
  16.  
  17. my %results = ();
  18. for(1 .. 1_000) {
  19. $results{ sim() } ++;
  20. }
  21.  
  22. print Dumper( \%results );
  23.  
  24.  
  25. sub sim {
  26. my @deck = (
  27. ( 0 ) x 22,
  28. ( $PURIFY ) x 2,
  29. ( $SILENCE ) x 2,
  30. ( $WATCHER ) x 2,
  31. ( $STATUE ) x 2,
  32. );
  33. shuffle( \@deck );
  34. my @hand = draw( $HAND_SIZE, \@deck );
  35.  
  36. # mulligan
  37. my @mulligan = ();
  38. my @keep = ();
  39. my $spell = 0;
  40. my $target = 0;
  41. while(@hand) {
  42. my $card = shift @hand;
  43. if(not $card) {
  44. push @mulligan, $card;
  45. }
  46. elsif($card == $PURIFY
  47. or $card == $SILENCE
  48. ) {
  49. if($spell) {
  50. push @mulligan, $card;
  51. }
  52. else {
  53. push @keep, $card;
  54. $spell ++;
  55. }
  56. }
  57. elsif($card == $WATCHER
  58. or $card == $STATUE
  59. ) {
  60. if($target) {
  61. push @mulligan, $card;
  62. }
  63. else {
  64. push @keep, $card;
  65. $target ++;
  66. }
  67. }
  68. }
  69.  
  70. @hand = ( @keep, draw( scalar @mulligan, \@deck ) );
  71. push @deck, @mulligan;
  72. shuffle( \@deck );
  73.  
  74. return 0 if checkHand( @hand );
  75.  
  76. for( 1 .. $TURNS ) {
  77. push @hand, draw( 1, \@deck );
  78. return $_ if checkHand( @hand );
  79. }
  80.  
  81. return -1;
  82. }
  83.  
  84. sub shuffle {
  85. my ($deck) = @_;
  86.  
  87. my $i = @{ $deck };
  88. while(-- $i) {
  89. my $j = int rand( $i + 1 );
  90. @{ $deck }[ $i, $j ] = @{ $deck }[ $j, $i ];
  91. }
  92.  
  93. }
  94.  
  95. sub draw {
  96. my ($count, $deck) = @_;
  97.  
  98. my @hand = ();
  99. for(1 .. $count) {
  100. push @hand, shift @{ $deck };
  101. }
  102.  
  103. return @hand;
  104. }
  105.  
  106. sub checkHand {
  107. my @hand = @_;
  108.  
  109. my $spell = 0;
  110. my $target = 0;
  111. for my $card (@hand) {
  112. if($card == $SILENCE
  113. or $card == $PURIFY
  114. ) {
  115. $spell ++;
  116. }
  117. elsif($card == $WATCHER
  118. or $card == $STATUE
  119. ) {
  120. $target ++;
  121. }
  122. }
  123.  
  124. return ($spell and $target);
  125. }
  126.  
Success #stdin #stdout 0.09s 7288KB
stdin
Standard input is empty
stdout
$VAR1 = {
          '-1' => 379,
          '0' => 285,
          '1' => 89,
          '2' => 105,
          '3' => 73,
          '4' => 69
        };