use strict; use warnings; use bigint; # Each element of @formulas is an an op-string: # a string of Fs and Ss, indicating factorial # and square root, in order applied to get the # index my %formulas = (3 => '3'); my $found_new = 1; while ($found_new) { $found_new = 0; # Apply factorial to all formulas while (my ($v, $ops) = each %formulas) { if ($v < 150) { $v = fact($v); $ops .= 'F'; exists $formulas{$v} or $found_new = $formulas{$v} = $ops; } } # Apply sqrt to all formulas while (my ($v, $ops) = each %formulas) { $v = int(sqrt($v)); $ops .= 'S'; exists $formulas{$v} or $found_new = $formulas{$v} = $ops; } } for (sort { $a <=> $b } keys %formulas) { print "$_: $formulas{$_}\n"; } sub fact { my $f = 1; for (2..$_[0]) { $f *= $_ } $f; }