sub pin {
srand;
my $pin;
my $i = 0;
while ( $i++ < 4 ) {
$pin .= int( rand(9) );
}
return $pin;
}
####
my @counterexamples;
my %digits = map { $_ => 1 } 0 .. 9;
for ( 1 .. 10000 ) {
my $pin = pin();
if ( $pin !~ /^\d\d\d\d$/ ) {
push @counterexamples => $pin;
}
if (%digits) {
foreach my $digit ( keys %digits ) {
if ( $pin =~ /$digit/ ) {
delete $digits{$digit};
}
}
}
}
ok !@counterexamples, 'All pin numbers should be four digits'
or diag +Data::Dumper->Dump( [ \@counterexamples ], ['*bad_pins'] );
ok !%digits, '... and all digits should be used'
or diag sprintf "Unused digits are '%s'", join ', ', sort keys %digits;
####
sub pin {
return sprintf "%04d" => int rand 10000;
}