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

# rebelwarrior's solution

## to Anagram in the Crystal Track

Published at May 25 2020 · 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"`.

## Setup

Follow the setup instructions for Crystal here:

http://exercism.io/languages/crystal

More help installing can be found here:

http://crystal-lang.org/docs/installation/index.html

## Making the Test Suit Pass

Execute the tests with:

``````\$ crystal spec
``````

In each test suite all but the first test have been skipped.

Once you get a test passing, you can unskip the next one by changing `pending` to `it`.

## Source

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

## Submitting Incomplete Solutions

It's possible to submit an incomplete solution so you can see how others have completed the exercise.

### anagram_spec.cr

``````require "spec"
require "../src/*"

describe "Anagram" do
describe "#find" do
it "detects no anagrams" do
Anagram.find("diaper", ["hello", "world", "zombies", "pants"]).should eq [] of String
end

pending "detects one anagram" do
Anagram.find("ant", ["tan", "stand", "at"]).should eq ["tan"]
end

pending "detects multiple anagrams" do
Anagram.find("master", ["stream", "pigeon", "maters"]).should eq ["stream", "maters"]
end

pending "detects multiple anagrams 2" do
Anagram.find("allergy", ["gallery", "ballerina", "regally", "clergy", "largely", "leading"]).should eq ["gallery", "regally", "largely"]
end

pending "does not detect false positives" do
Anagram.find("galea", ["eagle"]).should eq [] of String
end

pending "does not detect anagram subsets" do
Anagram.find("good", ["dog", "goody"]).should eq [] of String
end

pending "does not detect identical words" do
Anagram.find("corn", ["corn", "dark", "Corn", "rank", "CORN", "cron", "park"]).should eq ["cron"]
end

pending "detects anagrams case-insensitively" do
Anagram.find("Orchestra", ["cashregister", "carthorse", "radishes"]).should eq ["carthorse"]
end

pending "does not detect a word as its own anagram" do
Anagram.find("banana", ["Banana"]).should eq [] of String
end

pending "anagrams must use all letters exactly once" do
Anagram.find("tapper", ["patter"]).should eq [] of String
end
end
end``````
``````class Anagram
def self.find(word : String, list_of_words : Array(String)) : Array(String)
limit = word.size
downcase_word = word.downcase
sorted_word = downcase_word.split("").sort
list_of_words.select do |w|
w.size == limit &&
w.downcase != downcase_word &&
w.downcase.split("").sort == sorted_word
end
end
end``````