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

# huczk's solution

## to Anagram in the ReasonML Track

Published at Dec 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 sortChars = str =>
str
|> Js.String.toLowerCase
|> Js.String.split("")
|> Js.Array.sortInPlace
|> Js.Array.joinWith("");

let anagrams = (str, list) =>
str === Js.String.toUpperCase(str)
? [] : List.map(sortChars, list) |> List.map((==)(sortChars(str)));``````