From bd7a508ad20d34e83f68b36ee7efcdb96e30a477 Mon Sep 17 00:00:00 2001 From: Kaliane Date: Tue, 6 Jun 2023 21:48:55 -0400 Subject: [PATCH 1/2] All tests unskipped, completed, and passing. --- src/adagrams.js | 132 ++++++++++++++++++++++++++++++++++++++-- test/adagrams.test.js | 24 ++++++-- test/demo/model.test.js | 2 +- 3 files changed, 148 insertions(+), 10 deletions(-) diff --git a/src/adagrams.js b/src/adagrams.js index 7ec5afc7..b10e8f3c 100644 --- a/src/adagrams.js +++ b/src/adagrams.js @@ -1,15 +1,137 @@ +// 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; // If all letters in input are in the hand, 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', From d81ca0c144dd1c03b2713a2fe9ab1abfed096748 Mon Sep 17 00:00:00 2001 From: Kaliane Date: Tue, 6 Jun 2023 21:57:13 -0400 Subject: [PATCH 2/2] Reformatted 'letterPool' and 'letterScores' for readability. --- src/adagrams.js | 62 +++++++++---------------------------------------- 1 file changed, 11 insertions(+), 51 deletions(-) diff --git a/src/adagrams.js b/src/adagrams.js index b10e8f3c..e60228a4 100644 --- a/src/adagrams.js +++ b/src/adagrams.js @@ -1,32 +1,11 @@ // WAVE 1 export const drawLetters = () => { 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 + '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 = []; @@ -58,7 +37,7 @@ export const usesAvailableLetters = (input, lettersInHand) => { } } - return true; // If all letters in input are in the hand, return true + return true; }; // WAVE 3 @@ -68,32 +47,13 @@ export const scoreWord = (word) => { } const letterScores = { - A: 1, - E: 1, - I: 1, - O: 1, - U: 1, - L: 1, - N: 1, - R: 1, - S: 1, - T: 1, - D: 2, + 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, + 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 + J: 8, X: 8, + Q: 10, Z: 10 }; let score = 0;