print join(', ', map { $lights{ $_ } ? $_ : () }
( 1..20_000)
)."\n";
####
#!/usr/bin/perl
use strict;
use warnings;
use Benchmark qw(cmpthese);
my $duckyd_answer;
sub duckyd {
my %lights = map { $_ => 1 } ( 1..20_000 );
foreach my $flipper ( 2..20_000) {
for( my $i = $flipper; $i <= 20_000; $i += $flipper ){
$lights{ $i } = !$lights{ $i };
}
}
$duckyd_answer = join(', ', grep { defined $_ }
map { $lights{ $_ } ? $_ : undef }
( 1..20_000)
);
}
my $duckyd2_answer;
sub duckyd2 {
my %lights = map { $_ => 1 } ( 1..20_000 );
foreach my $flipper ( 2..20_000) {
for( my $i = $flipper; $i <= 20_000; $i += $flipper ){
$lights{ $i } = !$lights{ $i };
}
}
$duckyd2_answer = join(', ', grep { $lights{ $_ } }
( 1..20_000)
);
}
my $tanktalus_answer;
sub tanktalus {
my @lights = (1) x 20_000;
foreach my $flipper ( 2..20_000) {
for( my $i = $flipper; $i <= 20_000; $i += $flipper ){
$lights[$i-1] = !$lights[$i-1];
}
}
$tanktalus_answer = join(', ', grep { $lights[$_-1] } 1..20_000);
}
cmpthese(-1,
{
duckyd => \&duckyd,
duckyd2 => \&duckyd2,
tanktalus => \&tanktalus,
},
);
print "duckyd answer: $duckyd_answer\n";
print "duckyd2 answer: $duckyd2_answer\n";
print "tankalus answer: $tanktalus_answer\n";
##
##
Rate duckyd duckyd2 tanktalus
duckyd 47.3/s -- -1% -44%
duckyd2 47.7/s 1% -- -44%
tanktalus 84.6/s 79% 77% --