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% --