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

finally done with adagrams js #86

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open

Conversation

izzybusy5
Copy link

No description provided.

Copy link

@apradoada apradoada left a comment

Choose a reason for hiding this comment

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

GREEN! Overall this looks really good with just a few suggestions here or there! I made some refactoring suggestions that you do not have to implement unless you want to!

@@ -1,15 +1,140 @@
const LETTER_POOL = {

Choose a reason for hiding this comment

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

Great use of upper snake case for your constants!

return keys[Math.floor(Math.random() * keys.length)];
}

let drawnLetters = [];

Choose a reason for hiding this comment

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

Because drawnLetters is only used in the drawLetters function, I would make the variable local to the drawLetters function. Also, we add values to it, but we never reassign the reference to drawnLetters, so const may be the better choice here! Always prefer const over let. If you accidentally try to reassign a variable that was declared with const, then the JS interpreter will let you know and you can change it to let.

};


function getRandomProperty() {

Choose a reason for hiding this comment

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

I love this helper function!

}
}

return drawnLetters;

Choose a reason for hiding this comment

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

This function looks good but I have two suggestions:

  1. I would make a copy of LETTER_POOL because as it stands, you are destroying LETTER_POOL as you remove letters.
  2. You don't ever account for the different numbers of letters, so the randomness accounts for the 26 different keys, but it weights them each equally. To get around this, we would want to create some sort of structure that holds all the different letters and randomly picks one from there!

export const usesAvailableLetters = (input, lettersInHand) => {
// Implement this method for wave 2
};
let bankCopy = 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.

This is a good way to copy a list. One thing to think about however is that the list we are copying simply contains letters, not objects, so a shallow copy using the spread operator will work fine here!

 bankCopy = [...lettersInHand];

if (!bankCopy.includes(letter.toUpperCase())){
return false
} else if (bankCopy.includes(letter.toUpperCase())) {
bankCopy = bankCopy.filter(value => value !== letter)

Choose a reason for hiding this comment

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

The Javascript filter function runs in linear time. I wonder if there is a way to utilize objects to make this removal happen in constant time?

// Implement this method for wave 3
};
let score = 0;
let lengthOfWord = word.length;

Choose a reason for hiding this comment

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

lengthOfWord never changes, so you could absolutely make this a const!

};
let score = 0;
let lengthOfWord = word.length;
const letterValueDict = {

Choose a reason for hiding this comment

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

Great creation of a local const!

return 0;
}

if(lengthOfWord >= 7){

Choose a reason for hiding this comment

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

Best practice is to place a space after the if keyword to avoid looking like a function call!

}
}

return { word: listOfMaxKeys[0], score: wordDict[listOfMaxKeys[0]] };
};

Choose a reason for hiding this comment

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

I understand the concept behind what you are trying to do here! Using objects to separate out each step makes sense, but it starts to get tedious and more complex when we do that. Since we are returning an object with word and score as keys, why not create the one object that has the first word and the first word score as values? From there, we can run through the rest of the wordList and make the comparisons we need in place! This will drastically decrease the complexity and code you need to use! An example is below:

 export const highestScoreFrom = (words) => {
   let winningWord = {
     word: null,
     score: null
   }

   for (let word of words){

     let thisWord = {
       word: word,
       score: scoreWord(word)
     }

     if (thisWord.score > winningWord.score){
       winningWord = thisWord
     } else if (thisWord.score === winningWord.score){
       const isBestTen = winningWord.word.length === 10;
       const isWordTen = thisWord.word.length === 10;
       const isWordShorter = thisWord.word.length < winningWord.word.length;

       if ((isWordTen && !isBestTen) || (isWordShorter && !isBestTen)){
         winningWord = thisWord;
       }
     }
   }
   return winningWord;
 }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants