diff --git a/anagram/anagram_test.spec.js b/anagram/anagram_test.spec.js index 96925811..5c8aa84a 100644 --- a/anagram/anagram_test.spec.js +++ b/anagram/anagram_test.spec.js @@ -1,58 +1,75 @@ -var Anagram = require('./anagram'); +var anagram = require('./anagram'); describe('Anagram', function() { it("no matches",function() { - var detector = new Anagram("diaper"); - var matches = detector.match([ "hello", "world", "zombies", "pants"]); + var subject = anagram("diaper"); + var matches = subject.matches([ "hello", "world", "zombies", "pants"]); + expect(matches).toEqual([]); }); xit("detects simple anagram",function() { - var detector = new Anagram("ant"); - var matches = detector.match(['tan', 'stand', 'at']); + var subject = anagram("ant"); + var matches = subject.matches(['tan', 'stand', 'at']); + expect(matches).toEqual(['tan']); }); xit("does not detect false positives",function() { - var detector = new Anagram("galea"); - var matches = detector.match(["eagle"]); + var subject = anagram("galea"); + var matches = subject.matches(["eagle"]); + expect(matches).toEqual([]); }); xit("detects multiple anagrams",function() { - var detector = new Anagram("master"); - var matches = detector.match(['stream', 'pigeon', 'maters']); + var subject = anagram("master"); + var matches = subject.matches(['stream', 'pigeon', 'maters']); + expect(matches).toEqual(['stream', 'maters']); }); xit("does not detect anagram subsets",function() { - var detector = new Anagram("good"); - var matches = detector.match(['dog', 'goody']); + var subject = anagram("good"); + var matches = subject.matches(['dog', 'goody']); + expect(matches).toEqual([]); }); xit("detects anagram",function() { - var detector = new Anagram("listen"); - var matches = detector.match(['enlists', 'google', 'inlets', 'banana']); + var subject = anagram("listen"); + var matches = subject.matches(['enlists', 'google', 'inlets', 'banana']); + expect(matches).toEqual(['inlets']); }); xit("detects multiple anagrams",function() { - var detector = new Anagram("allergy"); - var matches = detector.match(['gallery', 'ballerina', 'regally', 'clergy', 'largely', 'leading']); + var subject = anagram("allergy"); + var matches = subject.matches(['gallery', 'ballerina', 'regally', 'clergy', 'largely', 'leading']); + expect(matches).toEqual(['gallery', 'regally', 'largely']); }); xit("detects anagrams case-insensitively",function() { - var detector = new Anagram("Orchestra"); - var matches = detector.match(['cashregister', 'Carthorse', 'radishes']); + var subject = anagram("Orchestra"); + var matches = subject.matches(['cashregister', 'Carthorse', 'radishes']); + expect(matches).toEqual(['Carthorse']); }); xit("does not detect a word as its own anagram",function() { - var detector = new Anagram("banana"); - var matches = detector.match(['Banana']); + var subject = anagram("banana"); + var matches = subject.matches(['Banana']); + expect(matches).toEqual([]); }); + + xit("matches() accepts string arguments",function() { + var subject = anagram("ant"); + var matches = subject.matches("stand", "tan", "at"); + + expect(matches).toEqual(["tan"]); + }); + }); diff --git a/anagram/example.js b/anagram/example.js index 0e0b6b34..5e582ffe 100644 --- a/anagram/example.js +++ b/anagram/example.js @@ -1,34 +1,30 @@ -(function() { - 'use strict'; +"use strict"; +module.exports = anagram; - function Anagram(word) { - this.word = word.toLowerCase(); - } - - Anagram.prototype.match = function(words) { - var matches = []; - - for(var i = 0; i < words.length; i++) { - var currentWord = words[i]; +function anagram(word) { + return { + // public API + matches: matches.bind(this, word) + }; +} - if (currentWord.length == this.word.length && currentWord.toLowerCase() != this.word) { - var currentWordLetters = currentWord.toLowerCase().split('').sort(); - var matchingWordLetters = this.word.split('').sort(); +function matches(word, words) { + words = Array.isArray(words) ? words : [].slice.call(arguments, 1); - var isMatch = true; + return words.filter(function (candidate) { + return !sameWord(word, candidate) && isAnagram(word, candidate); + }); +} - for (var j = 0; j < currentWordLetters.length; j++) { - if (currentWordLetters[j] != matchingWordLetters[j]) { - isMatch = false; - } - } +function sameWord(word, candidate) { + return word.toLowerCase() === candidate.toLowerCase(); +} - if (isMatch) { matches.push(currentWord); } - } +function isAnagram(word, candiate) { + return normalize(word) === normalize(candiate); +} - } - return matches; - }; +function normalize(string) { + return string.toLowerCase().split("").sort().toString(); +} - module.exports = Anagram; -})();