-
Notifications
You must be signed in to change notification settings - Fork 20
Ocelots - Kelly T #13
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
e022c4d
0e70abb
fe828b3
79bb3b0
bb314c5
124387c
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,15 +1,190 @@ | ||
| 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, | ||
| '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 | ||
| } | ||
|
|
||
| // 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); | ||
| } | ||
|
Comment on lines
+46
to
+48
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Really neat implementation 😄 |
||
|
|
||
| shuffle(letterPool); | ||
| const letterPoolSelection = letterPool.slice(0, 10); | ||
| return letterPoolSelection; | ||
| }; | ||
|
|
||
| export const usesAvailableLetters = (input, lettersInHand) => { | ||
|
|
||
| // Implement this method for wave 2 | ||
|
|
||
| let word = input.toUpperCase(); | ||
|
|
||
| // Create object of letter frequency for lettersInHand | ||
| const letterBankCount = {} | ||
|
|
||
| for (const letter of lettersInHand) { | ||
| if (letter in letterBankCount) { | ||
| letterBankCount[letter] += 1; | ||
| } else { | ||
| letterBankCount[letter] = 1; | ||
| } | ||
| } | ||
|
|
||
| // Create object of letter frequency for word | ||
| const wordCount = {} | ||
|
|
||
| for (const letter of word) { | ||
| if (letter in wordCount) { | ||
| wordCount[letter] += 1; | ||
| } else { | ||
| wordCount[letter] = 1; | ||
| } | ||
| } | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Great use of frequency maps. |
||
|
|
||
| // Check that word letter frequency complies with lettersInHand | ||
| for (const key in wordCount) { | ||
| if (!(key in letterBankCount)) { | ||
| return false; | ||
| } | ||
| if (wordCount[key] > letterBankCount[key]) { | ||
| return false; | ||
| } | ||
|
Comment on lines
+85
to
+90
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If the line doesn't get too long, I suggest combining these into one if-statement so we can have one false return. |
||
| } | ||
| return true; | ||
| }; | ||
|
|
||
| export const scoreWord = (word) => { | ||
|
|
||
| // Implement this method for wave 3 | ||
| if (word === '') { | ||
| return 0; | ||
| } | ||
|
|
||
| word = word.toUpperCase(); | ||
|
|
||
| let points = 0; | ||
|
Comment on lines
+102
to
+104
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I would consider moving these lines to below |
||
|
|
||
| // Create object to hold scoreChart | ||
| 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 | ||
| } | ||
|
|
||
| // Calculate score for each word | ||
| for (const letter of word) { | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Nice use of a for...of loop. |
||
| points += scoreChart[letter]; | ||
| } | ||
|
Comment on lines
+137
to
+139
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This could have an unexpected result if the string |
||
|
|
||
| if (word.length >= 7 && word.length <= 10) { | ||
| points += 8; | ||
| } | ||
|
|
||
| return points; | ||
|
|
||
| }; | ||
|
|
||
| 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)) { | ||
| scores[word] = scoreWord(word) | ||
| } | ||
| } | ||
|
|
||
| let highestScore = 0; | ||
| let winner; | ||
|
|
||
| // Determine highestScore and winner | ||
| for (const wordEntry in scores) { | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Nice implementation to tie break in a single loop! |
||
|
|
||
| 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; | ||
| } | ||
| } | ||
| } | ||
|
|
||
| // Create winner object | ||
| const winningObject = { | ||
| "word": winner, | ||
| "score": scores[winner], | ||
| } | ||
|
|
||
| return winningObject; | ||
|
|
||
| }; | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Really nice solution for ensuring we get the desired distribution of letters.
I would consider moving the creation of the
letterPoolvariable to directly above this loop to keep it right next to where it gets used.