From a52f2ce611e2e33009c016d5d7272d174ccd35be Mon Sep 17 00:00:00 2001 From: Megan Gonzalez Date: Wed, 7 Jun 2023 13:54:03 -0400 Subject: [PATCH 01/11] created data structure for letter pool --- src/adagrams.js | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/adagrams.js b/src/adagrams.js index 7ec5afc7..3dd2ad8d 100644 --- a/src/adagrams.js +++ b/src/adagrams.js @@ -1,3 +1,32 @@ +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, +}; + export const drawLetters = () => { // Implement this method for wave 1 }; From 0d0cd603fcf558e95d64464072a954af52f1e5a9 Mon Sep 17 00:00:00 2001 From: Megan Gonzalez Date: Wed, 7 Jun 2023 13:58:30 -0400 Subject: [PATCH 02/11] create function to build array of all letters --- src/adagrams.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/adagrams.js b/src/adagrams.js index 3dd2ad8d..6a6e9fce 100644 --- a/src/adagrams.js +++ b/src/adagrams.js @@ -27,6 +27,17 @@ const LETTER_POOL = { Z: 1, }; +// create array of all letters +const createLetterList = letters => { + const letterList = []; + for (const letter in letters) { + for(let i = 0; i < letters[letter]; i++) { + letterList.push(letter); + } + } + return letterList; +} + export const drawLetters = () => { // Implement this method for wave 1 }; From c8852f4698e8ae0b1a50f45da29b3f6b922099b9 Mon Sep 17 00:00:00 2001 From: Megan Gonzalez Date: Wed, 7 Jun 2023 14:00:49 -0400 Subject: [PATCH 03/11] create function to generate random letter --- src/adagrams.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/adagrams.js b/src/adagrams.js index 6a6e9fce..ccebcfbb 100644 --- a/src/adagrams.js +++ b/src/adagrams.js @@ -38,6 +38,12 @@ const createLetterList = letters => { return letterList; } +const generateRandomLetter = () => { + const letters = createLetterList(LETTER_POOL); + const randomLetter = letters[Math.floor(Math.random() * letters.length)]; + return randomLetter; +} + export const drawLetters = () => { // Implement this method for wave 1 }; From eb6a73b5220d7741be0be4b48db8c7be7dc378b7 Mon Sep 17 00:00:00 2001 From: Megan Gonzalez Date: Wed, 7 Jun 2023 20:07:55 -0400 Subject: [PATCH 04/11] draws 10 letters. ensures each drawn letter is not drawn anymore times than the total amount of that letter --- src/adagrams.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/adagrams.js b/src/adagrams.js index ccebcfbb..12d3db60 100644 --- a/src/adagrams.js +++ b/src/adagrams.js @@ -1,3 +1,5 @@ +// import { random } from "core-js/core/number"; + const LETTER_POOL = { A: 9, B: 2, @@ -38,14 +40,27 @@ const createLetterList = letters => { return letterList; } +// generates random letter const generateRandomLetter = () => { const letters = createLetterList(LETTER_POOL); const randomLetter = letters[Math.floor(Math.random() * letters.length)]; return randomLetter; } +// draw 10 letters into hand +// ensure each drawn letter is drawn no more than the total amount of that letter export const drawLetters = () => { // Implement this method for wave 1 + const lettersDrawnForHand = []; + + while (lettersDrawnForHand.length < 10) { + let randomLetter = generateRandomLetter(); + const numberOfOccurences = lettersDrawnForHand.filter(element => element === randomLetter).length + if ( numberOfOccurences < LETTER_POOL[randomLetter]){ + lettersDrawnForHand.push(randomLetter); + } + } + return lettersDrawnForHand; }; export const usesAvailableLetters = (input, lettersInHand) => { From 6625a3fa93b98a51575d792b585f367291c4cafc Mon Sep 17 00:00:00 2001 From: Megan Gonzalez Date: Wed, 7 Jun 2023 20:26:24 -0400 Subject: [PATCH 05/11] handles input with letters not included in hand, also handles correct quanity of letters in hand --- src/adagrams.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/adagrams.js b/src/adagrams.js index 12d3db60..719d646a 100644 --- a/src/adagrams.js +++ b/src/adagrams.js @@ -63,8 +63,20 @@ export const drawLetters = () => { return lettersDrawnForHand; }; +// handles input that doesn't contain letters in hand +// handles the correct quantity of letters in hand export const usesAvailableLetters = (input, lettersInHand) => { // Implement this method for wave 2 + const letterHandCopy = JSON.parse(JSON.stringify(lettersInHand)); + + for(let i = 0; i < input.length; i++) { + let letterIndex = letterHandCopy.indexOf(input[i]); + if (letterIndex === -1) { + return false; + } + letterHandCopy[letterIndex] = ''; + } + return true; }; export const scoreWord = (word) => { From 352f51ed6125f7470e9f8ec10d580b69751ba8c1 Mon Sep 17 00:00:00 2001 From: Megan Gonzalez Date: Thu, 8 Jun 2023 16:51:23 -0400 Subject: [PATCH 06/11] adds variable for letter values to calculate score --- src/adagrams.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/adagrams.js b/src/adagrams.js index 719d646a..a57223f6 100644 --- a/src/adagrams.js +++ b/src/adagrams.js @@ -29,6 +29,16 @@ const LETTER_POOL = { Z: 1, }; +const LETTER_VALUES = { + 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, "":0 +} + // create array of all letters const createLetterList = letters => { const letterList = []; From 853f4db82ffd5b290635d1c0ea67e55f1aad31d0 Mon Sep 17 00:00:00 2001 From: Megan Gonzalez Date: Thu, 8 Jun 2023 16:53:09 -0400 Subject: [PATCH 07/11] refactored LETTER_VALUES variable --- src/adagrams.js | 33 ++++++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/src/adagrams.js b/src/adagrams.js index a57223f6..1ddde651 100644 --- a/src/adagrams.js +++ b/src/adagrams.js @@ -30,13 +30,32 @@ const LETTER_POOL = { }; const LETTER_VALUES = { - 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, "":0 + 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, } // create array of all letters From c31b69703657f36913633e53e6d6516470f8dd62 Mon Sep 17 00:00:00 2001 From: Megan Gonzalez Date: Thu, 8 Jun 2023 17:12:15 -0400 Subject: [PATCH 08/11] adds function to score each letter in submitted word --- src/adagrams.js | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/adagrams.js b/src/adagrams.js index 1ddde651..4abca5dd 100644 --- a/src/adagrams.js +++ b/src/adagrams.js @@ -56,7 +56,7 @@ const LETTER_VALUES = { X: 8, Y: 4, Z: 10, -} +}; // create array of all letters const createLetterList = letters => { @@ -110,6 +110,17 @@ export const usesAvailableLetters = (input, lettersInHand) => { export const scoreWord = (word) => { // Implement this method for wave 3 + const playerWord = word.toUpperCase() + let score = 0; + + for(const letter of playerWord) { + score += LETTER_VALUES[letter]; + } + if (playerWord.length > 6) { + score += 8; + } + + return score; }; export const highestScoreFrom = (words) => { From a9b3aa836b37f62ce6648170cb1d99d90501bf09 Mon Sep 17 00:00:00 2001 From: Megan Gonzalez Date: Thu, 8 Jun 2023 17:13:20 -0400 Subject: [PATCH 09/11] completed test to check for a score of 0 when word is an empty string --- test/adagrams.test.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/test/adagrams.test.js b/test/adagrams.test.js index 1a0dc94e..cc054528 100644 --- a/test/adagrams.test.js +++ b/test/adagrams.test.js @@ -32,6 +32,7 @@ const LETTER_POOL = { X: 1, Y: 2, Z: 1, + '': 0 }; describe("Adagrams", () => { @@ -120,7 +121,10 @@ describe("Adagrams", () => { }); it("returns a score of 0 if given an empty input", () => { - throw "Complete test"; + // throw "Complete test"; + expectScores({ + '':0 + }) }); it("adds an extra 8 points if word is 7 or more characters long", () => { From bfdaa2cf5b060f4efbb37145805ad6198d98fcfc Mon Sep 17 00:00:00 2001 From: Megan Gonzalez Date: Thu, 8 Jun 2023 18:20:46 -0400 Subject: [PATCH 10/11] adds function to find highest scoring word and deal with tie breaker --- src/adagrams.js | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/adagrams.js b/src/adagrams.js index 4abca5dd..2ce7d8f8 100644 --- a/src/adagrams.js +++ b/src/adagrams.js @@ -108,6 +108,8 @@ export const usesAvailableLetters = (input, lettersInHand) => { return true; }; +// scores each letter in the user submitted word +// if word is 7 or more letters, word gets 8 bonus points export const scoreWord = (word) => { // Implement this method for wave 3 const playerWord = word.toUpperCase() @@ -123,6 +125,29 @@ export const scoreWord = (word) => { return score; }; +// finds the highest scoring word from all words submitted +// in case of tie, will break tie based on shortest length unless word is 10 letters exactly export const highestScoreFrom = (words) => { // Implement this method for wave 4 + + let highestScore = 0; + let highestScoringWord = ''; + + for(const word of words){ + let score = scoreWord(word); + + if (score > highestScore) { + highestScore = score; + highestScoringWord = word; + } + else if (score === highestScore) { + if(highestScoringWord.length != 10 && (word.length === 10 || word.length < highestScoringWord.length)) { + highestScoringWord = word + } + } + } + return { + 'score': highestScore, + 'word': highestScoringWord + } }; From 15fbcf26c33da4c8d185cdd9d786b633c22c3d82 Mon Sep 17 00:00:00 2001 From: Megan Gonzalez Date: Thu, 8 Jun 2023 18:22:54 -0400 Subject: [PATCH 11/11] adds assertion to correctly find highest scoring word even if not sorted --- test/adagrams.test.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/test/adagrams.test.js b/test/adagrams.test.js index cc054528..261f29ee 100644 --- a/test/adagrams.test.js +++ b/test/adagrams.test.js @@ -137,7 +137,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") }; @@ -149,7 +149,8 @@ describe("Adagrams", () => { const words = ["XXX", "XXXX", "X", "XX"]; const correct = { word: "XXXX", score: scoreWord("XXXX") }; - throw "Complete test by adding an assertion"; + // throw "Complete test by adding an assertion"; + expect(highestScoreFrom(words)).toEqual(correct) }); describe("in case of tied score", () => {