From e022c4d4e0dde93e3fabdd70511e81c21b3880bf Mon Sep 17 00:00:00 2001 From: kelly Date: Tue, 17 Jan 2023 15:07:11 -0800 Subject: [PATCH 1/6] Passes Wave 1 Tests --- src/adagrams.js | 50 ++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 47 insertions(+), 3 deletions(-) diff --git a/src/adagrams.js b/src/adagrams.js index 7ec5afc7..0e2db975 100644 --- a/src/adagrams.js +++ b/src/adagrams.js @@ -1,15 +1,59 @@ export const drawLetters = () => { // Implement this method for wave 1 + const letter_pool = []; + + const letter_counts = { + '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 + } + + for (let [key,value] of Object.entries(letter_counts)) { + for (let i = 0; i < value; ++i) { + letter_pool.push(key); + } + } + + const shuffle = function (letter_pool) { + letter_pool.sort(() => Math.random() - 0.5); + } + + shuffle(letter_pool); + const letter_pool_selection = letter_pool.slice(0, 10); + return letter_pool_selection; }; -export const usesAvailableLetters = (input, lettersInHand) => { +const usesAvailableLetters = (input, lettersInHand) => { // Implement this method for wave 2 }; -export const scoreWord = (word) => { +const scoreWord = (word) => { // Implement this method for wave 3 }; -export const highestScoreFrom = (words) => { +const highestScoreFrom = (words) => { // Implement this method for wave 4 }; From 0e70abbcf12092bac32e105ef79666cf09c7fa64 Mon Sep 17 00:00:00 2001 From: kelly Date: Tue, 17 Jan 2023 15:58:03 -0800 Subject: [PATCH 2/6] Wave 2 Tests Passed --- src/adagrams.js | 60 ++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 50 insertions(+), 10 deletions(-) diff --git a/src/adagrams.js b/src/adagrams.js index 0e2db975..3733ca5b 100644 --- a/src/adagrams.js +++ b/src/adagrams.js @@ -1,8 +1,8 @@ export const drawLetters = () => { // Implement this method for wave 1 - const letter_pool = []; + const letterPool = []; - const letter_counts = { + const letterCounts = { 'A': 9, 'B': 2, 'C': 2, @@ -31,23 +31,63 @@ export const drawLetters = () => { 'Z': 1 } - for (let [key,value] of Object.entries(letter_counts)) { + for (let [key,value] of Object.entries(letterCounts)) { for (let i = 0; i < value; ++i) { - letter_pool.push(key); + letterPool.push(key); } } - const shuffle = function (letter_pool) { - letter_pool.sort(() => Math.random() - 0.5); + const shuffle = function (letterPool) { + letterPool.sort(() => Math.random() - 0.5); } - shuffle(letter_pool); - const letter_pool_selection = letter_pool.slice(0, 10); - return letter_pool_selection; + shuffle(letterPool); + const letterPoolSelection = letterPool.slice(0, 10); + return letterPoolSelection; }; -const usesAvailableLetters = (input, lettersInHand) => { +export const usesAvailableLetters = (input, lettersInHand) => { // Implement this method for wave 2 + let valid = false; + + let word = input.toUpperCase(); + + // Create dictionary of letter frequency for lettersInHand + const letterBankCount = {} + + for (const letter of lettersInHand) { + if (letterBankCount.hasOwnProperty(letter)) { + letterBankCount[letter] += 1; + } else { + letterBankCount[letter] = 1; + } + } + + // Create dictionary of letter frequency for word + const wordCount = {} + + for (const letter of word) { + if (wordCount.hasOwnProperty(letter)) { + wordCount[letter] += 1; + } else { + wordCount[letter] = 1; + } + } + + // Check that word letter frequency complies with lettersInHand + + for (let [key,value] of Object.entries(wordCount)) { + if (!letterBankCount.hasOwnProperty(key)) { + return false; + } else if (wordCount[key] > letterBankCount[key]) { + return false; + } else if (wordCount[key] <= letterBankCount[key]) { + valid = true; + } + } + + return valid; + }; const scoreWord = (word) => { From fe828b32818df028a8a47a7334af05e44c50cf91 Mon Sep 17 00:00:00 2001 From: kelly Date: Tue, 17 Jan 2023 16:13:06 -0800 Subject: [PATCH 3/6] Wave 3 Tests Passed --- src/adagrams.js | 49 ++++++++++++++++++++++++++++++++++++++++++- test/adagrams.test.js | 4 +++- 2 files changed, 51 insertions(+), 2 deletions(-) diff --git a/src/adagrams.js b/src/adagrams.js index 3733ca5b..50bd6139 100644 --- a/src/adagrams.js +++ b/src/adagrams.js @@ -90,8 +90,55 @@ export const usesAvailableLetters = (input, lettersInHand) => { }; -const scoreWord = (word) => { +export const scoreWord = (word) => { // Implement this method for wave 3 + if (word === '') { + return 0; + } + + word = word.toUpperCase(); + + let points = 0; + + const scoreChart = { + '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 + } + + for (const letter of word) { + points += scoreChart[letter]; + } + + if (word.length >= 7 && word.length <= 10) { + points += 8; + } + + return points; + }; const highestScoreFrom = (words) => { diff --git a/test/adagrams.test.js b/test/adagrams.test.js index 1a0dc94e..24cc7211 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 79bb3b0ee1df27045a9d44d7b710a1fdc4639b8a Mon Sep 17 00:00:00 2001 From: kelly Date: Tue, 17 Jan 2023 16:40:43 -0800 Subject: [PATCH 4/6] Wave 4 Tests Passed --- src/adagrams.js | 34 +++++++++++++++++++++++++++++++++- test/adagrams.test.js | 4 ++-- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/src/adagrams.js b/src/adagrams.js index 50bd6139..a1cb2008 100644 --- a/src/adagrams.js +++ b/src/adagrams.js @@ -141,6 +141,38 @@ export const scoreWord = (word) => { }; -const highestScoreFrom = (words) => { +export const highestScoreFrom = (words) => { // Implement this method for wave 4 + const scores = {}; + + for (let word of words) { + word = word.toUpperCase(); + if (!scores.hasOwnProperty(word)) { + scores[word] = scoreWord(word) + } + } + + let highestScore = 0; + let winner; + + for (let [wordEntry, value] of Object.entries(scores)) { + if (scores[wordEntry] > highestScore) { + highestScore = scores[wordEntry]; + winner = wordEntry; + } else if (scores[wordEntry] === highestScore) { + if (winner.length === 10) { + break; + } else if (wordEntry.length === 10 || wordEntry.length < winner.length) { + winner = wordEntry; + } + } + } + + const winningObject = { + "word": winner, + "score": scores[winner], + } + + return winningObject; + }; diff --git a/test/adagrams.test.js b/test/adagrams.test.js index 24cc7211..9c38913f 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 bb314c5b7b6cfc5185a12de1ed6fee4afb5ee739 Mon Sep 17 00:00:00 2001 From: kelly Date: Sun, 22 Jan 2023 12:37:35 -0800 Subject: [PATCH 5/6] Refactoring --- src/adagrams.js | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/adagrams.js b/src/adagrams.js index a1cb2008..03ecbed1 100644 --- a/src/adagrams.js +++ b/src/adagrams.js @@ -52,22 +52,22 @@ export const usesAvailableLetters = (input, lettersInHand) => { let word = input.toUpperCase(); - // Create dictionary of letter frequency for lettersInHand + // Create object of letter frequency for lettersInHand const letterBankCount = {} for (const letter of lettersInHand) { - if (letterBankCount.hasOwnProperty(letter)) { + if (letter in letterBankCount) { letterBankCount[letter] += 1; } else { letterBankCount[letter] = 1; } } - // Create dictionary of letter frequency for word + // Create object of letter frequency for word const wordCount = {} for (const letter of word) { - if (wordCount.hasOwnProperty(letter)) { + if (letter in wordCount) { wordCount[letter] += 1; } else { wordCount[letter] = 1; @@ -76,8 +76,8 @@ export const usesAvailableLetters = (input, lettersInHand) => { // Check that word letter frequency complies with lettersInHand - for (let [key,value] of Object.entries(wordCount)) { - if (!letterBankCount.hasOwnProperty(key)) { + for (const key in wordCount) { + if (!(key in letterBankCount)) { return false; } else if (wordCount[key] > letterBankCount[key]) { return false; @@ -147,7 +147,7 @@ export const highestScoreFrom = (words) => { for (let word of words) { word = word.toUpperCase(); - if (!scores.hasOwnProperty(word)) { + if (!(word in scores)) { scores[word] = scoreWord(word) } } @@ -155,7 +155,8 @@ export const highestScoreFrom = (words) => { let highestScore = 0; let winner; - for (let [wordEntry, value] of Object.entries(scores)) { + for (const wordEntry in scores) { + if (scores[wordEntry] > highestScore) { highestScore = scores[wordEntry]; winner = wordEntry; From 124387c3a2a58b86f8316158c964dfe3d2d46eb8 Mon Sep 17 00:00:00 2001 From: kelly Date: Sun, 22 Jan 2023 13:43:04 -0800 Subject: [PATCH 6/6] Refactors and adds comments --- src/adagrams.js | 31 +++++++++++++++++++++---------- test/demo/model.test.js | 2 +- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/src/adagrams.js b/src/adagrams.js index 03ecbed1..2cfd29cc 100644 --- a/src/adagrams.js +++ b/src/adagrams.js @@ -1,7 +1,11 @@ export const drawLetters = () => { + // Implement this method for wave 1 + + // Create empty array for pool of letters const letterPool = []; + // Create object to hold letter counts const letterCounts = { 'A': 9, 'B': 2, @@ -31,12 +35,14 @@ export const drawLetters = () => { 'Z': 1 } + // Populate letterPool with correct number of each letter for (let [key,value] of Object.entries(letterCounts)) { for (let i = 0; i < value; ++i) { letterPool.push(key); } } + // Shuffle the letterPool and return selection of 10 letters const shuffle = function (letterPool) { letterPool.sort(() => Math.random() - 0.5); } @@ -47,9 +53,9 @@ export const drawLetters = () => { }; export const usesAvailableLetters = (input, lettersInHand) => { - // Implement this method for wave 2 - let valid = false; + // Implement this method for wave 2 + let word = input.toUpperCase(); // Create object of letter frequency for lettersInHand @@ -75,22 +81,19 @@ export const usesAvailableLetters = (input, lettersInHand) => { } // Check that word letter frequency complies with lettersInHand - for (const key in wordCount) { if (!(key in letterBankCount)) { return false; - } else if (wordCount[key] > letterBankCount[key]) { + } + if (wordCount[key] > letterBankCount[key]) { return false; - } else if (wordCount[key] <= letterBankCount[key]) { - valid = true; - } + } } - - return valid; - + return true; }; export const scoreWord = (word) => { + // Implement this method for wave 3 if (word === '') { return 0; @@ -100,6 +103,7 @@ export const scoreWord = (word) => { let points = 0; + // Create object to hold scoreChart const scoreChart = { 'A': 1, 'B': 3, @@ -129,6 +133,7 @@ export const scoreWord = (word) => { 'Z': 10 } + // Calculate score for each word for (const letter of word) { points += scoreChart[letter]; } @@ -142,9 +147,13 @@ export const scoreWord = (word) => { }; export const highestScoreFrom = (words) => { + // Implement this method for wave 4 + + // Create object to hold scores const scores = {}; + // Populate scores with word scores for (let word of words) { word = word.toUpperCase(); if (!(word in scores)) { @@ -155,6 +164,7 @@ export const highestScoreFrom = (words) => { let highestScore = 0; let winner; + // Determine highestScore and winner for (const wordEntry in scores) { if (scores[wordEntry] > highestScore) { @@ -169,6 +179,7 @@ export const highestScoreFrom = (words) => { } } + // Create winner object const winningObject = { "word": winner, "score": scores[winner], 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',