Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
129 changes: 129 additions & 0 deletions src/adagrams.js
Original file line number Diff line number Diff line change
@@ -1,15 +1,144 @@
export const drawLetters = () => {
// Implement this method for wave 1
let lp_copy = JSON.parse(JSON.stringify(LETTER_POOL));
let drawLetters = [];
const sum = sumOfValues(lp_copy);
while (drawLetters.length < 10) {
const index = Math.floor(Math.random() * (sum + 1));
const letter = whichLetter(index, lp_copy);
//const letter = Object.keys(lp_copy)[index];
if (lp_copy[letter] > 0) {
drawLetters.push(letter);
lp_copy[letter]--;
}
}
return drawLetters;
};

const whichLetter = (index, lp_copy) => {
for (let letter of Object.keys(lp_copy)) {
if (index === 0) {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would like to understand this code better. I've taken about 10 minutes to try to puzzle out the purpose of index and why it decrements. I'm guessing that you sat with this code for some time! Maybe this could be a good example of how judicious uses of comments can help clarify code :)

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I should have added more comments for sure.

index is the random value that is generated between 0 and 98 (98 is the sum of all the values in the letter_pool- it is calculated in a separate helper function.). So a letter with more values in the letter_pool has a higher probability of draw. This helps so we can get more vowels to make words with.

The whichLetter function, finds the letter associated with the index in the letter_pool. It keeps on decrementing the index by the value of the letters found in the letter_pool. We keep searching till index == 0, that's when the current letter is the one that's at the randomly picked index and we return it.

return letter;
} else {
index -= lp_copy[letter];
}
}
};

const sumOfValues = (lp_copy) => {
let sum = 0;
for (let val of Object.values(lp_copy)) {
sum += val;
}
return sum;
};

export const usesAvailableLetters = (input, lettersInHand) => {
// Implement this method for wave 2
for (let letter of input) {
if (lettersInHand.includes(letter)) {
const i = lettersInHand.indexOf(letter);
lettersInHand.splice(i, 1);
} else {
return false;
}
}
return true;
};

export const scoreWord = (word) => {
// Implement this method for wave 3
let score = 0;
for (let letter of word) {
score += LETTER_VALUES[letter.toUpperCase()];
}
if (word.length > 6 && word.length < 11) {
score += 8;
}
return score;
};

export const highestScoreFrom = (words) => {
// Implement this method for wave 4
let highest_score = 0;
let highest_score_word = words[0];
for (let word of words) {
let word_score = scoreWord(word);
if (word_score > highest_score) {
highest_score = word_score;
highest_score_word = word;
} else if (word_score === highest_score) {
// there is a tie
if (highest_score_word.length === 10) {
continue;
} else if (word.length === 10 && highest_score_word.length !== 10) {
highest_score = word_score;
highest_score_word = word;
} else if (word.length < highest_score_word.length) {
highest_score_word = word;
highest_score = word_score;
}
}
}
const highest_scores_lst = {
word: highest_score_word,
score: highest_score,
};
return highest_scores_lst;
};
const LETTER_VALUES = {
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: 2,
Q: 10,
R: 1,
S: 1,
T: 1,
U: 1,
V: 4,
W: 4,
X: 8,
Y: 4,
Z: 10,
};
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,
};
8 changes: 5 additions & 3 deletions test/adagrams.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -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", () => {
Expand All @@ -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") };
Expand All @@ -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", () => {
Expand Down