Best shuffle: Difference between revisions

Content added Content deleted
Line 420: Line 420:
=={{header|Icon}} and {{header|Unicon}}==
=={{header|Icon}} and {{header|Unicon}}==
<lang icon>procedure main(args)
<lang icon>procedure main(args)
while write(scramble(read()))
while scram := bestShuffle(line := read()) do
write(line," -> ",scram," (",unchanged(line,scram),")")
end
end


procedure scramble(s)
procedure bestShuffle(s)
t := s
t := s
# every !t :=: ?t # Uncomment this line for a random best shuffle
# every !t :=: ?t # Uncomment to get a random best shuffling
every i := 1 to *t do
every i := 1 to *t do
every j := (1 to i-1) | (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 break t[i] :=: t[j]
if (t[i] ~== s[j]) & (s[i] ~== t[j]) then break t[i] :=: t[j]
return t || " ("||unchanged(s,t)||")"
return t
end
end


procedure unchanged(s1,s2) # Number of unchanged elements
procedure unchanged(s1,s2) # Number of unchanged elements
count := 0
every (count := 0) +:= (s1[i := 1 to *s1] == s2[i], 1)
every s1[i := 1 to *s1] == s2[i] do count +:= 1
return count
return count
end
end</lang>
</lang>


The code works in both Icon and Unicon.
The code works in both Icon and Unicon.
Line 443: Line 442:
Sample output:
Sample output:
<pre>
<pre>
->scramble
->scramble <scramble.data
abracadabra -> raaracababd (0)
tree
seesaw -> wasese (0)
eetr (0)
elk -> lke (0)
abracadabra
grrrrrr -> rgrrrrr (5)
raaracababd (0)
up -> pu (0)
seesaw
wasese (0)
a -> a (1)
aardvarks are ant eaters -> sdaaaraaasv rer nt keter (0)
up
pu (0)
grrrrrr
rgrrrrr (5)
a
a (1)
->
->
</pre>
</pre>