+# Perl入学式 2018 in東京 秋開講 第1回 ピザ会でのお題
+# プレイヤーA, プレイヤーB どちらが勝率が高いか、Perlで解明せよ
+# プレイヤーA、プレイヤーBに手札が3枚配られる
+# 1 〜 40 の目がランダムにでるルーレットを回し、手札と同じ数字が出たら手札を捨てる
+# プレイヤーBのように同じ手札が複数枚ある場合には、同じ目が出ても捨てられるカードは1枚だけ
+# Perl入学式(1〜5回)の範囲内の要素だけでやってみる
+my $game_count = 1_000_000;
+my @user_a = ( 1, 5, 10 );
+my @user_b = ( 2, 2, 2 );
+for my $count ( 1 .. $game_count ) {
+# ルーレットを3回まわすサブルーチンから、3つの数を配列で受け取り
+ my @three_numbers = three_times_roulette();
+# user_a の手札(1,5,10)と、ルーレットで出た3つの数を配列 @user_a_aggrigate に集める
+ my @user_a_aggrigate = ( @user_a, @three_numbers );
+# user_b の手札(2,2,2)と、ルーレットで出た3つの数を配列 @user_b_aggrigate に集める
+ my @user_b_aggrigate = ( @user_b, @three_numbers );
+# 配列の中の数字の出現回数を調べるサブルーチン number_count に渡し、
+ my %hash_a = number_count(@user_a_aggrigate);
+ my %hash_b = number_count(@user_b_aggrigate);
+ # user_aの勝利条件は以下の2つを満たすこと
+ if ( keys %hash_a == 3 ) {
+ # ハッシュのvalueが2の時にカウントするスカラー変数
+ my $count_value_is_two = 0;
+ for my $num ( keys %hash_a ) {
+ # ハッシュのvalueが2だったらカウントを加える
+ if ( $hash_a{$num} == 2 ) {
+# カウントが3(ハッシュの3つのkeyに対するvalueがすべて2だった)であれば
+ if ( $count_value_is_two == 3 ) {
+ elsif ( keys %hash_b == 1 ) {
+ # user_a, user_b どちらでもない場合には引き分け
+print "user_a が勝った回数:$result{a}\n";
+print "user_b が勝った回数:$result{b}\n";
+print "引き分けになった回数:$result{even}\n";
+# ルーレットを回した結果をスカラー変数で返すサブルーチン
+ return int( rand(40) + 1 );
+# ルーレットを3回した結果を配列で返すサブルーチン
+sub three_times_roulette {
+ push @array, roulette();
+# 配列の中の数字をkeyに、出現回数をvalueに格納するハッシュを返すサブルーチン
+# 処理結果をためず、すぐに表示するようにするPerlの特殊変数をセット
+ if ( $count == $game_count ) {
+ # 試行回数が100,000(10万回)ごとに * を表示
+ elsif ( $count % 100000 == 0 ) {
+ # 試行回数が10,000(1万回)ごとに . を表示
+ elsif ( $count % 10000 == 0 ) {