 # chicovg's solution

## to Anagram in the Clojure Track

Published at Sep 13 2019 · 0 comments
Instructions
Test suite
Solution

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

## Submitting Incomplete Solutions

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

### anagram_test.clj

``````(ns anagram-test
(:require [clojure.test :refer [deftest is]]
anagram))

(deftest no-matches
(is (= []
(anagram/anagrams-for "diaper" ["hello" "world" "zombies" "pants"]))))

(deftest detect-simple-anagram
(is (= ["tan"] (anagram/anagrams-for "ant" ["tan" "stand" "at"]))))

(deftest does-not-confuse-different-duplicates
(is (= [] (anagram/anagrams-for "galea" ["eagle"]))))

(deftest eliminate-anagram-subsets
(is (= [] (anagram/anagrams-for "good" ["dog" "goody"]))))

(deftest detect-anagram
(is (= ["inlets"]
(let [coll ["enlists" "google" "inlets" "banana"]]
(anagram/anagrams-for "listen" coll)))))

(deftest multiple-anagrams
(is (= ["gallery" "regally" "largely"]
(let [coll ["gallery" "ballerina" "regally"
(anagram/anagrams-for "allergy" coll)))))

(deftest case-insensitive-anagrams
(is (= ["Carthorse"]
(anagram/anagrams-for "Orchestra" coll)))))

(deftest word-is-not-own-anagram
(is (= [] (anagram/anagrams-for "banana" ["banana"]))))

(deftest capital-word-is-not-own-anagram
(is (= [] (anagram/anagrams-for "BANANA" ["banana"]))))``````
``````(ns anagram
(:require [clojure.string :as s]))

(defn is-same-length?
[word prospect]
(= (count word) (count prospect)))

(defn is-not-equal?
[word prospect]
(not (= (s/lower-case word) (s/lower-case prospect))))

(defn has-same-letters?
[word prospect]
(= (sort (s/lower-case word)) (sort (s/lower-case prospect))))

(defn anagrams-for
[word prospect-list]
(filter (every-pred (partial is-same-length? word)
(partial is-not-equal? word)
(partial has-same-letters? word))
prospect-list))

;; Alternate implementation using thread last:
;; (defn anagrams-for
;;   [word prospect-list]
;;   (->> prospect-list
;;        (filter (partial is-same-length word))
;;        (filter (partial is-not-equal word))
;;        (filter (partial has-same-letters word))))``````