Skip to content
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

Amethyst Megan G. #146

Open
wants to merge 11 commits into
base: main
Choose a base branch
from
Open
138 changes: 138 additions & 0 deletions src/adagrams.js
Original file line number Diff line number Diff line change
@@ -1,15 +1,153 @@
// import { random } from "core-js/core/number";

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,
};

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: 3,
Q: 10,
R: 1,
S: 1,
T: 1,
U: 1,
V: 4,
W: 4,
X: 8,
Y: 4,
Z: 10,
};

// create array of all letters
const createLetterList = letters => {
const letterList = [];
for (const letter in letters) {
for(let i = 0; i < letters[letter]; i++) {
letterList.push(letter);
}
}
return letterList;
}

// generates random letter
const generateRandomLetter = () => {
const letters = createLetterList(LETTER_POOL);
const randomLetter = letters[Math.floor(Math.random() * letters.length)];
return randomLetter;
}

// draw 10 letters into hand
// ensure each drawn letter is drawn no more than the total amount of that letter
export const drawLetters = () => {
// Implement this method for wave 1
const lettersDrawnForHand = [];

while (lettersDrawnForHand.length < 10) {
let randomLetter = generateRandomLetter();

Choose a reason for hiding this comment

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

So, when you defined generateRandomLetter, you make a call of createLetteList in it to create your list of letters from your LETTER_POOL. With this being said, every iteration of your while loop will make a new list of letters even though we don't really need a new list (it will look the same every time). I would suggest pulling it out of this function and calling createLetterList somewhere above the while loop in this function.

const numberOfOccurences = lettersDrawnForHand.filter(element => element === randomLetter).length
if ( numberOfOccurences < LETTER_POOL[randomLetter]){
lettersDrawnForHand.push(randomLetter);
}
}
return lettersDrawnForHand;
};

// handles input that doesn't contain letters in hand
// handles the correct quantity of letters in hand
export const usesAvailableLetters = (input, lettersInHand) => {
// Implement this method for wave 2
const letterHandCopy = JSON.parse(JSON.stringify(lettersInHand));

Choose a reason for hiding this comment

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

You are most likely aware of this now, but just in case you can make a copy array with the spread syntax like so [...lettersInHand].


for(let i = 0; i < input.length; i++) {
let letterIndex = letterHandCopy.indexOf(input[i]);
if (letterIndex === -1) {
return false;
}
letterHandCopy[letterIndex] = '';
}
return true;
};

// scores each letter in the user submitted word
// if word is 7 or more letters, word gets 8 bonus points
export const scoreWord = (word) => {
// Implement this method for wave 3
const playerWord = word.toUpperCase()
let score = 0;

for(const letter of playerWord) {
score += LETTER_VALUES[letter];
}
if (playerWord.length > 6) {
score += 8;
}

return score;

Choose a reason for hiding this comment

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

⭐️

};

// finds the highest scoring word from all words submitted
// in case of tie, will break tie based on shortest length unless word is 10 letters exactly
export const highestScoreFrom = (words) => {
// Implement this method for wave 4

let highestScore = 0;
let highestScoringWord = '';
Comment on lines +133 to +134

Choose a reason for hiding this comment

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

If we know we want to return these variables in object form, could just initialize said object here?


for(const word of words){
let score = scoreWord(word);

if (score > highestScore) {
highestScore = score;
highestScoringWord = word;
}
else if (score === highestScore) {
if(highestScoringWord.length != 10 && (word.length === 10 || word.length < highestScoringWord.length)) {

Choose a reason for hiding this comment

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

Love the compound if statement very easy to follow!

highestScoringWord = word
}
}
}
return {
'score': highestScore,
'word': highestScoringWord
}

Choose a reason for hiding this comment

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

Nice job, Megs! As you probably noticed, I didn't give too much feedback due to the scope of the project (Translating your python code to Javascript code). I tried to just point out any glaring issues, if any. With that being said, if you want to discuss anything in greater detail, feel free to reach out to me!

};
11 changes: 8 additions & 3 deletions test/adagrams.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ const LETTER_POOL = {
X: 1,
Y: 2,
Z: 1,
'': 0
};

describe("Adagrams", () => {
Expand Down Expand Up @@ -120,7 +121,10 @@ describe("Adagrams", () => {
});

it("returns a score of 0 if given an empty input", () => {
throw "Complete test";
// throw "Complete test";
expectScores({
'':0
})
});

it("adds an extra 8 points if word is 7 or more characters long", () => {
Expand All @@ -133,7 +137,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 +149,8 @@ describe("Adagrams", () => {
const words = ["XXX", "XXXX", "X", "XX"];
const correct = { word: "XXXX", score: scoreWord("XXXX") };

throw "Complete test by adding an assertion";
// throw "Complete test by adding an assertion";
expect(highestScoreFrom(words)).toEqual(correct)
});

describe("in case of tied score", () => {
Expand Down