Ah crap, you beat me to it. :)
Update with a fourth sub based on BrowserUK's suggestion. Gets another 2-5% over mine.
Oops, fixed error in u2 that made it look about 10% faster than it was. New timings too.
use Benchmark qw( cmpthese ) ;
my $digits = 2491306578;
cmpthese( -5, {
u1 => sub{
for ( 0 .. 9 ) { return 0 if $digits !~ /$_/;} return 1
+;
},
u2 => sub{
my @x = sort split //, $digits;
my $x = join "", @x;
$x =~ tr/0-9//s;
length $x == 10 ? return 1 : return 0;
},
u3 => sub {
return 0 if $digits =~ /(\d).*\1/; return 1;
},
u4 => sub {
return $digits !~ /(.).*\1/;
},
} );
__END__
All unique:
Rate u1 u2 u3 u4
u1 15504/s -- -75% -95% -95%
u2 62910/s 306% -- -78% -78%
u3 289343/s 1766% 360% -- -1%
u4 291910/s 1783% 364% 1% --
Not Unique:
Rate u1 u2 u3 u4
u1 17396/s -- -72% -98% -98%
u2 62887/s 262% -- -92% -92%
u3 748300/s 4202% 1090% -- -5%
u4 783739/s 4405% 1146% 5% --