use strict;
use warnings;
use v5.20;
use Data::Dumper;
use utf8;
#binmode STDOUT, ":encoding(cp932)";
#binmode STDERR, ":encoding(cp932)";
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 ) {
#warn "[OK] ${name} は自分の席に座りました";
$lastResult = 1;
}
else {
#warn "[NG] ${name} は ${falseName}の席に座りました";
$lastResult = 0;
}
}
else {
if ( exists $TICKETS_REST{$name} ) { $choiseSeat = $TICKETS_REST{$name};
#warn "[OK] ${name} は自分の席に座りました";
$lastResult = 1;
}
else {
# 席がない
my $falseName =
$choiseSeat = $TICKETS_REST{$falseName};
delete $TICKETS_REST{$falseName};
#warn "[NG] ${name} は ${falseName}の席に座りました";
$lastResult = 0;
}
}
}
}
my $TRIES = 100;
my $count = 0;
for(1..$TRIES) {
my $result = test();
$count += $result;
}
say
sprintf("%d回試行した結果は%fでした", $TRIES, $count / $TRIES);
dXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdjUuMjA7CnVzZSBEYXRhOjpEdW1wZXI7CnVzZSB1dGY4OwoKI2Jpbm1vZGUgU1RET1VULCAiOmVuY29kaW5nKGNwOTMyKSI7CiNiaW5tb2RlIFNUREVSUiwgIjplbmNvZGluZyhjcDkzMikiOwoKbXkgJFNFQVRTID0gMTAwOwoKc3ViIGdldEtleSgkKSB7CiAgICBteSAoJGkpID0gQF87CiAgICByZXR1cm4gIkhVTUFOXyR7aX0iOwp9CgpzdWIgdGVzdCB7CiAgICBteSBAU0VBVF9TRVQgPSBzb3J0IHsgcmFuZCgpIDwgMC41IH0gKCAxIC4uICR7U0VBVFN9ICk7CgogICAgbXkgJVRJQ0tFVFMgPSAoKTsKCiAgICBmb3IgbXkgJGkgKCAxIC4uICRTRUFUUyApIHsKICAgICAgICAkVElDS0VUU3sgZ2V0S2V5KCRpKSB9ID0gJFNFQVRfU0VUWyAkaSAtIDEgXTsKICAgIH0KCiAgICBteSBARU5URVJfT1JERVIgPSBzb3J0IHsgcmFuZCgpIDwgMC41IH0ga2V5cyAlVElDS0VUUzsKCiAgICBteSAlVElDS0VUU19SRVNUID0gJVRJQ0tFVFM7CgogICAgbXkgQGh1bWFuT3JkZXIgPSBzb3J0IHsgcmFuZCgpIDwgMC41IH0gKCAxIC4uICRTRUFUUyApOwogICAgbXkgJG9yZGVyICAgICAgPSAwOwoKICAgIG15ICRsYXN0UmVzdWx0OwogICAgZm9yIG15ICRpIChAaHVtYW5PcmRlcikgewogICAgICAgICRvcmRlcisrOwoKICAgICAgICBteSAkbmFtZSAgICAgICA9IGdldEtleSgkaSk7CiAgICAgICAgbXkgJGFuc3dlclNlYXQgPSAkVElDS0VUU3skbmFtZX07CgogICAgICAgIG15ICRjaG9pc2VTZWF0OwogICAgICAgIGlmICggJG9yZGVyID09IDEgKSB7CiAgICAgICAgICAgIG15ICRmYWxzZU5hbWUgPSAoIHNvcnQgeyByYW5kKCkgPCAwLjUgfSBrZXlzKCVUSUNLRVRTX1JFU1QpIClbMF07CiAgICAgICAgICAgICRjaG9pc2VTZWF0ID0gJFRJQ0tFVFNfUkVTVHskZmFsc2VOYW1lfTsKICAgICAgICAgICAgZGVsZXRlICRUSUNLRVRTX1JFU1R7JGZhbHNlTmFtZX07CiAgICAgICAgICAgIGlmICggJG5hbWUgZXEgJGZhbHNlTmFtZSApIHsKICAgICAgICAgICAgICAgICN3YXJuICJbT0tdICR7bmFtZX0g44Gv6Ieq5YiG44Gu5bit44Gr5bqn44KK44G+44GX44GfIjsKICAgICAgICAgICAgICAgICRsYXN0UmVzdWx0ID0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICN3YXJuICJbTkddICR7bmFtZX0g44GvICR7ZmFsc2VOYW1lfeOBruW4reOBq+W6p+OCiuOBvuOBl+OBnyI7CiAgICAgICAgICAgICAgICAkbGFzdFJlc3VsdCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGlmICggZXhpc3RzICRUSUNLRVRTX1JFU1R7JG5hbWV9ICkgewogICAgICAgICAgICAgICAgJGNob2lzZVNlYXQgPSAkVElDS0VUU19SRVNUeyRuYW1lfTsKICAgICAgICAgICAgICAgIGRlbGV0ZSAkVElDS0VUU19SRVNUeyRuYW1lfTsKCiAgICAgICAgICAgICAgICAjd2FybiAiW09LXSAke25hbWV9IOOBr+iHquWIhuOBruW4reOBq+W6p+OCiuOBvuOBl+OBnyI7CiAgICAgICAgICAgICAgICAkbGFzdFJlc3VsdCA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAjIOW4reOBjOOBquOBhAogICAgICAgICAgICAgICAgbXkgJGZhbHNlTmFtZSA9CiAgICAgICAgICAgICAgICAgICggc29ydCB7IHJhbmQoKSA8IDAuNSB9IGtleXMoJVRJQ0tFVFNfUkVTVCkgKVswXTsKICAgICAgICAgICAgICAgICRjaG9pc2VTZWF0ID0gJFRJQ0tFVFNfUkVTVHskZmFsc2VOYW1lfTsKICAgICAgICAgICAgICAgIGRlbGV0ZSAkVElDS0VUU19SRVNUeyRmYWxzZU5hbWV9OwoKICAgICAgICAgICAgICAgICN3YXJuICJbTkddICR7bmFtZX0g44GvICR7ZmFsc2VOYW1lfeOBruW4reOBq+W6p+OCiuOBvuOBl+OBnyI7CiAgICAgICAgICAgICAgICAkbGFzdFJlc3VsdCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICRsYXN0UmVzdWx0Owp9CgpteSAkVFJJRVMgPSAxMDA7Cm15ICRjb3VudCA9IDA7CmZvcigxLi4kVFJJRVMpIHsKICAgIG15ICRyZXN1bHQgPSB0ZXN0KCk7CiAgICAkY291bnQgKz0gJHJlc3VsdDsKfQpzYXkgc3ByaW50ZigiJWTlm57oqabooYzjgZfjgZ/ntZDmnpzjga8lZuOBp+OBl+OBnyIsICRUUklFUywgJGNvdW50IC8gJFRSSUVTKTs=