Guest User

Untitled

a guest
Feb 18th, 2019
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.64 KB | None | 0 0
  1. #!/usr/bin/env perl
  2. use utf8;
  3. use strict;
  4. use warnings;
  5. use feature 'say';
  6. use open qw/:encoding(utf8) :std/;
  7. use Data::Printer {deparse => 1, caller_info => 1};
  8.  
  9. # Perl入学式 2018 in東京 秋開講 第1回 ピザ会でのお題
  10. #
  11. # プレイヤーA, プレイヤーB どちらが勝率が高いか、Perlで解明せよ
  12. # ルール
  13. # プレイヤーA、プレイヤーBに手札が3枚配られる
  14. # 今回は配られる手札は固定とする
  15. # プレイヤーA:1, 5, 10
  16. # プレイヤーB:2, 2, 2
  17. #
  18. # 1 〜 40 の目がランダムにでるルーレットを回し、手札と同じ数字が出たら手札を捨てる
  19. # プレイヤーBのように同じ手札が複数枚ある場合には、同じ目が出ても捨てられるカードは1枚だけ
  20. # 先にカードがなくなった方が勝ち
  21.  
  22. my $try = 1_000;
  23. my %users = (
  24. a => +[1, 5, 10],
  25. b => +[2, 2, 2],
  26. );
  27. my %results;
  28.  
  29. for my $i (1 .. $try) {
  30. my $winner = run_game();
  31. $results{$winner}++;
  32. }
  33. p %results;
  34.  
  35. sub run_game {
  36.  
  37. # 初期化(初期値をコピー)
  38. my %count;
  39. for my $key (keys %users) {
  40. $count{$key}{$_}++ for @{$users{$key}};
  41. }
  42.  
  43. # ゲーム開始
  44. while (1) {
  45. my $result = roulette();
  46. for my $key (keys %users) {
  47. if (exists $count{$key}{$result}) {
  48. delete $count{$key}{$result} if --$count{$key}{$result} == 0;
  49. }
  50. my @keys = keys %{$count{$key}};
  51. return $key if @keys == 0;
  52. }
  53. }
  54. return 'draw';
  55. }
  56.  
  57. sub roulette { (int rand 40) + 1 }
  58.  
  59. __END__
  60. 1_000_000 で試した結果
  61. Printing in line 33 of main.pl:
  62. {
  63. a 720912,
  64. b 279088
  65. }
Add Comment
Please, Sign In to add comment