From 81ad14c849f5e9740b4f093e9aa377a43406a8d4 Mon Sep 17 00:00:00 2001 From: Peter Tseng Date: Thu, 12 Jan 2017 02:04:59 -0800 Subject: [PATCH] anagram: Add new exercise --- config.json | 8 ++++ exercises/anagram/example/Anagram.ceylon | 8 ++++ .../anagram/source/anagram/Anagram.ceylon | 3 ++ .../anagram/source/anagram/AnagramTest.ceylon | 47 +++++++++++++++++++ .../anagram/source/anagram/module.ceylon | 3 ++ 5 files changed, 69 insertions(+) create mode 100644 exercises/anagram/example/Anagram.ceylon create mode 100644 exercises/anagram/source/anagram/Anagram.ceylon create mode 100644 exercises/anagram/source/anagram/AnagramTest.ceylon create mode 100644 exercises/anagram/source/anagram/module.ceylon diff --git a/config.json b/config.json index 415be5e..c20d396 100644 --- a/config.json +++ b/config.json @@ -10,6 +10,14 @@ "topics": [ "Integers" ] + }, + { + "slug": "anagram", + "difficulty": 4, + "topics": [ + "Strings", + "Filtering" + ] } ], "deprecated": [ diff --git a/exercises/anagram/example/Anagram.ceylon b/exercises/anagram/example/Anagram.ceylon new file mode 100644 index 0000000..ab22c04 --- /dev/null +++ b/exercises/anagram/example/Anagram.ceylon @@ -0,0 +1,8 @@ +{String*} anagrams(String subject, {String*} candidates) { + value lower = subject.lowercased; + value chars = sort(lower); + return candidates.filter((c) { + value lowerCandidate = c.lowercased; + return lower != lowerCandidate && chars == sort(lowerCandidate); + }); +} diff --git a/exercises/anagram/source/anagram/Anagram.ceylon b/exercises/anagram/source/anagram/Anagram.ceylon new file mode 100644 index 0000000..fb53e8e --- /dev/null +++ b/exercises/anagram/source/anagram/Anagram.ceylon @@ -0,0 +1,3 @@ +{String*} anagrams(String subject, {String*} candidates) { + return nothing; +} diff --git a/exercises/anagram/source/anagram/AnagramTest.ceylon b/exercises/anagram/source/anagram/AnagramTest.ceylon new file mode 100644 index 0000000..46e4a4f --- /dev/null +++ b/exercises/anagram/source/anagram/AnagramTest.ceylon @@ -0,0 +1,47 @@ +import ceylon.test { ... } + +shared {[String, {String*}, {String*}]*} cases => + { + // no matches + ["diaper", {"hello", "world", "zombies", "pants"}, {}], + // detects simple anagram + ["ant", {"tan", "stand", "at"}, {"tan"}], + // does not detect false positives + ["galea", {"eagle"}, {}], + // detects multiple anagrams + ["master", {"stream", "pigeon", "maters"}, {"stream", "maters"}], + // does not detect anagram subsets + ["good", {"dog", "goody"}, {}], + // detects anagram + ["listen", {"enlists", "google", "inlets", "banana"}, {"inlets"}], + // detects multiple anagrams + [ + "allergy", + {"gallery", "ballerina", "regally", "clergy", "largely", "leading"}, + {"gallery", "regally", "largely"} + ], + // does not detect identical words + ["corn", {"corn", "dark", "Corn", "rank", "CORN", "cron", "park"}, {"cron"}], + // does not detect non-anagrams with identical checksum + ["mass", {"last"}, {}], + // detects anagrams case-insensitively + ["Orchestra", {"cashregister", "Carthorse", "radishes"}, {"Carthorse"}], + // detects anagrams using case-insensitive subject + ["Orchestra", {"cashregister", "carthorse", "radishes"}, {"carthorse"}], + // detects anagrams using case-insensitive possible matches + ["orchestra", {"cashregister", "Carthorse", "radishes"}, {"Carthorse"}], + // does not detect a word as its own anagram + ["banana", {"Banana"}, {}], + // does not detect a anagram if the original word is repeated + ["go", {"go Go GO"}, {}], + // anagrams must use all letters exactly once + ["tapper", {"patter"}, {}], + // capital word is not own anagram + ["BANANA", {"Banana"}, {}] + }; + +test +parameters(`value cases`) +shared void testAnagram(String subject, {String*} candidates, {String*} expected) { + assertEquals(sort(anagrams(subject, candidates)), sort(expected)); +} diff --git a/exercises/anagram/source/anagram/module.ceylon b/exercises/anagram/source/anagram/module.ceylon new file mode 100644 index 0000000..1f55afb --- /dev/null +++ b/exercises/anagram/source/anagram/module.ceylon @@ -0,0 +1,3 @@ +module anagram "1.0" { + import "ceylon.test" "1.3.1"; +}