diff --git a/src/adagrams.js b/src/adagrams.js index 7ec5afc7..e60228a4 100644 --- a/src/adagrams.js +++ b/src/adagrams.js @@ -1,15 +1,97 @@ +// WAVE 1 export const drawLetters = () => { - // Implement this method for wave 1 + 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 + }; + + let letters = []; + for (let letter in letterPool) { + for (let i = 0; i < letterPool[letter]; i++) { + letters.push(letter); + } + } + + let hand = []; + for (let i = 0; i < 10; i++) { + let randomIndex = Math.floor(Math.random() * letters.length); + hand.push(letters[randomIndex]); + letters.splice(randomIndex, 1); + } + + return hand; }; +// WAVE 2 export const usesAvailableLetters = (input, lettersInHand) => { - // Implement this method for wave 2 + let lettersInHandCopy = [...lettersInHand]; + for (let letter of input) { + if (!lettersInHandCopy.includes(letter)) { + return false; + } else { + let index = lettersInHandCopy.indexOf(letter); + lettersInHandCopy.splice(index, 1); + } + } + + return true; }; +// WAVE 3 export const scoreWord = (word) => { - // Implement this method for wave 3 + if (word.length === 0) { + return 0; + } + + const letterScores = { + A: 1, E: 1, I: 1, O: 1, U: 1, L: 1, N: 1, R: 1, S: 1, T: 1, D: 2, + G: 2, + B: 3, C: 3, M: 3, P: 3, + F: 4, H: 4, V: 4, W: 4, Y: 4, + K: 5, + J: 8, X: 8, + Q: 10, Z: 10 + }; + + let score = 0; + + for (let letter of word.toUpperCase()) { + score += letterScores[letter]; + } + + if (word.length >= 7) { + score += 8; + } + + return score; }; + +// WAVE 4 export const highestScoreFrom = (words) => { - // Implement this method for wave 4 -}; + let highestScoringWord = ''; + let highestScore = 0; + + for (let word of words) { + let score = scoreWord(word); + + if (score > highestScore) { + highestScore = score; + highestScoringWord = word; + } else if (score === highestScore) { + if (word.length === 10 && highestScoringWord.length !== 10) { + highestScoringWord = word; + } else if (word.length < highestScoringWord.length && highestScoringWord.length !== 10) { + highestScoringWord = word; + } + } + } + + return { + word: highestScoringWord, + score: highestScore + }; +}; \ No newline at end of file diff --git a/test/adagrams.test.js b/test/adagrams.test.js index 1a0dc94e..9e2a6389 100644 --- a/test/adagrams.test.js +++ b/test/adagrams.test.js @@ -120,7 +120,12 @@ describe("Adagrams", () => { }); it("returns a score of 0 if given an empty input", () => { - throw "Complete test"; + const word = ''; + const correct = 0; + + const result = scoreWord(word); + + expect(result).toBe(correct); }); it("adds an extra 8 points if word is 7 or more characters long", () => { @@ -133,7 +138,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") }; @@ -144,10 +149,21 @@ describe("Adagrams", () => { it("accurately finds best scoring word even if not sorted", () => { const words = ["XXX", "XXXX", "X", "XX"]; const correct = { word: "XXXX", score: scoreWord("XXXX") }; - - throw "Complete test by adding an assertion"; + const result = highestScoreFrom(words); + + expect(result).toEqual(correct); }); + it("accurately finds best scoring word even if not sorted", () => { + const words = ["XXX", "XXXX", "X", "XX"]; + const correct = { word: "XXXX", score: scoreWord("XXXX") }; + + const result = highestScoreFrom(words); + + expect(result).toEqual(correct); +}); + + describe("in case of tied score", () => { const expectTie = (words) => { const scores = words.map((word) => scoreWord(word)); diff --git a/test/demo/model.test.js b/test/demo/model.test.js index 49bf9599..52ae8d23 100644 --- a/test/demo/model.test.js +++ b/test/demo/model.test.js @@ -1,7 +1,7 @@ import Model from 'demo/model'; import Adagrams from 'demo/adagrams'; -describe.skip('Game Model', () => { +describe('Game Model', () => { const config = { players: [ 'Player A',