🎉 Exercism Research is now launched. Help Exercism, help science and have some fun at research.exercism.io 🎉
Avatar of alindeman

alindeman's solution

to Anagram in the Clojure Track

Published at Jul 13 2018 · 3 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"
                     "clergy"  "largely"   "leading"]]
           (anagram/anagrams-for "allergy" coll)))))

(deftest case-insensitive-anagrams
  (is (= ["Carthorse"]
         (let [coll ["cashregister" "Carthorse" "radishes"]]
           (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 string]))

(defn anagrams-for [word candidates]
  (filter (partial anagram? word) candidates))

(defn- anagram? [word1 word2]
  (= (letter-count word1) (letter-count word2)))

(defn- letter-count [word]
  (frequencies word))

Community comments

Find this solution interesting? Ask the author a question to learn more.
Avatar of rubysolo

Nice use of partial!

Does wrapping frequencies in letter-count really buy you anything? IMO, frequencies is more descriptive.

Avatar of alindeman
alindeman
Solution Author
commented about 7 years ago

I went back and forth, and eventually decided that the more domain-specific term was better. (frequencies word) makes me have to stop and think for a little while, while letter-count tells me specifically what's going on. That said, the downside is another layer of indirection.

I could go either way still. Do you feel strongly about it?

Avatar of rubysolo

I don't feel strongly about it, but I had to read the fn body to see what it was doing. From the name, I thought it might be doing (count word) or (count (distinct word)).

What can you learn from this solution?

A huge amount can be learned from reading other people’s code. This is why we wanted to give exercism users the option of making their solutions public.

Here are some questions to help you reflect on this solution and learn the most from it.

  • What compromises have been made?
  • Are there new concepts here that you could read more about to improve your understanding?