substr( $q, 0, $k ) = reverse substr( $q, 0, $k );
####
$q = reverse(substr($q, 0, $k)) . substr($q, $k);
##
##
sub fannkuch {
use bytes; # This makes it fractionally faster
my ( $copy, $level, $split ) = ( @_, 0, 1 );
my ( $index, $next, $length ) = ( $level, $level + 1, length( $copy ) );
if ($next == $length) {
$index = $split - 1;
substr($copy, $index, 0) = chop($copy);
}
my ( $q, $k );
do {
if ($next == $length) {
if (($k = ord($q = $copy)) != $length
|| $level >= $maxflips)
{
# Declaring $flips in here means we can reset it
# with a single op (compared with the three you
# need for C<$flips = 0>).
my $flips;
# This is a touch faster than a "proper" loop,
# because it doesn't push a new context.
$q = reverse(substr( $q, 0, $k )) . substr($q, $k),
++$flips
while ($k=ord($q)) != 1;
no warnings "uninitialized"; # $flips may be undef
if ( $flips >= $maxflips ) {
if ( $flips == $maxflips) {
push @max_sequence, $copy;
}
else {
($maxflips, @max_sequence) = ($flips, $copy);
}
}
}
}
else {
fannkuch( $copy, $next, $split );
$split = $next if $index == $split;
}
substr($copy, $index-1, 2) = reverse substr($copy, $index-1, 2);
} while $index--;
$maxflips; # faster than an explicit return
}