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 } ```