Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env perl
- use utf8;
- use strict;
- use warnings;
- use feature 'say';
- use open qw/:encoding(utf8) :std/;
- use Data::Printer {deparse => 1, caller_info => 1};
- # Perl入学式 2018 in東京 秋開講 第1回 ピザ会でのお題
- #
- # プレイヤーA, プレイヤーB どちらが勝率が高いか、Perlで解明せよ
- # ルール
- # プレイヤーA、プレイヤーBに手札が3枚配られる
- # 今回は配られる手札は固定とする
- # プレイヤーA:1, 5, 10
- # プレイヤーB:2, 2, 2
- #
- # 1 〜 40 の目がランダムにでるルーレットを回し、手札と同じ数字が出たら手札を捨てる
- # プレイヤーBのように同じ手札が複数枚ある場合には、同じ目が出ても捨てられるカードは1枚だけ
- # 先にカードがなくなった方が勝ち
- my $try = 1_000;
- my %users = (
- a => +[1, 5, 10],
- b => +[2, 2, 2],
- );
- my %results;
- for my $i (1 .. $try) {
- my $winner = run_game();
- $results{$winner}++;
- }
- p %results;
- sub run_game {
- # 初期化(初期値をコピー)
- my %count;
- for my $key (keys %users) {
- $count{$key}{$_}++ for @{$users{$key}};
- }
- # ゲーム開始
- while (1) {
- my $result = roulette();
- for my $key (keys %users) {
- if (exists $count{$key}{$result}) {
- delete $count{$key}{$result} if --$count{$key}{$result} == 0;
- }
- my @keys = keys %{$count{$key}};
- return $key if @keys == 0;
- }
- }
- return 'draw';
- }
- sub roulette { (int rand 40) + 1 }
- __END__
- 1_000_000 で試した結果
- Printing in line 33 of main.pl:
- {
- a 720912,
- b 279088
- }
Add Comment
Please, Sign In to add comment