From 341eb969a2b934e99c025f83082b2334c209e819 Mon Sep 17 00:00:00 2001 From: Christelle Nkera Date: Thu, 21 Nov 2024 22:17:29 -0500 Subject: [PATCH 1/3] Completed drawLetters function --- src/adagrams.js | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/src/adagrams.js b/src/adagrams.js index 7ec5afc7..96f9182a 100644 --- a/src/adagrams.js +++ b/src/adagrams.js @@ -1,6 +1,37 @@ export const drawLetters = () => { - // Implement this method for wave 1 -}; + // implement this method for wave 1 + const LETTER_POOL = { + 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 MAX_HAND_COUNT = 10; + let availableLetters = []; + + // create a list of available letters based on their respective frequencies + for (let letter in LETTER_POOL) { + let originalLetterCount = LETTER_POOL[letter]; + for (let i = 0; i < originalLetterCount; i++) { + availableLetters.push(letter); + } + } + + let currentHand = []; + + // draw letters until we have 10 in the hand + while (currentHand.length < MAX_HAND_COUNT) { + const randomIndex = Math.floor(Math.random() * availableLetters.length); + const letter = availableLetters[randomIndex]; + + // add the letter to the hand and remove it from the available pool + currentHand.push(letter); + availableLetters.splice(randomIndex, 1); + } + + return currentHand; +} export const usesAvailableLetters = (input, lettersInHand) => { // Implement this method for wave 2 From 4ea87f98eabab6b5023c5fea0c1fa2c24b5edf6b Mon Sep 17 00:00:00 2001 From: Christelle Nkera Date: Wed, 27 Nov 2024 10:27:33 -0500 Subject: [PATCH 2/3] Completed tests and added assertions --- test/adagrams.test.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/test/adagrams.test.js b/test/adagrams.test.js index 1a0dc94e..498add86 100644 --- a/test/adagrams.test.js +++ b/test/adagrams.test.js @@ -120,7 +120,10 @@ describe("Adagrams", () => { }); it("returns a score of 0 if given an empty input", () => { - throw "Complete test"; + const word = ""; + const result = scoreWord(word); + + expect(result).toBe(0); }); it("adds an extra 8 points if word is 7 or more characters long", () => { @@ -133,7 +136,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 +148,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", () => { From 571851ae18f6e900cef7ceb766edaebb21317b40 Mon Sep 17 00:00:00 2001 From: Christelle Nkera Date: Wed, 27 Nov 2024 10:30:24 -0500 Subject: [PATCH 3/3] Updated scoreWord and highestScoreFrom functions --- src/adagrams.js | 75 ++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 68 insertions(+), 7 deletions(-) diff --git a/src/adagrams.js b/src/adagrams.js index 96f9182a..a25fad5f 100644 --- a/src/adagrams.js +++ b/src/adagrams.js @@ -1,5 +1,4 @@ export const drawLetters = () => { - // implement this method for wave 1 const LETTER_POOL = { 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, @@ -10,7 +9,6 @@ export const drawLetters = () => { const MAX_HAND_COUNT = 10; let availableLetters = []; - // create a list of available letters based on their respective frequencies for (let letter in LETTER_POOL) { let originalLetterCount = LETTER_POOL[letter]; for (let i = 0; i < originalLetterCount; i++) { @@ -20,12 +18,10 @@ export const drawLetters = () => { let currentHand = []; - // draw letters until we have 10 in the hand while (currentHand.length < MAX_HAND_COUNT) { const randomIndex = Math.floor(Math.random() * availableLetters.length); const letter = availableLetters[randomIndex]; - // add the letter to the hand and remove it from the available pool currentHand.push(letter); availableLetters.splice(randomIndex, 1); } @@ -34,13 +30,78 @@ export const drawLetters = () => { } export const usesAvailableLetters = (input, lettersInHand) => { - // Implement this method for wave 2 + const word = input.toUpperCase(); + + for (const inputLetter of word) { + const letterFreqInLetterBank = lettersInHand.filter((letter) => letter === inputLetter).length; + const letterFreqInWord = word.split('').filter((letter) => letter === inputLetter).length; + + if (letterFreqInWord > letterFreqInLetterBank) { + return false; + } + } + + return true; }; export const scoreWord = (word) => { - // Implement this method for wave 3 + const pointsDict = { + 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: 3, + Q: 10, R: 1, S: 1, T: 1, U: 1, V: 4, W: 4, X: 8, + Y: 4, Z: 10 + }; + + const BONUS_POINTS = 8; + + if (!word || word.length === 0) { + return 0; + } + + let totalPoints = 0; + const upperWord = word.toUpperCase(); + + for (const letter of upperWord) { + totalPoints += pointsDict[letter]; + } + + if (upperWord.length >= 7) { + totalPoints += BONUS_POINTS; + } + + return totalPoints; }; export const highestScoreFrom = (words) => { - // Implement this method for wave 4 + let bestWord = ''; + let bestScore = 0; + let bestWordLength = 0; + + for (const word of words) { + const wordScore = scoreWord(word); + const wordLength = word.length; + + if (wordScore > bestScore) { + bestWord = word; + bestScore = wordScore; + bestWordLength = wordLength; + + } else if (wordScore === bestScore) { + + + if (wordLength === 10 && bestWordLength !== 10) { + bestWord = word; + bestWordLength = wordLength; + + } else if (wordLength === 10 && bestWordLength === 10) { + continue; + + } else if (wordLength < bestWordLength && bestWordLength !== 10) { + bestWord = word; + bestWordLength = wordLength; + } + } + } + + return { word: bestWord, score: bestScore }; };