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

Phalesa Patton - Amethyst #147

Open
wants to merge 5 commits into
base: main
Choose a base branch
from
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
199 changes: 199 additions & 0 deletions src/adagrams.js
Original file line number Diff line number Diff line change
@@ -1,15 +1,214 @@
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 createLetterList = () => {
const letters = [];
const letterList = [];
for (const [key, value] of Object.entries(LETTERPOOL)) {
letters.push(key.repeat(value)) ;
}
for (const ele of letters) {
for (const letter of ele) {
letterList.push(letter);
}
}
Comment on lines +37 to +41

Choose a reason for hiding this comment

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

This line could be mitigated with using the Javascript spread syntax like so letters.push(...key.repeat(value))


return letterList;
};



const pool = createLetterList();

const createRandomizer = () => {
const randomIndex = Math.floor(Math.random() * (pool.length + 1));
const randomLetter = pool[randomIndex];
return randomLetter
};



export const drawLetters = () => {
// Implement this method for wave 1
// const pool = createLetterList(LETTERPOOL);
const drawnLetters = [];

while (drawnLetters.length < 10) {
const randomLetter = createRandomizer();
const occurences = drawnLetters.filter( letter => letter === randomLetter).length

Choose a reason for hiding this comment

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

Love how you used the filter method here, it is one of the most utilized Javascript methods, especially in React as you probably already seen.


if (occurences < LETTERPOOL[randomLetter]) {
drawnLetters.push(randomLetter);
}
}
return drawnLetters;

};



export const usesAvailableLetters = (input, lettersInHand) => {
// Implement this method for wave 2
const word = input.toUpperCase();
const wordArray = word.split('');
const handString = lettersInHand.toString();
const validLetters = []

for (const letter of word) {
if (lettersInHand.includes(letter)) {
const wordOccur = wordArray.filter( word => word === letter).length;
const handOccur = lettersInHand.filter( hand => hand === letter).length;
validLetters.push(letter)
if (wordOccur > handOccur) {
return false
}
}
else {
return false
}
if (validLetters.length === word.length) {
return true
}

}


};

export const scoreWord = (word) => {
// Implement this method for wave 3
const SCORECHART = {
'A':1,
'E':1,
'I':1,
'O':1,
'U':1,
'L':1,
'N':1,
'R':1,
'S':1,
'T':1,
'D':2,
'G':2,
'B':3,
'C':3,
'M':3,
'P':3,
'F':4,
'H':4,
'V':4,
'W':4,
'Y':4,
'K':5,
'J':8,
'X':8,
'Q':10,
'Z':10
};

Choose a reason for hiding this comment

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

Remember we want to keep those constant variables at the top of our files


let sumScore = 0;
const words = word.toUpperCase();



for (const letter of words) {
let value = SCORECHART[letter];
sumScore += value;
}
if (words.length >= 7 && words.length <= 10) {
sumScore += 8;
}


return sumScore;

Choose a reason for hiding this comment

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

};

export const highestScoreFrom = (words) => {
// Implement this method for wave 4
const wordListDict = {};
const maxWordList = [];
const wordLenTenList = [];
const highestWordList = [];
let resultDict = {}

// calculate the highest score of all the words

// calculate the score of each word in word_list
for (const word of words) {
wordListDict[word] = scoreWord(word);
}
// calculate highest score in scoreWord dictionary
let scores = Object.values(wordListDict);
let highestWordScore = Math.max(...scores);
Comment on lines +169 to +170

Choose a reason for hiding this comment

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

Love this! Especially the combination of spread syntax and the max method.


// append all words with the highest score to the highest word dictionary

for (const [key, value] of Object.entries(wordListDict)) {
if (wordListDict[key] === highestWordScore) {
highestWordList.push(key)
}
}
// if there is more than one word with the highest score
// and if one of any of those words are 10 letters use that word
if (highestWordList.length > 1) {
for (const word of highestWordList) {
if (word.length === 10) {
wordLenTenList.push(word);
resultDict['word'] = wordLenTenList[0];
resultDict['score'] = highestWordScore;
return resultDict
}
else {
const lens = highestWordList.map(words => words.length)
console.log(lens)
const shortestWord = Math.min(...lens)
for (const item of highestWordList) {
if (item.length === shortestWord) {
resultDict['word'] = item;
resultDict['score'] = highestWordScore;
}
}
}
}
}
else {
resultDict['word'] = highestWordList[0];
resultDict['score'] = highestWordScore;
}
Comment on lines +181 to +205

Choose a reason for hiding this comment

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

I love the logic here, however the nesting can have a negative impact of the readibility of your code. I would consider looking at if some of the functionality of nested code blocks could be combined.

// if no 10 letter words use the shortest word
// console.log(wordListDict);
// console.log(`score ${highestWordScore}`);
// console.log(wordLenTenList);
console.log(resultDict);
return resultDict;

Choose a reason for hiding this comment

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

Nice job, Pha'lesa! 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!


};
6 changes: 3 additions & 3 deletions test/adagrams.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ 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 +133,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 +145,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
Loading