From d28d3a276524e4eb9d2102d5591957b0edaf0df3 Mon Sep 17 00:00:00 2001 From: Soumya Sah <85212732+smysh@users.noreply.github.com> Date: Wed, 18 Jan 2023 23:42:41 -0800 Subject: [PATCH 1/7] Implemented drawLetters(). All drawletters tests are passing. --- src/adagrams.js | 70 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/src/adagrams.js b/src/adagrams.js index 7ec5afc7..4817c67e 100644 --- a/src/adagrams.js +++ b/src/adagrams.js @@ -1,5 +1,19 @@ export const drawLetters = () => { // Implement this method for wave 1 + let lp_copy = JSON.parse(JSON.stringify(LETTER_POOL)); + let drawLetters = []; + while (drawLetters.length < 10) { + let index = Math.floor(Math.random() * (26 - 0 + 1)) + 0; + console.log("index = " + index); + let letter = Object.keys(lp_copy)[index]; + console.log("drawn letter =" + letter); + if (lp_copy[letter] > 0) { + drawLetters.push(letter); + lp_copy[letter]--; + } + } + console.log("draw Letters" + drawLetters); + return drawLetters; }; export const usesAvailableLetters = (input, lettersInHand) => { @@ -13,3 +27,59 @@ export const scoreWord = (word) => { export const highestScoreFrom = (words) => { // Implement this method for wave 4 }; +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: 2, + Q: 10, + R: 1, + S: 1, + T: 1, + U: 1, + V: 4, + W: 4, + X: 8, + Y: 4, + Z: 10, +}; +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, +}; From 92fd2914412be566632428996d8f218ec33f05d2 Mon Sep 17 00:00:00 2001 From: Soumya Sah <85212732+smysh@users.noreply.github.com> Date: Thu, 19 Jan 2023 01:00:43 -0800 Subject: [PATCH 2/7] Implemented usesAvailableLetters(). All usesAvailableLetters tests are passing. --- src/adagrams.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/adagrams.js b/src/adagrams.js index 4817c67e..be775456 100644 --- a/src/adagrams.js +++ b/src/adagrams.js @@ -4,20 +4,26 @@ export const drawLetters = () => { let drawLetters = []; while (drawLetters.length < 10) { let index = Math.floor(Math.random() * (26 - 0 + 1)) + 0; - console.log("index = " + index); let letter = Object.keys(lp_copy)[index]; - console.log("drawn letter =" + letter); if (lp_copy[letter] > 0) { drawLetters.push(letter); lp_copy[letter]--; } } - console.log("draw Letters" + drawLetters); return drawLetters; }; export const usesAvailableLetters = (input, lettersInHand) => { // Implement this method for wave 2 + for (let letter of input) { + if (lettersInHand.includes(letter)) { + let i = lettersInHand.indexOf(letter); + lettersInHand.splice(i, 1); + } else { + return false; + } + } + return true; }; export const scoreWord = (word) => { From dca3fa1ceeb670e9850d4b0944d1a52a766dedeb Mon Sep 17 00:00:00 2001 From: Soumya Sah <85212732+smysh@users.noreply.github.com> Date: Thu, 19 Jan 2023 01:15:35 -0800 Subject: [PATCH 3/7] Implemented scoreWord(). And added incomplete test. All tests are passing for scoreWord. --- src/adagrams.js | 8 ++++++++ test/adagrams.test.js | 4 +++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/adagrams.js b/src/adagrams.js index be775456..f6606055 100644 --- a/src/adagrams.js +++ b/src/adagrams.js @@ -28,6 +28,14 @@ export const usesAvailableLetters = (input, lettersInHand) => { export const scoreWord = (word) => { // Implement this method for wave 3 + let score = 0; + for (let letter of word) { + score += LETTER_VALUES[letter.toUpperCase()]; + } + if (word.length > 6 && word.length < 11) { + score += 8; + } + return score; }; export const highestScoreFrom = (words) => { diff --git a/test/adagrams.test.js b/test/adagrams.test.js index 1a0dc94e..233b1759 100644 --- a/test/adagrams.test.js +++ b/test/adagrams.test.js @@ -120,7 +120,9 @@ describe("Adagrams", () => { }); it("returns a score of 0 if given an empty input", () => { - throw "Complete test"; + expectScores({ + "": 0, + }); }); it("adds an extra 8 points if word is 7 or more characters long", () => { From d09c15ae43b7c47ddbad01c50223edd1b3c5bff0 Mon Sep 17 00:00:00 2001 From: Soumya Sah <85212732+smysh@users.noreply.github.com> Date: Thu, 19 Jan 2023 02:07:14 -0800 Subject: [PATCH 4/7] Implemented highestScoreFrom(). And added incomplete test. All tests are passing for highestScoreFrom. --- src/adagrams.js | 25 +++++++++++++++++++++++++ test/adagrams.test.js | 4 ++-- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/adagrams.js b/src/adagrams.js index f6606055..6dc813f6 100644 --- a/src/adagrams.js +++ b/src/adagrams.js @@ -40,6 +40,31 @@ export const scoreWord = (word) => { export const highestScoreFrom = (words) => { // Implement this method for wave 4 + let highest_score = 0; + let highest_score_word = words[0]; + for (let word of words) { + let word_score = scoreWord(word); + if (word_score > highest_score) { + highest_score = word_score; + highest_score_word = word; + } else if (word_score === highest_score) { + // there is a tie + if (highest_score_word.length === 10) { + continue; + } else if (word.length === 10 && highest_score_word.length !== 10) { + highest_score = word_score; + highest_score_word = word; + } else if (word.length < highest_score_word.length) { + highest_score_word = word; + highest_score = word_score; + } + } + } + const highest_scores_lst = { + word: highest_score_word, + score: highest_score, + }; + return highest_scores_lst; }; const LETTER_VALUES = { A: 1, diff --git a/test/adagrams.test.js b/test/adagrams.test.js index 233b1759..fc35fcf9 100644 --- a/test/adagrams.test.js +++ b/test/adagrams.test.js @@ -135,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") }; @@ -147,7 +147,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 faceeabd6ffc539a6e895db7d24227e3fdc62322 Mon Sep 17 00:00:00 2001 From: Soumya Sah <85212732+smysh@users.noreply.github.com> Date: Thu, 19 Jan 2023 12:45:15 -0800 Subject: [PATCH 5/7] Some refactoring to code. --- src/adagrams.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/adagrams.js b/src/adagrams.js index 6dc813f6..59ae415b 100644 --- a/src/adagrams.js +++ b/src/adagrams.js @@ -3,8 +3,8 @@ export const drawLetters = () => { let lp_copy = JSON.parse(JSON.stringify(LETTER_POOL)); let drawLetters = []; while (drawLetters.length < 10) { - let index = Math.floor(Math.random() * (26 - 0 + 1)) + 0; - let letter = Object.keys(lp_copy)[index]; + const index = Math.floor(Math.random() * (26 + 1)); + const letter = Object.keys(lp_copy)[index]; if (lp_copy[letter] > 0) { drawLetters.push(letter); lp_copy[letter]--; @@ -17,7 +17,7 @@ export const usesAvailableLetters = (input, lettersInHand) => { // Implement this method for wave 2 for (let letter of input) { if (lettersInHand.includes(letter)) { - let i = lettersInHand.indexOf(letter); + const i = lettersInHand.indexOf(letter); lettersInHand.splice(i, 1); } else { return false; From be05c5066f33113d3fec619cf31799f79c2385ed Mon Sep 17 00:00:00 2001 From: Soumya Sah <85212732+smysh@users.noreply.github.com> Date: Thu, 19 Jan 2023 14:12:49 -0800 Subject: [PATCH 6/7] refactored drawLetters,added a helper function whichLetter so that letters chances to be picked depend to their values in the letter pool. --- src/adagrams.js | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/adagrams.js b/src/adagrams.js index 59ae415b..f4668fb8 100644 --- a/src/adagrams.js +++ b/src/adagrams.js @@ -3,8 +3,9 @@ export const drawLetters = () => { let lp_copy = JSON.parse(JSON.stringify(LETTER_POOL)); let drawLetters = []; while (drawLetters.length < 10) { - const index = Math.floor(Math.random() * (26 + 1)); - const letter = Object.keys(lp_copy)[index]; + const index = Math.floor(Math.random() * (98 + 1)); + const letter = whichLetter(index, lp_copy); + //const letter = Object.keys(lp_copy)[index]; if (lp_copy[letter] > 0) { drawLetters.push(letter); lp_copy[letter]--; @@ -13,6 +14,16 @@ export const drawLetters = () => { return drawLetters; }; +const whichLetter = (index, lp_copy) => { + for (let letter of Object.keys(lp_copy)) { + if (index === 0) { + return letter; + } else { + index -= lp_copy[letter]; + } + } +}; + export const usesAvailableLetters = (input, lettersInHand) => { // Implement this method for wave 2 for (let letter of input) { From f001f6f1edb0cd2d668517a5322b1d1f1ce11ab5 Mon Sep 17 00:00:00 2001 From: Soumya Sah <85212732+smysh@users.noreply.github.com> Date: Thu, 19 Jan 2023 23:32:16 -0800 Subject: [PATCH 7/7] added a helper function to add values of letter pool. --- src/adagrams.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/adagrams.js b/src/adagrams.js index f4668fb8..59eb5377 100644 --- a/src/adagrams.js +++ b/src/adagrams.js @@ -2,8 +2,9 @@ export const drawLetters = () => { // Implement this method for wave 1 let lp_copy = JSON.parse(JSON.stringify(LETTER_POOL)); let drawLetters = []; + const sum = sumOfValues(lp_copy); while (drawLetters.length < 10) { - const index = Math.floor(Math.random() * (98 + 1)); + const index = Math.floor(Math.random() * (sum + 1)); const letter = whichLetter(index, lp_copy); //const letter = Object.keys(lp_copy)[index]; if (lp_copy[letter] > 0) { @@ -24,6 +25,14 @@ const whichLetter = (index, lp_copy) => { } }; +const sumOfValues = (lp_copy) => { + let sum = 0; + for (let val of Object.values(lp_copy)) { + sum += val; + } + return sum; +}; + export const usesAvailableLetters = (input, lettersInHand) => { // Implement this method for wave 2 for (let letter of input) {