sub MidLifeXis_bruteforce { my $p = shift; my $v = shift; my $check = shift; my $worker = sub { my $worker = shift; my $prefix = shift; my $tot_size = shift; my $places = shift; my $alphabet = shift; my $check = shift; my @solution = ( 0, 0 ); foreach my $letter (@$alphabet) { if ($places < 1) { return ''; } elsif ($places == 1) { @solution = $check->( $prefix . $letter ); return ( $prefix . $letter ) if ( $solution[1] == $tot_size ); } else { my $try = $worker->( $worker, $prefix . $letter, $tot_size, $places - 1, [ grep { $_ ne $letter } @$alphabet ], $check, ); return $try if $try; } } return ''; }; $worker->( $worker, '', $p, $p, [ ( '0' .. '9', 'A' .. 'Z' )[ 0 .. $v - 1 ] ], $check, ); }