diff --git a/src/adagrams.js b/src/adagrams.js index 7ec5afc7..07f9b4f4 100644 --- a/src/adagrams.js +++ b/src/adagrams.js @@ -1,15 +1,121 @@ +const letterPool = { + A: 9, + B: 2, + C: 2, + D: 4, + E: 12, + F: 2, + G: 3, + H: 2, + I: 9, + J: 1, + K: 1, + L: 4, + M: 2, + N: 6, + O: 8, + P: 2, + Q: 1, + R: 6, + S: 4, + T: 6, + U: 4, + V: 2, + W: 2, + X: 1, + Y: 2, + Z: 1, +}; + +const letterValues = { + 'A': 1, + 'B': 3, + 'C': 3, + 'D': 2, + 'E': 1, + 'F': 4, + 'G': 2, + 'H': 4, + 'I': 1, + 'J': 8, + 'K': 5, + 'L': 1, + 'M': 3, + 'N': 1, + 'O': 1, + 'P': 2, + 'Q': 10, + 'R': 1, + 'S': 1, + 'T': 1, + 'U': 1, + 'V': 4, + 'W': 4, + 'X': 8, + 'Y': 4, + 'Z': 10 +} + export const drawLetters = () => { - // Implement this method for wave 1 + let letterPoolCopy = JSON.parse(JSON.stringify(letterPool)); + const letters = []; + + const keys = Object.keys(letterPoolCopy); + while (letters.length < 10) { + let letter = keys[Math.floor(Math.random() * keys.length)]; + + if (letterPoolCopy[letter] > 0) { + letters.push(letter); + letterPoolCopy[letter] -= 1; + } + } + return letters; }; export const usesAvailableLetters = (input, lettersInHand) => { - // Implement this method for wave 2 + let letterBankCopy = JSON.parse(JSON.stringify(lettersInHand)); + + for (let i = 0; i < input.length; i++) { + if (letterBankCopy.includes(input[i])) { + delete letterBankCopy[i]; + } else { + return false; + } + } + return true; }; export const scoreWord = (word) => { - // Implement this method for wave 3 + let score = 0 + for (const letter of word) { + score += letterValues[letter.toUpperCase()] + } + + if (word.length > 6 && word.length < 11){ + score += 8 + } + return score }; export const highestScoreFrom = (words) => { - // Implement this method for wave 4 + let highest = {word: words[0], score: 0}; + + for (const word of words) { + let score = scoreWord(word); + if (score > highest.score) { + highest.word = word; + highest.score = score; + } else if (score === highest.score) { + if (highest.word.length === 10) { + highest = highest; + } else if (word.length === 10 && highest.word.length !== 10) { + highest.word = word; + highest.score = score; + } else if (word.length < highest.word.length) { + highest.word = word; + highest.score = score; + } + } + } + return highest }; diff --git a/test/adagrams.test.js b/test/adagrams.test.js index 1a0dc94e..ca831e5c 100644 --- a/test/adagrams.test.js +++ b/test/adagrams.test.js @@ -120,7 +120,9 @@ describe("Adagrams", () => { }); it("returns a score of 0 if given an empty input", () => { - throw "Complete test"; + expectScores({ + '': 0 + }); }); it("adds an extra 8 points if word is 7 or more characters long", () => { @@ -133,7 +135,7 @@ describe("Adagrams", () => { }); }); - describe.skip("highestScoreFrom", () => { + describe("highestScoreFrom", () => { it("returns a hash that contains the word and score of best word in an array", () => { const words = ["X", "XX", "XXX", "XXXX"]; const correct = { word: "XXXX", score: scoreWord("XXXX") }; @@ -145,7 +147,7 @@ describe("Adagrams", () => { const words = ["XXX", "XXXX", "X", "XX"]; const correct = { word: "XXXX", score: scoreWord("XXXX") }; - throw "Complete test by adding an assertion"; + expect(highestScoreFrom(words)).toEqual(correct); }); describe("in case of tied score", () => {