From db62a57d9fb8fe0cab133b9f02f69256ef4ef18f Mon Sep 17 00:00:00 2001 From: Jodi Denney Date: Sun, 5 Jun 2022 12:29:23 -0700 Subject: [PATCH 1/2] Passed wave 1 and 2 - drawLetters and usesAvailableLetters --- src/adagrams.js | 56 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 54 insertions(+), 2 deletions(-) diff --git a/src/adagrams.js b/src/adagrams.js index ebc2839c..e257d0b8 100644 --- a/src/adagrams.js +++ b/src/adagrams.js @@ -1,9 +1,61 @@ +// import { LETTER_POOL } from "../test/adagrams.test"; +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 + const hand = []; + const letterBank = []; + // Build a letterBank array where each letters appearance is accurately weighted + for (const [key, count] of Object.entries(LETTER_POOL)) { + const start = letterBank.length; + letterBank.length += count; + letterBank.fill(key, start, letterBank.length); + } + // Build a hand of ten random strings from the letterBank removing selected letter fom letterBank + for (let i = 0; i < 10; i++) { + let temp = Math.floor(Math.random() * letterBank.length); + hand.push(letterBank[temp]); + letterBank.splice(temp, 1); + } + return hand; }; export const usesAvailableLetters = (input, lettersInHand) => { - // Implement this method for wave 2 + input = input.toUpperCase(); + for (let i = 0; i < input.length; i++) { + if (!lettersInHand.includes(input[i])) { + return false; + } + let index = lettersInHand.indexOf(input[i]); + lettersInHand.splice(index, 1); + } + return true; }; export const scoreWord = (word) => { From ab614d334873053244b493ac3c82d8e121973827 Mon Sep 17 00:00:00 2001 From: Jodi Denney Date: Mon, 6 Jun 2022 09:37:12 -0700 Subject: [PATCH 2/2] Passed waves 3 and 4. Added missing asserts to tests --- src/adagrams.js | 66 +++++++++++++++++++++++++++++++++++++++---- test/adagrams.test.js | 8 ++++-- 2 files changed, 66 insertions(+), 8 deletions(-) diff --git a/src/adagrams.js b/src/adagrams.js index e257d0b8..ad0b9de1 100644 --- a/src/adagrams.js +++ b/src/adagrams.js @@ -28,6 +28,35 @@ const LETTER_POOL = { Z: 1, }; +const LETTER_SCORE = { + 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, +}; + export const drawLetters = () => { const hand = []; const letterBank = []; @@ -48,20 +77,47 @@ export const drawLetters = () => { export const usesAvailableLetters = (input, lettersInHand) => { input = input.toUpperCase(); + let handCopy = [...lettersInHand]; for (let i = 0; i < input.length; i++) { - if (!lettersInHand.includes(input[i])) { + if (!handCopy.includes(input[i])) { return false; } - let index = lettersInHand.indexOf(input[i]); - lettersInHand.splice(index, 1); + let index = handCopy.indexOf(input[i]); + handCopy.splice(index, 1); } return true; }; export const scoreWord = (word) => { - // Implement this method for wave 3 + word = word.toUpperCase(); + let score = 0; + for (let i = 0; i < word.length; i++) { + score += LETTER_SCORE[word[i]]; + } + if (word.length > 6) { + score += 8; + } + return score; }; export const highestScoreFrom = (words) => { - // Implement this method for wave 1 + const highestWord = { + score: 0, + word: "", + }; + for (let i = 0; i < words.length; i++) { + if (scoreWord(words[i]) > highestWord.score) { + highestWord.score = scoreWord(words[i]); + highestWord.word = words[i]; + } else if (scoreWord(words[i]) === highestWord.score) { + if (highestWord.word.length === 10) { + continue; + } else if (words[i].length === 10) { + highestWord.word = words[i]; + } else if (highestWord.word.length > words[i].length) { + highestWord.word = words[i]; + } + } + } + return highestWord; }; diff --git a/test/adagrams.test.js b/test/adagrams.test.js index 1a0dc94e..fc35fcf9 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", () => { @@ -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,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", () => {