use strict; use warnings; $|=1; sub sol1 { #init; my $lights = 20_000; my @lit = map {1} (1..$lights); my @sol; #flip; for (2..$lights) { my $cnt = $_-1; while ($cnt < $lights) { $lit[$cnt] = !$lit[$cnt]; $cnt+=$_; } } #answer; for (0..$#lit) { push @sol, $_+1 if $lit[$_] } } sub sol2 { my $lights = 20_000; my @sol; for (1..$lights) { my $sqr = sqrt($_); push @sol, $_ if int($sqr) == $sqr; } } use Benchmark ':all'; cmpthese( 100, { sol1 => \&sol1, sol2 => \&sol2, }); __END__ Rate sol1 sol2 sol1 6.58/s -- -93% sol2 98.5/s 1398% --