ðŸŽ‰ Exercism Research is now launched. Help Exercism, help science and have some fun at research.exercism.io ðŸŽ‰

# ar90n's solution

## to Anagram in the ReasonML Track

Published at Mar 08 2019 · 0 comments
Instructions
Test suite
Solution

#### Note:

This exercise has changed since this solution was written.

Given a word and a list of possible anagrams, select the correct sublist.

Given `"listen"` and a list of candidates like `"enlists" "google" "inlets" "banana"` the program should return a list containing `"inlets"`.

## Source

Inspired by the Extreme Startup game https://github.com/rchatley/extreme_startup

## Building and testing

You will need the node package manager (npm) installed - download from here There is one time setup for each exercise, which may take a few minutes:

``````npm install
``````

Open two shells, and in the first, start the build process.

``````npm start
``````

In the second, start the tests running.

``````npm test
``````

As you edit the code, the two processes will continually rebuild and rerun the tests.

### Anagram_test.re

``````open Jest;
open Expect;
open Anagram;

describe("Anagram", () => {
test("no matches", () =>
expect(anagrams("diaper", ["hello", "world", "zombies", "pants"])) |> toEqual([])
);
test("detects two anagrams", () =>
expect(anagrams("master", ["stream", "pigeon", "maters"])) |> toEqual(["stream", "maters"])
);
test("does not detect anagram subsets", () =>
expect(anagrams("good", ["dog", "goody"]))  |> toEqual([])
);
test("detects anagram", () =>
expect(anagrams("listen", ["enlists", "google", "inlets", "banana"]))  |> toEqual(["inlets"])
);
test("detects three anagrams", () =>
expect(anagrams("allergy", ["gallery", "ballerina", "regally", "clergy", "largely", "leading"]))  |> toEqual(["gallery", "regally", "largely"])
);
test("does not detect non-anagrams(with identical checksum", () =>
expect(anagrams("mass", ["last"]))  |> toEqual([])
);
test("detects anagrams(case-insensitively", () =>
expect(anagrams("Orchestra", ["cashregister", "Carthorse", "radishes"]))  |> toEqual(["Carthorse"])
);
test("detects anagrams(using case-insensitive subject", () =>
expect(anagrams("Orchestra", ["cashregister", "carthorse", "radishes"])) |> toEqual(["carthorse"])
);
test("detects anagrams(using case-insensitive possible matches", () =>
expect(anagrams("orchestra", ["cashregister", "Carthorse", "radishes"])) |> toEqual(["Carthorse"])
);
test("does not detect a anagram if the original word is repeated", () =>
expect(anagrams("go", ["go Go GO"])) |> toEqual([])
);
test("anagrams(must use all letters exactly once", () =>
expect(anagrams("tapper", ["patter"])) |> toEqual([])
);
test("capital word is not own anagram", () =>
expect(anagrams("BANANA", ["Banana"])) |> toEqual([])
);
})``````
``````let anagrams: (string, list(string)) => list(string) = (s, lst) => {
if(s == Js.String.toUpperCase(s)) {
[]
} else {
let sort = s => Js.String.toLowerCase(s)
|> Js.String.split("")
|> Js.Array.sortInPlace
|> Js.Array.join

let sorted = sort(s)
List.map(sort, lst)
|> List.map((==)(sorted))
|> List.map2((x, y) => (x, y), lst)
|> List.filter(((_, f)) => f)
|> List.map(fst)
}
}``````