Best shuffle: Difference between revisions
Content added Content deleted
No edit summary |
|||
Line 417: | Line 417: | ||
<lang haskell>bestShuffle :: Eq a => [a] -> [a] |
<lang haskell>bestShuffle :: Eq a => [a] -> [a] |
||
bestShuffle s = minimumBy (compare `on` score s) $ permutations s</lang> |
bestShuffle s = minimumBy (compare `on` score s) $ permutations s</lang> |
||
=={{header|Icon}}== |
|||
<lang icon>procedure main(args) |
|||
while write(scramble(read())) |
|||
end |
|||
procedure scramble(s) |
|||
t := s |
|||
every i := 1 to *t do { |
|||
every j := (1 to i-1) | (i+1 to *t) do { |
|||
if (t[i] ~== s[j]) & (s[i] ~== t[j]) then { |
|||
t[i] :=: t[j] |
|||
break |
|||
} |
|||
} |
|||
} |
|||
return t || " ("||unchanged(s,t)||")" |
|||
end |
|||
procedure unchanged(s1,s2) # Number of unchanged elements |
|||
count := 0 |
|||
every s1[i := 1 to *s1] == s2[i] do count +:= 1 |
|||
return count |
|||
end |
|||
</lang> |
|||
The code also works in Unicon. |
|||
Sample output: |
|||
<pre> |
|||
->scramble |
|||
tree |
|||
eetr (0) |
|||
abracadabra |
|||
raacaradabb (0) |
|||
seesaw |
|||
wsseea (0) |
|||
up |
|||
pu (0) |
|||
grrrrrr |
|||
rrrrrrg (5) |
|||
a |
|||
a (1) |
|||
-> |
|||
</pre> |
|||
=={{header|J}}== |
=={{header|J}}== |