Best shuffle: Difference between revisions

added ocaml
(added ocaml)
Line 1,214:
up, pu, (0)
a, a, (1)</lang>
 
=={{header|OCaml}}==
 
Deterministic
 
<lang ocaml>let best_shuffle s =
let len = String.length s in
let r = String.copy s in
for i = 0 to pred len do
for j = 0 to pred len do
if i <> j && s.[i] <> r.[j] && s.[j] <> r.[i] then
begin
let tmp = r.[i] in
r.[i] <- r.[j];
r.[j] <- tmp;
end
done;
done;
(r)
 
let count_same s1 s2 =
let len1 = String.length s1
and len2 = String.length s2 in
let n = ref 0 in
for i = 0 to pred (min len1 len2) do
if s1.[i] = s2.[i] then incr n
done;
!n
 
let () =
let f s =
let s2 = best_shuffle s in
Printf.printf " '%s', '%s' -> %d\n" s s2 (count_same s s2);
in
f "tree";
f "abracadabra";
f "seesaw";
f "elk";
f "grrrrrr";
f "up";
f "a";
;;</lang>
 
Run:
 
<pre>$ ocaml best_shuffle_string.ml
'tree', 'eert' -> 0
'abracadabra', 'caadrbabaar' -> 0
'seesaw', 'ewaess' -> 0
'elk', 'kel' -> 0
'grrrrrr', 'rgrrrrr' -> 5
'up', 'pu' -> 0
'a', 'a' -> 1</pre>
 
=={{header|Perl}}==