diff --git a/src/adagrams.js b/src/adagrams.js index 7ec5afc7..b6252cf6 100644 --- a/src/adagrams.js +++ b/src/adagrams.js @@ -1,15 +1,151 @@ +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, +}; + +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, + +}; + export const drawLetters = () => { - // Implement this method for wave 1 + // initial drawLetters, cloneLetterPool, letters + const drawLetters = []; + let cloneLetterPool = {...letterPool}; + let letters = Object.keys(cloneLetterPool); + + // for loop 10 times + for (let i=0;i<10;++i){ + // get random letter in the pool + let randomLetter = letters[Math.floor(Math.random()*letters.length)]; + // check the value of letter in the pool + if (cloneLetterPool[randomLetter]>0){ + cloneLetterPool[randomLetter]--; + drawLetters.push(randomLetter); + }; + }; + return drawLetters; }; export const usesAvailableLetters = (input, lettersInHand) => { - // Implement this method for wave 2 -}; + // set new object + let lettersInHandFreq = {}; + // count letter frequency + for (let letter of lettersInHand) { + if (letter in lettersInHandFreq) { + lettersInHandFreq[letter] += 1; + }else{ + lettersInHandFreq[letter] = 1; + } + }; + // check input letter + for (let cha of input) { + if (cha in lettersInHandFreq) { + if (lettersInHandFreq[cha] >= 1) { + lettersInHandFreq[cha] -= 1; + } else{ + return false; + } + } else { + return false; + }; + } + return true; +} export const scoreWord = (word) => { - // Implement this method for wave 3 + // initial wordLength and score + let wordLength = word.length; + let score = 0; + // get the score for wordLength < 7 + if (wordLength < 7) { + for(let cha of word.toUpperCase()) { + let chaScore = scoreChart[cha]; + score += chaScore; + } + return score; + } else{ + // get the score for wordLength >= 7 + score = 8; + for(let cha of word.toUpperCase()) { + let chaScore = scoreChart[cha]; + score += chaScore; + } + return score; + } + }; export const highestScoreFrom = (words) => { - // Implement this method for wave 4 + // Initial hightestScore and winningWord + let highestScore = 0; + let winningWord = ""; + //iterate each word and get the score + words.forEach((word) => { + let score = scoreWord(word); + // if the score more than highestScore sign on the new data + if (score > highestScore){ + highestScore = score; + winningWord = word; + } else if (score === highestScore) { + //if the scores are same, choose the word, which is length is 10 + if (word.length === 10 && winningWord.length != 10) { + winningWord = word; + // //if the scores are same, choose the length is smaller. + } else if (word.length < winningWord.length && winningWord.length != 10){ + winningWord = word; + } + } + }); + const winner = {word: winningWord, score:highestScore}; + return winner; }; diff --git a/test/adagrams.test.js b/test/adagrams.test.js index 1a0dc94e..52ce0659 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", () => {