use strict;
use warnings;
use v5.20;
use Data::Dumper;
use utf8;
my $SEATS = 100;
sub getKey($) {
my ($i) = @_;
}
sub test {
my @SEAT_SET = sort { rand() < 0.5 } ( 1 .. ${SEATS
} );
my %TICKETS = ();
for my $i ( 1 .. $SEATS ) {
$TICKETS{ getKey($i) } = $SEAT_SET[ $i - 1 ];
}
my %TICKETS_REST = %TICKETS;
my @humanOrder = sort { rand() < 0.5 } ( 1 .. $SEATS ); my $order = 0;
my $lastResult;
for my $i (@humanOrder) {
$order++;
my $name = getKey($i);
my $answerSeat = $TICKETS{$name};
my $choiseSeat;
if ( $order == 1 ) {
my $falseName = ( sort { rand() < 0.5 } keys(%TICKETS_REST) )[0]; $choiseSeat = $TICKETS_REST{$falseName};
delete $TICKETS_REST{$falseName}; if ( $name eq $falseName ) {
say "[OK] ${name} は 自分 の席に座りました";
$lastResult = 1;
}
else {
say "[NG] ${name} は ${falseName} の席に座りました";
$lastResult = 0;
}
}
else {
if ( exists $TICKETS_REST{$name} ) { $choiseSeat = $TICKETS_REST{$name};
say "[OK] ${name} は 自分 の席に座りました";
$lastResult = 1;
}
else {
# 席がない
my $falseName =
$choiseSeat = $TICKETS_REST{$falseName};
delete $TICKETS_REST{$falseName};
say "[NG] ${name} は ${falseName} の席に座りました";
$lastResult = 0;
}
}
}
}
my $TRIES = 1;
my $count = 0;
for(1..$TRIES) {
my $result = test();
$count += $result;
}
say "-"x50;
say
sprintf("%d回試行した結果は%fでした", $TRIES, $count / $TRIES);
dXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdjUuMjA7CnVzZSBEYXRhOjpEdW1wZXI7CnVzZSB1dGY4OwoKYmlubW9kZSBTVERPVVQsICI6ZW5jb2RpbmcodXRmOCkiOwpiaW5tb2RlIFNUREVSUiwgIjplbmNvZGluZyh1dGY4KSI7CgpteSAkU0VBVFMgPSAxMDA7CgpzdWIgZ2V0S2V5KCQpIHsKICAgIG15ICgkaSkgPSBAXzsKICAgIHJldHVybiAiSFVNQU5fJHtpfSI7Cn0KCnN1YiB0ZXN0IHsKICAgIG15IEBTRUFUX1NFVCA9IHNvcnQgeyByYW5kKCkgPCAwLjUgfSAoIDEgLi4gJHtTRUFUU30gKTsKCiAgICBteSAlVElDS0VUUyA9ICgpOwoKICAgIGZvciBteSAkaSAoIDEgLi4gJFNFQVRTICkgewogICAgICAgICRUSUNLRVRTeyBnZXRLZXkoJGkpIH0gPSAkU0VBVF9TRVRbICRpIC0gMSBdOwogICAgfQoKICAgIG15IEBFTlRFUl9PUkRFUiA9IHNvcnQgeyByYW5kKCkgPCAwLjUgfSBrZXlzICVUSUNLRVRTOwoKICAgIG15ICVUSUNLRVRTX1JFU1QgPSAlVElDS0VUUzsKCiAgICBteSBAaHVtYW5PcmRlciA9IHNvcnQgeyByYW5kKCkgPCAwLjUgfSAoIDEgLi4gJFNFQVRTICk7CiAgICBteSAkb3JkZXIgICAgICA9IDA7CgogICAgbXkgJGxhc3RSZXN1bHQ7CiAgICBmb3IgbXkgJGkgKEBodW1hbk9yZGVyKSB7CiAgICAgICAgJG9yZGVyKys7CgogICAgICAgIG15ICRuYW1lICAgICAgID0gZ2V0S2V5KCRpKTsKICAgICAgICBteSAkYW5zd2VyU2VhdCA9ICRUSUNLRVRTeyRuYW1lfTsKCiAgICAgICAgbXkgJGNob2lzZVNlYXQ7CiAgICAgICAgaWYgKCAkb3JkZXIgPT0gMSApIHsKICAgICAgICAgICAgbXkgJGZhbHNlTmFtZSA9ICggc29ydCB7IHJhbmQoKSA8IDAuNSB9IGtleXMoJVRJQ0tFVFNfUkVTVCkgKVswXTsKICAgICAgICAgICAgJGNob2lzZVNlYXQgPSAkVElDS0VUU19SRVNUeyRmYWxzZU5hbWV9OwogICAgICAgICAgICBkZWxldGUgJFRJQ0tFVFNfUkVTVHskZmFsc2VOYW1lfTsKICAgICAgICAgICAgaWYgKCAkbmFtZSBlcSAkZmFsc2VOYW1lICkgewogICAgICAgICAgICAgICAgc2F5ICJbT0tdICR7bmFtZX0g44GvIOiHquWIhiDjga7luK3jgavluqfjgorjgb7jgZfjgZ8iOwogICAgICAgICAgICAgICAgJGxhc3RSZXN1bHQgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgc2F5ICJbTkddICR7bmFtZX0g44GvICR7ZmFsc2VOYW1lfSDjga7luK3jgavluqfjgorjgb7jgZfjgZ8iOwogICAgICAgICAgICAgICAgJGxhc3RSZXN1bHQgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBpZiAoIGV4aXN0cyAkVElDS0VUU19SRVNUeyRuYW1lfSApIHsKICAgICAgICAgICAgICAgICRjaG9pc2VTZWF0ID0gJFRJQ0tFVFNfUkVTVHskbmFtZX07CiAgICAgICAgICAgICAgICBkZWxldGUgJFRJQ0tFVFNfUkVTVHskbmFtZX07CgogICAgICAgICAgICAgICAgc2F5ICJbT0tdICR7bmFtZX0g44GvIOiHquWIhiDjga7luK3jgavluqfjgorjgb7jgZfjgZ8iOwogICAgICAgICAgICAgICAgJGxhc3RSZXN1bHQgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgIyDluK3jgYzjgarjgYQKICAgICAgICAgICAgICAgIG15ICRmYWxzZU5hbWUgPQogICAgICAgICAgICAgICAgICAoIHNvcnQgeyByYW5kKCkgPCAwLjUgfSBrZXlzKCVUSUNLRVRTX1JFU1QpIClbMF07CiAgICAgICAgICAgICAgICAkY2hvaXNlU2VhdCA9ICRUSUNLRVRTX1JFU1R7JGZhbHNlTmFtZX07CiAgICAgICAgICAgICAgICBkZWxldGUgJFRJQ0tFVFNfUkVTVHskZmFsc2VOYW1lfTsKCiAgICAgICAgICAgICAgICBzYXkgIltOR10gJHtuYW1lfSDjga8gJHtmYWxzZU5hbWV9IOOBruW4reOBq+W6p+OCiuOBvuOBl+OBnyI7CiAgICAgICAgICAgICAgICAkbGFzdFJlc3VsdCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICRsYXN0UmVzdWx0Owp9CgpteSAkVFJJRVMgPSAxOwpteSAkY291bnQgPSAwOwpmb3IoMS4uJFRSSUVTKSB7CiAgICBteSAkcmVzdWx0ID0gdGVzdCgpOwogICAgJGNvdW50ICs9ICRyZXN1bHQ7Cn0Kc2F5ICItIng1MDsKc2F5IHNwcmludGYoIiVk5Zue6Kmm6KGM44GX44Gf57WQ5p6c44GvJWbjgafjgZfjgZ8iLCAkVFJJRVMsICRjb3VudCAvICRUUklFUyk7