How to resolve the algorithm Anagrams/Deranged anagrams step by step in the OCaml programming language
Published on 12 May 2024 09:40 PM
How to resolve the algorithm Anagrams/Deranged anagrams step by step in the OCaml programming language
Table of Contents
Problem Statement
Two or more words are said to be anagrams if they have the same characters, but in a different order. By analogy with derangements we define a deranged anagram as two words with the same characters, but in which the same character does not appear in the same position in both words. Use the word list at unixdict to find and display the longest deranged anagram.
Let's start with the solution:
Step by Step solution about How to resolve the algorithm Anagrams/Deranged anagrams step by step in the OCaml programming language
Source code in the ocaml programming language
let sort_chars s =
let r = String.copy s in
for i = 0 to (String.length r) - 2 do
for j = i + 1 to (String.length r) - 1 do
if r.[i] > r.[j] then begin
let tmp = r.[i] in
r.[i] <- r.[j];
r.[j] <- tmp;
end
done
done;
(r)
let deranged (s1, s2) =
let len1 = String.length s1
and len2 = String.length s2 in
if len1 <> len2 then false else
try
for i = 0 to pred len1 do
if s1.[i] = s2.[i] then raise Exit
done;
true
with Exit -> false
let pairs_of_list lst =
let rec aux acc = function
| [] -> acc
| x::xs ->
aux (List.fold_left (fun acc y -> (x,y)::acc) acc xs) xs
in
aux [] lst
let () =
let h = Hashtbl.create 3571 in
let ic = open_in "unixdict.txt" in
try while true do
let word = input_line ic in
let key = sort_chars word in
let l =
try Hashtbl.find h key
with Not_found -> []
in
Hashtbl.replace h key (word::l);
done with End_of_file ->
close_in ic;
let lst =
Hashtbl.fold (fun _ lw acc ->
if List.length lw < 2 then acc else lw::acc) h []
in
let lst =
List.fold_left (fun acc anagrams ->
let pairs = pairs_of_list anagrams in
(List.filter deranged pairs) @ acc
) [] lst
in
let res, _ =
List.fold_left (fun (res, n) (w1, w2) ->
let len = String.length w1 in
match Pervasives.compare len n with
| 0 -> ((w1, w2)::res, n)
| 1 -> ([w1, w2], len)
| _ -> (res, n)
) ([], 0) lst
in
List.iter (fun (w1, w2) -> Printf.printf "%s, %s\n" w1 w2) res
You may also check:How to resolve the algorithm Damm algorithm step by step in the BASIC256 programming language
You may also check:How to resolve the algorithm Fusc sequence step by step in the Swift programming language
You may also check:How to resolve the algorithm MD5 step by step in the NetRexx programming language
You may also check:How to resolve the algorithm String matching step by step in the D programming language
You may also check:How to resolve the algorithm Image noise step by step in the Julia programming language