Best shuffle: Difference between revisions
Content added Content deleted
(Kotlin version updated) |
m (→{{header|Perl 6}}: fixed code and added output) |
||
Line 2,063: | Line 2,063: | ||
=={{header|Perl 6}}== |
=={{header|Perl 6}}== |
||
{{trans|Sidef}} |
|||
{{works with|Rakudo Star| |
{{works with|Rakudo Star|2015.12}} |
||
{{incorrect|Perl 6| See [[Talk:Best_shuffle#Perl_6|Perl 6]] in talk page.}} |
|||
<lang perl6>sub best-shuffle |
<lang perl6>sub best-shuffle(Str $orig) { |
||
⚫ | |||
my @ |
my @s = $orig.comb; |
||
⚫ | |||
# Fill @pos with positions in the order that we want to fill |
|||
# them. (Once Rakudo has &roundrobin, this will be doable in |
|||
for ^@s -> $i { |
|||
{ |
for ^@s -> $j { |
||
if $i != $j and @t[$i] ne @s[$j] and @t[$j] ne @s[$i] { |
|||
@t[$i, $j] = @t[$j, $i]; |
|||
last; |
|||
for @k -> $letter { |
|||
%pos{$letter} or next; |
|||
push @pos, %pos{$letter}.pop; |
|||
%pos{$letter}.elems or %pos.delete: $letter; |
|||
} |
} |
||
} |
} |
||
@pos .= reverse; |
|||
} |
} |
||
my |
my $count = 0; |
||
for @t.kv -> $k,$v { |
|||
++$count if $v eq @s[$k] |
|||
# Now fill in @new with @letters according to each position |
|||
# in @pos, but skip ahead in @letters if we can avoid |
|||
# matching characters that way. |
|||
while @letters { |
|||
my ($i, $p) = 0, shift @pos; |
|||
++$i while @letters[$i] eq @orig[$p] and $i < @letters.end; |
|||
@new[$p] = splice @letters, $i, 1; |
|||
} |
} |
||
⚫ | |||
my $score = elems grep ?*, map * eq *, do @new Z @orig; |
|||
⚫ | |||
} |
} |
||
printf "%s, %s, (%d)\n", $_, best-shuffle $_ |
printf "%s, %s, (%d)\n", $_, best-shuffle $_ |
||
for <abracadabra seesaw elk grrrrrr up a>;</lang> |
for <abracadabra seesaw elk grrrrrr up a>;</lang> |
||
{{out}} |
|||
<pre> |
|||
abracadabra, raacarabadb, (0) |
|||
seesaw, wssaee, (0) |
|||
elk, lke, (0) |
|||
grrrrrr, rrrgrrr, (5) |
|||
up, pu, (0) |
|||
a, a, (1) |
|||
</pre> |
|||
=={{header|Phix}}== |
=={{header|Phix}}== |