From df9b02972ec05c66eb2d992e3e5f1b27b7a82db0 Mon Sep 17 00:00:00 2001 From: Madeline Bennett Date: Thu, 21 Nov 2024 15:49:25 -0800 Subject: [PATCH 1/4] added first draw letters function and got it to test the following tests: "draws ten letters from pool ", "returns an array, and each is a single letter str", "does not draw a letter too many times". --- package-lock.json | 12 +++---- src/adagrams.js | 81 ++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 86 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0c4df718..6715ee69 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2056,9 +2056,9 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.0.tgz", - "integrity": "sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig==", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.3.tgz", + "integrity": "sha512-2b/g5hRmpbb1o4GnTZax9N9m0FXzz9OV42ZzI4rDDMDuHUqigAiQCEWChBWCY4ztAGVRjoWT19v0yMmc5/L5kA==", "dev": true, "license": "Apache-2.0", "peer": true, @@ -4781,9 +4781,9 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "license": "MIT", "dependencies": { diff --git a/src/adagrams.js b/src/adagrams.js index 7ec5afc7..74ff08a0 100644 --- a/src/adagrams.js +++ b/src/adagrams.js @@ -1,6 +1,83 @@ export const drawLetters = () => { + 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 + }; + + let letterPoolList= generateLetterPoolList(letterPool); + let lPLLength = letterPoolList.length; + + let drawnLetters = [] + for (let iteration = 0; iteration < 10; iteration++) { + console.log(`length of letter list`) + console.log(letterPoolList.length) + let randomIndex = randomInteger(0, lPLLength); + console.log(`random index is:`) + console.log(randomIndex) + // console.log(`letter list before`) + // console.log(letterPoolList) + let pulledLetter = letterPoolList.splice(randomIndex,1); + // console.log(`letter list after `) + // console.log(letterPoolList) + drawnLetters.push(pulledLetter[0]); + console.log(`pulled letter is: `) + console.log(pulledLetter[0]) + console.log(`drawn letter list after`) + console.log(drawnLetters) + + lPLLength = letterPoolList.length; + } + console.log(`final drawn letters`) + console.log(drawnLetters) + return drawnLetters; +} + +const generateLetterPoolList = (letterPool) => { + let letterPoolList = []; + Object.keys(letterPool).forEach(key => { + const timesToAdd = letterPool[key]; + for (let i = 0; i < timesToAdd; i++) { + letterPoolList.push(key); + } + }) + return letterPoolList; +} + +const randomInteger = (min,max) => { + console.log(`min is`) + console.log(min) + console.log(`max is`) + console.log(max) + return Math.random(min,max) + // return Math.floor(Math.random() * (max - min - 1)) + min; +} + + // Implement this method for wave 1 -}; export const usesAvailableLetters = (input, lettersInHand) => { // Implement this method for wave 2 @@ -13,3 +90,5 @@ export const scoreWord = (word) => { export const highestScoreFrom = (words) => { // Implement this method for wave 4 }; + + From 396660f7474367d6532a3e278edda458468c3796 Mon Sep 17 00:00:00 2001 From: Madeline Bennett Date: Sun, 24 Nov 2024 21:59:38 -0800 Subject: [PATCH 2/4] reworked part one to use dict over array, wrote part two functions and helper function that turns arrays into an occurence dictionary. all tests pass from part one and part two. --- src/adagrams.js | 116 +++++++++++++++++++++++++++++------------------- 1 file changed, 70 insertions(+), 46 deletions(-) diff --git a/src/adagrams.js b/src/adagrams.js index 74ff08a0..69533329 100644 --- a/src/adagrams.js +++ b/src/adagrams.js @@ -26,62 +26,86 @@ export const drawLetters = () => { X : 1, Y : 2, Z : 1 - }; - - let letterPoolList= generateLetterPoolList(letterPool); - let lPLLength = letterPoolList.length; - - let drawnLetters = [] + }; + const drawnLetters = []; for (let iteration = 0; iteration < 10; iteration++) { - console.log(`length of letter list`) - console.log(letterPoolList.length) - let randomIndex = randomInteger(0, lPLLength); - console.log(`random index is:`) - console.log(randomIndex) - // console.log(`letter list before`) - // console.log(letterPoolList) - let pulledLetter = letterPoolList.splice(randomIndex,1); - // console.log(`letter list after `) - // console.log(letterPoolList) - drawnLetters.push(pulledLetter[0]); - console.log(`pulled letter is: `) - console.log(pulledLetter[0]) - console.log(`drawn letter list after`) - console.log(drawnLetters) - - lPLLength = letterPoolList.length; + const keys = Object.keys(letterPool); + const key = keys[getRandomInt(0, keys.length)]; + letterPool[key]--; + drawnLetters.push(key) + if (letterPool[key] == 0) { + delete letterPool[key]; + } } - console.log(`final drawn letters`) - console.log(drawnLetters) return drawnLetters; + +}; + +const getRandomInt = (min, max) => { + const minCeiled = Math.ceil(min); + const maxFloored = Math.floor(max); + return Math.floor(Math.random() * (maxFloored - minCeiled) + minCeiled); // The maximu } + + +export const usesAvailableLetters = (input, lettersInHand) => { -const generateLetterPoolList = (letterPool) => { - let letterPoolList = []; - Object.keys(letterPool).forEach(key => { - const timesToAdd = letterPool[key]; - for (let i = 0; i < timesToAdd; i++) { - letterPoolList.push(key); + if (input.length > 10) { + return false; + } + const lettersInHandOccurenceDictionary = arrayToOccurenceDict(lettersInHand) + for (let index = 0; index < input.length; index++) { + let key = input[index]; + if (lettersInHandOccurenceDictionary[key] === undefined) { + return false + } + else if (lettersInHandOccurenceDictionary[key] === 0) { + return false + } + else { + lettersInHandOccurenceDictionary[key]--; } - }) - return letterPoolList; -} -const randomInteger = (min,max) => { - console.log(`min is`) - console.log(min) - console.log(`max is`) - console.log(max) - return Math.random(min,max) - // return Math.floor(Math.random() * (max - min - 1)) + min; -} + } + return true; + } - // Implement this method for wave 1 +const arrayToOccurenceDict = (array) => { + const occurenceDictionary = {} + for (let index = 0; index < array.length; index ++){ + let key = array[index]; + if (occurenceDictionary[key] !== undefined) { + occurenceDictionary[key]++ + } else { + occurenceDictionary[key] = 1 + } + } + return occurenceDictionary + } + +// const dCLettersinHand = JSON.parse(JSON.stringify(lettersInHand)); +// for (let index = 0; index < input.length; index ++) { +// let letter = input[index] +// if (checkArray(lettersInHand,letter) !== undefined ) { +// let dcLettersinHand = dcLettersinHand.remove(letter); +// else { + -export const usesAvailableLetters = (input, lettersInHand) => { - // Implement this method for wave 2 -}; +// } +// }; + + + + +// // } + +// const checkArray = (array, subStr) => { +// const regex = new RegExp(substr, 'i'); +// const subStr = array.filter(str => regex.test(str)); +// } + +// }; export const scoreWord = (word) => { // Implement this method for wave 3 From fe76e5a3c846755c08c1fde72707d61f132444de Mon Sep 17 00:00:00 2001 From: Madeline Bennett Date: Mon, 25 Nov 2024 00:39:06 -0800 Subject: [PATCH 3/4] finished wave 4 all tests passed. --- src/adagrams.js | 130 +++++++++++++++++++++++++++++------------- test/adagrams.test.js | 8 ++- 2 files changed, 94 insertions(+), 44 deletions(-) diff --git a/src/adagrams.js b/src/adagrams.js index 69533329..f423885a 100644 --- a/src/adagrams.js +++ b/src/adagrams.js @@ -41,15 +41,8 @@ export const drawLetters = () => { }; -const getRandomInt = (min, max) => { - const minCeiled = Math.ceil(min); - const maxFloored = Math.floor(max); - return Math.floor(Math.random() * (maxFloored - minCeiled) + minCeiled); // The maximu -} - -export const usesAvailableLetters = (input, lettersInHand) => { - +export const usesAvailableLetters = (input, lettersInHand) => { if (input.length > 10) { return false; } @@ -65,11 +58,68 @@ export const usesAvailableLetters = (input, lettersInHand) => { else { lettersInHandOccurenceDictionary[key]--; } - - } + } return true; + }; + + + + +export const scoreWord = (word) => { + if (word.length === 0) { + return 0; } + let wordScore = 0; + const letterOccurenceDict = arrayToOccurenceDict(word.toUpperCase()) + const keys = Object.keys(letterOccurenceDict); + for (let index = 0; index < keys.length; index++) { + let key = keys[index]; + wordScore = wordScore + (getLetterValue(key,letterOccurenceDict)) + } + if (word.length >= 7) { + wordScore += 8 + } + console.log(`word score is `, wordScore) + return wordScore + + + + + // Implement this method for wave 3 +}; + +export const highestScoreFrom = (words) => { + let topScoreNum = 0; + let topScoreWord = ''; + + for (let index =0; index topScoreNum){ + // console.log(`current score was greater than top score`) + topScoreNum = currentScore; + topScoreWord = currentWord; + } + else if (currentScore === topScoreNum) { + // console.log(`current score equal to top score`) + if (currentWord.length === 10 && topScoreWord.length !== 10) { + // console.log(`current word is 10 top is not, current wins`) + topScoreNum = currentScore; + topScoreWord =currentWord; + } + else if (currentWord.length < topScoreWord.length && topScoreWord.length !== 10) { + topScoreNum = currentScore; + topScoreWord = currentWord; + } + } + + } + console.log({word: topScoreWord, score: topScoreNum}) + return {word: topScoreWord, score:topScoreNum} +}; + +//// helper functions/////// const arrayToOccurenceDict = (array) => { const occurenceDictionary = {} @@ -84,35 +134,33 @@ const arrayToOccurenceDict = (array) => { return occurenceDictionary } -// const dCLettersinHand = JSON.parse(JSON.stringify(lettersInHand)); -// for (let index = 0; index < input.length; index ++) { -// let letter = input[index] -// if (checkArray(lettersInHand,letter) !== undefined ) { -// let dcLettersinHand = dcLettersinHand.remove(letter); -// else { - - -// } -// }; - - - - -// // } - -// const checkArray = (array, subStr) => { -// const regex = new RegExp(substr, 'i'); -// const subStr = array.filter(str => regex.test(str)); -// } - -// }; - -export const scoreWord = (word) => { - // Implement this method for wave 3 -}; - -export const highestScoreFrom = (words) => { - // Implement this method for wave 4 -}; - + const getRandomInt = (min, max) => { + const minCeiled = Math.ceil(min); + const maxFloored = Math.floor(max); + return Math.floor(Math.random() * (maxFloored - minCeiled) + minCeiled); // The maximu + } + const getLetterValue = (key, letterOccurenceDict) => { + const lettersAndValues = { + //1 point + 'A' : 1, 'E' : 1, 'I' : 1, 'O' : 1 , 'U' : 1, 'L' : 1, 'N' : 1, 'R' : 1, 'S' : 1, 'T' : 1, + //2 points + 'D' : 2, 'G' : 2, + //3 points + 'B' : 3, 'C' : 3, 'M' : 3, 'P' : 3, + //4 points: + 'F' : 4, 'H' : 4, 'V' : 4, 'W' : 4, 'Y': 4, + //5 points: + 'K' : 5, + //6 points: + 'J' : 8, 'X' : 8, + //7 points: + 'Q' : 10, 'Z' : 10 + } + if (isNaN(lettersAndValues[key])){ + return letterOccurenceDict[key] + } + let letterValue = lettersAndValues[key]; + let letterOccurence = letterOccurenceDict[key]; + return letterValue * letterOccurence + }; \ No newline at end of file diff --git a/test/adagrams.test.js b/test/adagrams.test.js index 1a0dc94e..ca831e5c 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", () => { From 706e82922df3e9c290040bfe60b5d1ae592818c8 Mon Sep 17 00:00:00 2001 From: Madeline Bennett Date: Wed, 27 Nov 2024 00:29:40 -0800 Subject: [PATCH 4/4] ran and passed demo tests, ran play tests to make sure it passed all logic tests and was succesfull. --- test/demo/model.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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',