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

Tiger - Lily & Stacy #59

Open
wants to merge 6 commits into
base: master
Choose a base branch
from
Open

Tiger - Lily & Stacy #59

wants to merge 6 commits into from

Conversation

im-stacy
Copy link

Finished the project and passed all tests.

Copy link

@spitsfire spitsfire left a comment

Choose a reason for hiding this comment

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

Great job working together, Lily and Stacy! Your solution was very creative!

Here are a few things to consider for future projects that I've detailed below in your code:

  • When looking up values that have a relationship ("A" has a quantity of 9), it is likely more efficient to use a dictionary, rather than lists or lists inside a dictionary. That's because a list has a lookup time of O(n), whereas a dictionary always has a lookup time of O(1).

If you have any questions about the feedback, please reach out to me!

adagrams/game.py Outdated
def draw_letters():
pass
distribution_of_letters = {"A" : 9, "N" : 6, "B" : 2, "O" : 8, "C" : 2, "P" : 2, "D" : 4 ,"Q" : 1, "E" : 12, "R" : 6, "F" : 2, "S" : 4, "G" : 3, "T" : 6, "H" : 2, "U" : 4, "I" : 9, "V" : 2, "J" : 1 , "W" : 2, "K" : 1, "X" : 1, "L" : 4, "Y" : 2, "M" : 2, "Z" : 1}

Choose a reason for hiding this comment

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

Consider declaring this as a global "constant" (maybe POOL_OF_LETTERS) outside this function.

Doing so wouldn't really save on runtime (since we would then need to modify the counts and make a copy at the start of each call to this method), but it does declutter the method a bit by allowing us to move the large data structure to some innocuous corner of our file.

Comment on lines +7 to +10
userletters = random.choice(list(distribution_of_letters.items()))
if userletters[1] > 0:
letters.append(userletters[0])
distribution_of_letters[userletters[0]]-=1

Choose a reason for hiding this comment

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

Oh what an interesting way to handle checking the letter and the quantity!

if userletters[1] > 0:
letters.append(userletters[0])
distribution_of_letters[userletters[0]]-=1
return letters

def uses_available_letters(word, letter_bank):

Choose a reason for hiding this comment

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

👍

adagrams/game.py Outdated
Comment on lines 50 to 55
if len(word) != 0:
special_length = [7, 8, 9, 10]

# add additional 8 points for words with special length
if len(word) in special_length:
total_score += 8

Choose a reason for hiding this comment

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

Very creative! Consider refactoring this so we don't need a new data structure on line 51 and a for loop on line 54 (under the hood, if...in with a list is a loop).

We could combine the if statements together, like:

if len(word) > 6 and len(word) < 11:
    total_score += 8

adagrams/game.py Outdated
Comment on lines 58 to 61
for point, letters in score_chart.items():
for letter in word.upper():
if letter in letters:
total_score += point

Choose a reason for hiding this comment

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

this works just fine! One thing to consider: looking up an item in a list is generally O(n), but the lookup time for a dictionary is O(1).

If we kept our dictionary like: letter_dict = {"A": 1, "B": 2....}, then our look up will be constant, and that will get rid of one of the the three for loops in this code block.

for letter in word.upper():
    if letter in letter_dict:
        # increase your total_score here

now our code only has one for loop in it!

Comment on lines +74 to +75
best_word = (word, score)

Choose a reason for hiding this comment

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

This works! We could also do this on line 67 initially:

best_word = (word_list[0], score_word(word_list[0]))

adagrams/game.py Outdated
Comment on lines 67 to 71

# iterate through the word_list, and update best_word when current word is the best word
for word in word_list:
score = score_word(word)

Choose a reason for hiding this comment

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

It's great that you have comments here to tell other coders what's going on, or to remind you later what this code does.

But with so many comments cutting up the code, it actually makes it harder to read. So here's what we can do:

def get_highest_word_score(word_list):
    '''
    Function iterates through word_list, and updates best_word 
    when current word is the best word.
    The rest of your comments here
    '''
    best_word = None
    # the rest of your code here

We can bring all our comments up to the top inside docstrings

adagrams/game.py Outdated
Comment on lines 29 to 46
point_1_letters = ["A", "E", "I", "O", "U", "L", "N", "R", "S", "T"]
point_2_letters = ["D", "G"]
point_3_letters = ["B", "C", "M", "P"]
point_4_letters = ["F", "H", "V", "W", "Y"]
point_5_letters = ["K"]
point_8_letters = ["J", "X"]
point_10_letters = ["Q", "Z"]

# use map to store letter to score relationships
score_chart = {
1: point_1_letters,
2: point_2_letters,
3: point_3_letters,
4: point_4_letters,
5: point_5_letters,
8: point_8_letters,
10: point_10_letters
}

Choose a reason for hiding this comment

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

This takes a lot of lines. Let's combine this in one:

score_chart = {
    1: ["A", "E", "I", "O", "U", "L", "N", "R", "S", "T"]
    ...

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.

3 participants