From 4608d7fdb57d56ce47ae62535b4d2f96671b47bb Mon Sep 17 00:00:00 2001 From: Sunitha Nela Date: Tue, 26 Nov 2024 23:25:39 -0800 Subject: [PATCH 01/10] Completed Adagrams --- src/adagrams.js | 138 ++++++++++++++++++++++++++++++++++++++++ test/adagrams.test.js | 12 ++-- test/demo/model.test.js | 2 +- 3 files changed, 147 insertions(+), 5 deletions(-) diff --git a/src/adagrams.js b/src/adagrams.js index 7ec5afc7..d2946783 100644 --- a/src/adagrams.js +++ b/src/adagrams.js @@ -1,15 +1,153 @@ +/*constructing a leeterpool object with letter as key and no. of times it can be drawn as value*/ +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, +}; + export const drawLetters = () => { // Implement this method for wave 1 + const drawnLetters = []; + //Evaluating total size of probable letters can be drawn + let totalSize = Object.values(LETTERPOOL).reduce((acc, val) => acc + val, 0); + let letterPoolArr = Object.entries(LETTERPOOL); + let count = 0, + letterIdx; + const handSize = 10; + + while (drawnLetters.length < handSize) { + if (totalSize === 0) { + console.log('No more letters available to draw.'); + break; + } + + letterIdx = Math.random() * totalSize; + for (const [letter, frequency] of letterPoolArr) { + count += frequency; + if (letterIdx < count) { + drawnLetters.push(letter); + totalSize -= 1; + //updating array with already drawn letters + const updatedArr = letterPoolArr.map(([l, freq]) => + l === letter ? [l, freq - 1] : [l, freq] + ); + letterPoolArr = updatedArr.filter(([l, freq]) => freq > 0); + break; + } + } + } + return drawnLetters; }; export const usesAvailableLetters = (input, lettersInHand) => { // Implement this method for wave 2 + for (let letter of lettersInHand) { + letter.toUpperCase(); + } + const letterObj = {}; + for (let letter of lettersInHand) { + letterObj[letter] ? letterObj[letter]++ : (letterObj[letter] = 1); + } + //Utilizing object to track the letters drawn + for (let letter of input) { + letter = letter.toUpperCase(); + if (letterObj[letter] === undefined || letterObj[letter] === 0) + return false; + else { + letterObj[letter] -= 1; + } + } + return true; }; export const scoreWord = (word) => { // Implement this method for wave 3 + + 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, + }; + word = word.toUpperCase(); + let totalScore = 0; + + for (let i = 0; i < word.length; i++) { + totalScore += LETTERSCORES[word[i]]; + } + //Adding 8 bonus points for letters with length 7 to 10 + if (word.length >= 7 && word.length <= 10) { + totalScore += 8; + } + + return totalScore; }; export const highestScoreFrom = (words) => { // Implement this method for wave 4 + const wordScores = {}; + let maxWord = ''; + let maxScore = 0; + for (let word of words) { + wordScores[word] = scoreWord(word); + } + for (let [word, score] of Object.entries(wordScores)) { + + if (score > maxScore) { + maxWord = word; + maxScore = score; + } else if (score === maxScore) { + //logic for words with score tied + if (word.length === 10 && maxWord.length !== 10) maxWord = word; + else if (word.length < maxWord.length && maxWord.length !== 10) + maxWord = word; + } + } + + return { score: maxScore, word: maxWord }; }; diff --git a/test/adagrams.test.js b/test/adagrams.test.js index 1a0dc94e..bea3f3da 100644 --- a/test/adagrams.test.js +++ b/test/adagrams.test.js @@ -38,7 +38,6 @@ describe("Adagrams", () => { describe("drawLetters", () => { it("draws ten letters from the letter pool", () => { const drawn = drawLetters(); - expect(drawn).toHaveLength(10); }); @@ -120,7 +119,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", () => { @@ -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,9 @@ 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", () => { 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 e1513d31befa1128a460268b831119df4246551d Mon Sep 17 00:00:00 2001 From: nelasunitha <80846358+nelasunitha@users.noreply.github.com> Date: Fri, 6 Dec 2024 11:47:30 -0800 Subject: [PATCH 02/10] Update src/adagrams.js Co-authored-by: Ashley Yang --- src/adagrams.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/adagrams.js b/src/adagrams.js index d2946783..7cfbac98 100644 --- a/src/adagrams.js +++ b/src/adagrams.js @@ -1,5 +1,5 @@ /*constructing a leeterpool object with letter as key and no. of times it can be drawn as value*/ -const LETTERPOOL = { +const LETTER_POOL = { A: 9, B: 2, C: 2, From f650ca2d3837baabc9c39b2352d36389e52af8c3 Mon Sep 17 00:00:00 2001 From: nelasunitha <80846358+nelasunitha@users.noreply.github.com> Date: Fri, 6 Dec 2024 11:47:49 -0800 Subject: [PATCH 03/10] Update src/adagrams.js Co-authored-by: Ashley Yang --- src/adagrams.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/adagrams.js b/src/adagrams.js index 7cfbac98..e686b863 100644 --- a/src/adagrams.js +++ b/src/adagrams.js @@ -36,7 +36,7 @@ export const drawLetters = () => { let letterPoolArr = Object.entries(LETTERPOOL); let count = 0, letterIdx; - const handSize = 10; + const HAND_SIZE = 10; while (drawnLetters.length < handSize) { if (totalSize === 0) { From f55bfe46a32364cf8321deaf1536588958a39325 Mon Sep 17 00:00:00 2001 From: nelasunitha <80846358+nelasunitha@users.noreply.github.com> Date: Fri, 6 Dec 2024 11:47:57 -0800 Subject: [PATCH 04/10] Update src/adagrams.js Co-authored-by: Ashley Yang --- src/adagrams.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/adagrams.js b/src/adagrams.js index e686b863..370f874d 100644 --- a/src/adagrams.js +++ b/src/adagrams.js @@ -34,8 +34,8 @@ export const drawLetters = () => { //Evaluating total size of probable letters can be drawn let totalSize = Object.values(LETTERPOOL).reduce((acc, val) => acc + val, 0); let letterPoolArr = Object.entries(LETTERPOOL); - let count = 0, - letterIdx; + let count = 0; + let letterIdx; const HAND_SIZE = 10; while (drawnLetters.length < handSize) { From 2536bd98552703f7534bb81a84b2f5123e63c895 Mon Sep 17 00:00:00 2001 From: nelasunitha <80846358+nelasunitha@users.noreply.github.com> Date: Fri, 6 Dec 2024 11:49:03 -0800 Subject: [PATCH 05/10] Update src/adagrams.js Co-authored-by: Ashley Yang --- src/adagrams.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/adagrams.js b/src/adagrams.js index 370f874d..1c78071e 100644 --- a/src/adagrams.js +++ b/src/adagrams.js @@ -64,11 +64,8 @@ export const drawLetters = () => { export const usesAvailableLetters = (input, lettersInHand) => { // Implement this method for wave 2 - for (let letter of lettersInHand) { - letter.toUpperCase(); - } const letterObj = {}; - for (let letter of lettersInHand) { + for (let letter of lettersInHand.toUpperCase()) { letterObj[letter] ? letterObj[letter]++ : (letterObj[letter] = 1); } //Utilizing object to track the letters drawn From 4e44764213eab0eda482c85cae5a8f4c9040129d Mon Sep 17 00:00:00 2001 From: nelasunitha <80846358+nelasunitha@users.noreply.github.com> Date: Fri, 6 Dec 2024 11:49:16 -0800 Subject: [PATCH 06/10] Update src/adagrams.js Co-authored-by: Ashley Yang --- src/adagrams.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/adagrams.js b/src/adagrams.js index 1c78071e..0087c64a 100644 --- a/src/adagrams.js +++ b/src/adagrams.js @@ -130,7 +130,7 @@ export const highestScoreFrom = (words) => { const wordScores = {}; let maxWord = ''; let maxScore = 0; - for (let word of words) { + for (const word of words) { wordScores[word] = scoreWord(word); } for (let [word, score] of Object.entries(wordScores)) { From 0fe8c4cc430112a224a1421990b655f096ec36bd Mon Sep 17 00:00:00 2001 From: nelasunitha <80846358+nelasunitha@users.noreply.github.com> Date: Fri, 6 Dec 2024 11:49:23 -0800 Subject: [PATCH 07/10] Update src/adagrams.js Co-authored-by: Ashley Yang --- src/adagrams.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/adagrams.js b/src/adagrams.js index 0087c64a..668bc863 100644 --- a/src/adagrams.js +++ b/src/adagrams.js @@ -133,7 +133,7 @@ export const highestScoreFrom = (words) => { for (const word of words) { wordScores[word] = scoreWord(word); } - for (let [word, score] of Object.entries(wordScores)) { + for (const [word, score] of Object.entries(wordScores)) { if (score > maxScore) { maxWord = word; From 9f0f1c23ff7e6378c74aab43d28909616b8197d0 Mon Sep 17 00:00:00 2001 From: nelasunitha <80846358+nelasunitha@users.noreply.github.com> Date: Fri, 6 Dec 2024 11:50:00 -0800 Subject: [PATCH 08/10] Update src/adagrams.js Co-authored-by: Ashley Yang --- src/adagrams.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/adagrams.js b/src/adagrams.js index 668bc863..5cebed5f 100644 --- a/src/adagrams.js +++ b/src/adagrams.js @@ -118,8 +118,9 @@ export const scoreWord = (word) => { totalScore += LETTERSCORES[word[i]]; } //Adding 8 bonus points for letters with length 7 to 10 + const BONUS_POINTS = 8; if (word.length >= 7 && word.length <= 10) { - totalScore += 8; + totalScore += BONUS_POINTS; } return totalScore; From c9f981502a2ad8e6a70459cda53f83921ffc1f07 Mon Sep 17 00:00:00 2001 From: nelasunitha <80846358+nelasunitha@users.noreply.github.com> Date: Fri, 6 Dec 2024 11:50:31 -0800 Subject: [PATCH 09/10] Update src/adagrams.js Co-authored-by: Ashley Yang --- src/adagrams.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/adagrams.js b/src/adagrams.js index 5cebed5f..dfc57a70 100644 --- a/src/adagrams.js +++ b/src/adagrams.js @@ -69,8 +69,7 @@ export const usesAvailableLetters = (input, lettersInHand) => { letterObj[letter] ? letterObj[letter]++ : (letterObj[letter] = 1); } //Utilizing object to track the letters drawn - for (let letter of input) { - letter = letter.toUpperCase(); + for (let letter of input.toUpperCase()) { if (letterObj[letter] === undefined || letterObj[letter] === 0) return false; else { From 44cdf0a9ac6591b7289d004b47aebf9d76087068 Mon Sep 17 00:00:00 2001 From: nelasunitha <80846358+nelasunitha@users.noreply.github.com> Date: Fri, 6 Dec 2024 11:50:53 -0800 Subject: [PATCH 10/10] Update src/adagrams.js Co-authored-by: Ashley Yang --- src/adagrams.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/adagrams.js b/src/adagrams.js index dfc57a70..efbef5dc 100644 --- a/src/adagrams.js +++ b/src/adagrams.js @@ -82,7 +82,7 @@ export const usesAvailableLetters = (input, lettersInHand) => { export const scoreWord = (word) => { // Implement this method for wave 3 - const LETTERSCORES = { + const LETTER_SCORES = { A: 1, E: 1, I: 1,