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
111 changes: 107 additions & 4 deletions src/adagrams.js
Original file line number Diff line number Diff line change
@@ -1,15 +1,118 @@
const LETTER_POOL = {
'A': 9,
'B': 2,
'C': 2,
'D': 4,
'E': 12,
'F': 2,
Comment on lines +1 to +7

Choose a reason for hiding this comment

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

Hi Angela! Great job completing JS Adagrams! Congrats on finishing your first JavaScript project 🎉 Excellent choice with this data structure

'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
let letterPoolArr = [];
for (const [key, value] of Object.entries(LETTER_POOL)) {
let letter = Array(value).fill(key);
letterPoolArr.push(...letter);
}

let letterBank = [];
while (letterBank.length < 10) {
let index = Math.floor(Math.random() * letterPoolArr.length);
let letter = letterPoolArr[index];
letterBank.push(letter);
letterPoolArr.splice(index, 1);
Comment on lines +31 to +42

Choose a reason for hiding this comment

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

Great job with this building a hand logic and the use of the spread operator (...) 🎉

}
return letterBank;
};

export const usesAvailableLetters = (input, lettersInHand) => {
// Implement this method for wave 2
let lettersCopy = [...lettersInHand];
input = input.toUpperCase();

for (let letter of input) {
if (lettersCopy.includes(letter)) {
lettersCopy.splice(lettersCopy.indexOf(letter), 1);
} else {
return false;
}
}
return true;
};

export const scoreWord = (word) => {
// Implement this method for wave 3

const SCORE_CHART = {
"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
};
Comment on lines +63 to +71

Choose a reason for hiding this comment

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

Excellent choice with this data structure, I just want to mention that in JavaScript our keys don't need to be strings. Because of the popularity of JSON, it is frequent to see the keys of object literals as quoted strings. The quotes are required in order to be valid JSON, but they are not required in order to be valid JavaScript. Keys in object literals can be expressed in any of the following three ways:

const letterValue = {  
  A: 9,      // No quotes at all  
  'A': 9,    // Single-quoted string 
  "A": 9  // Double-quoted string
};


let sum = 0;
word = word.toUpperCase();
const higherPointValues = [7, 8, 9, 10];

Choose a reason for hiding this comment

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

👍🏾


for (let letter of word) {
let pointValue = SCORE_CHART[letter];
sum += pointValue;
}

if (higherPointValues.includes(word.length)) {
sum += 8;
}
return sum;
};

export const highestScoreFrom = (words) => {
// Implement this method for wave 4
let scoreDict = {};
let highestScoreWord = [];
Comment on lines +89 to +90

Choose a reason for hiding this comment

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

Great work creating this hash map!


for (let word of words) {
scoreDict[word] = scoreWord(word);
}

let maxScore = Math.max(...Object.values(scoreDict));

for (let [word, pointValue] of Object.entries(scoreDict)) {
if (pointValue === maxScore) {
highestScoreWord.push(word);
}
}
Comment on lines +98 to +102

Choose a reason for hiding this comment

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

Great work getting comfortable with JavaScript's syntax. It looks like you're getting use to looping over data and adding conditional logic ✅


if (highestScoreWord.length > 1) {
for (let word of highestScoreWord) {
for (let i = 0; i < highestScoreWord.length; i++) {
if (highestScoreWord[i].length === 10) {
return { score: scoreWord(highestScoreWord[i]), word: highestScoreWord[i] };
}
}

let bestestWord = highestScoreWord.reduce((a, b) => a.length <= b.length ? a : b);

Choose a reason for hiding this comment

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

I would consider changing the name of this variable to something more descriptive

return { score: scoreWord(bestestWord), word: bestestWord };
}
} else {
return { score: scoreWord(highestScoreWord[0]), word: highestScoreWord[0] };
}
};
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