Jump to content

Best shuffle: Difference between revisions

m
→‎{{header|Perl 6}}: fixed code and added output
(Kotlin version updated)
m (→‎{{header|Perl 6}}: fixed code and added output)
Line 2,063:
 
=={{header|Perl 6}}==
{{trans|Sidef}}
{{works with|Rakudo Star|20102015.12}}
{{incorrect|Perl 6| See [[Talk:Best_shuffle#Perl_6|Perl 6]] in talk page.}}
 
<lang perl6>sub best-shuffle (Str $sorig) {
my @orig = $s.comb;
 
my @poss = $orig.comb;
my @origt = $@s.combpick(*);
# Fill @pos with positions in the order that we want to fill
 
# them. (Once Rakudo has &roundrobin, this will be doable in
#for one^@s statement.)-> $i {
for ^@s -> $j {
my %pos if $i != classify$j {and @origt[$^i] },ne keys@s[$j] and @orig;t[$j] ne @s[$i] {
my @k = map *.key @t[$i, sort$j] *.value.elems= @t[$j, %pos$i];
while %pos { last;
for @k -> $letter {
%pos{$letter} or next;
push @pos, %pos{$letter}.pop;
%pos{$letter}.elems or %pos.delete: $letter;
}
}
@pos .= reverse;
}
 
my @letters$count = @orig0;
myfor @newt.kv = Any xx-> $s.chars;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;
}
 
return (@newt.join, $scorecount);
my $score = elems grep ?*, map * eq *, do @new Z @orig;
 
@new.join, $score;
}
 
printf "%s, %s, (%d)\n", $_, best-shuffle $_
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}}==
2,756

edits

Cookies help us deliver our services. By using our services, you agree to our use of cookies.