From 01dbe421854afc74ed68bf40f0e343de4b820f09 Mon Sep 17 00:00:00 2001 From: viviantomato Date: Tue, 27 Sep 2022 09:45:34 -0700 Subject: [PATCH 01/10] add function for Wave 1 --- adagrams/game.py | 56 +++++++++++++++++++++++++++++++++++++++++-- tests/test_wave_01.py | 1 + tests/test_wave_02.py | 3 ++- tests/test_wave_03.py | 4 +++- tests/test_wave_04.py | 4 +++- 5 files changed, 63 insertions(+), 5 deletions(-) diff --git a/adagrams/game.py b/adagrams/game.py index 5fb37b11..98f240d2 100644 --- a/adagrams/game.py +++ b/adagrams/game.py @@ -1,5 +1,57 @@ -def draw_letters(): - pass +import random +from lib2to3.pgen2.pgen import DFAState + +# initiate the empty list +# to keep the original pool - make a copy of dictionary +# get letter from the copy dict/pool random.ran() +# draw one letter a time, x 10, for loop (0, 10), +# also update the qty. of the letter in each loop +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 +} + +def copy_letter_from_original(pool): + pool_dict_copy = {} + for key, value in pool.items(): + pool_dict_copy[key] = value + return pool_dict_copy + +def draw_letters(): + res_letters = [] + letter_bank_dict = copy_letter_from_original(LETTER_POOL) + while len(res_letters) < 10: + letter = random.choice(list(letter_bank_dict.keys())) + if letter_bank_dict[letter] > 0: + res_letters.append(letter) + letter_bank_dict[letter] -= 1 + #print(res_letters) + return res_letters + def uses_available_letters(word, letter_bank): pass diff --git a/tests/test_wave_01.py b/tests/test_wave_01.py index 25ef73e7..cfbe002f 100644 --- a/tests/test_wave_01.py +++ b/tests/test_wave_01.py @@ -65,3 +65,4 @@ def test_letter_not_selected_too_many_times(): # Assert for letter in letters: assert letter_freq[letter] <= LETTER_POOL[letter] + diff --git a/tests/test_wave_02.py b/tests/test_wave_02.py index a5170d8a..43712b1f 100644 --- a/tests/test_wave_02.py +++ b/tests/test_wave_02.py @@ -56,4 +56,5 @@ def test_uses_available_letters_ignores_case(): assert uses_available_letters("bEd", letters) assert uses_available_letters("fad", letters) assert uses_available_letters("a", letters) - assert not uses_available_letters("aA", letters) \ No newline at end of file + assert not uses_available_letters("aA", letters) + diff --git a/tests/test_wave_03.py b/tests/test_wave_03.py index 5473db39..a27108c7 100644 --- a/tests/test_wave_03.py +++ b/tests/test_wave_03.py @@ -2,6 +2,7 @@ from adagrams.game import score_word + def test_score_word_accurate(): # Assert assert score_word("A") == 1 @@ -23,4 +24,5 @@ def test_score_extra_points_for_seven_or_longer(): assert score_word("XXXXXXX") == 64 assert score_word("XXXXXXXX") == 72 assert score_word("XXXXXXXXX") == 80 - \ No newline at end of file + + diff --git a/tests/test_wave_04.py b/tests/test_wave_04.py index 8fdedf66..aa354742 100644 --- a/tests/test_wave_04.py +++ b/tests/test_wave_04.py @@ -2,6 +2,7 @@ from adagrams.game import score_word, get_highest_word_score + def test_get_highest_word_score_accurate(): # Arrange words = ["X", "XX", "XXX", "XXXX"] @@ -84,4 +85,5 @@ def test_get_highest_word_tie_same_length_prefers_first(): assert score_word(words[0]) == 18 assert score_word(words[1]) == 18 assert best_word[0] == words[0] - assert best_word[1] == 18 \ No newline at end of file + assert best_word[1] == 18 + From f7024462ad98018a0b1cf9d0cdb27979254a0646 Mon Sep 17 00:00:00 2001 From: Viktoriia Zolotova Date: Tue, 27 Sep 2022 09:49:44 -0700 Subject: [PATCH 02/10] add function for wave 1 --- adagrams/game.py | 56 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/adagrams/game.py b/adagrams/game.py index 5fb37b11..c47e18d8 100644 --- a/adagrams/game.py +++ b/adagrams/game.py @@ -1,5 +1,59 @@ +import random +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 +} + +# to keep the original pool - make a copy of dictionary +# initiate the empty list +# get letter from the copy dict/pool random.ran() +# draw one letter a time, x 10, for loop (0, 10), +# also update the qty. of the letter in each loop + +def copy_letter_bank_dict(pool_dict): + pool_dict_copy = {} + for key, value in pool_dict.items(): + pool_dict_copy[key] = value + return pool_dict_copy +# print(copy_letter_bank_dict(LETTER_POOL)) +print(f"pool before function {LETTER_POOL}") + def draw_letters(): - pass + + letters = [] + letter_bank_dict = copy_letter_bank_dict(LETTER_POOL) + for i in range(10): #to do while loop instead since the quantity can be 0 + letter = random.choice(list(letter_bank_dict.keys())) + # check if there is quantity, append, else > continue + letters.append(letter) + # reduce quantity by one from letetr bank + print(letters) + return letters +print(f"pool after function {LETTER_POOL}") def uses_available_letters(word, letter_bank): pass From bae9b38f182af2193c191d8bd24ae0be9d04a61e Mon Sep 17 00:00:00 2001 From: Viktoriia Zolotova Date: Tue, 27 Sep 2022 09:55:06 -0700 Subject: [PATCH 03/10] Resolve merge --- adagrams/game.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/adagrams/game.py b/adagrams/game.py index d3f8b16a..98f240d2 100644 --- a/adagrams/game.py +++ b/adagrams/game.py @@ -1,6 +1,4 @@ import random -<<<<<<< HEAD -======= from lib2to3.pgen2.pgen import DFAState # initiate the empty list @@ -8,7 +6,6 @@ # get letter from the copy dict/pool random.ran() # draw one letter a time, x 10, for loop (0, 10), # also update the qty. of the letter in each loop ->>>>>>> 01dbe421854afc74ed68bf40f0e343de4b820f09 LETTER_POOL = { 'A': 9, 'B': 2, From af39b120d52e02bf6d588f48522abe547d2a1912 Mon Sep 17 00:00:00 2001 From: Viktoriia Zolotova Date: Tue, 27 Sep 2022 14:36:17 -0700 Subject: [PATCH 04/10] Add functions for wave 2 --- adagrams/game.py | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/adagrams/game.py b/adagrams/game.py index 98f240d2..cf72d2b4 100644 --- a/adagrams/game.py +++ b/adagrams/game.py @@ -49,12 +49,39 @@ def draw_letters(): if letter_bank_dict[letter] > 0: res_letters.append(letter) letter_bank_dict[letter] -= 1 - #print(res_letters) + print(res_letters) return res_letters +def create_dict(data): + # initiatite word_dict + data_dict = {} + for element in data: + if element not in data_dict: + data_dict[element] = 1 + else: + data_dict[element] += 1 + return data_dict def uses_available_letters(word, letter_bank): - pass + # convert word to capital + # for each key, value in word dict.items() + # check if key of word_dict <= key of letetr_bank dict + # return True + # else: return False + word = word.upper() + word_dict = create_dict(word) + letter_bank_dict = create_dict(letter_bank) + + for letter, quantity in word_dict.items(): + if letter not in letter_bank_dict: + return False + else: + if quantity > letter_bank_dict[letter]: + return False + return True + + + def score_word(word): pass From 67c38ef15ea6c542158bbd5ba3afe712e72b6255 Mon Sep 17 00:00:00 2001 From: viviantomato Date: Wed, 28 Sep 2022 13:59:07 -0700 Subject: [PATCH 05/10] wave 3 passed --- adagrams/game.py | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/adagrams/game.py b/adagrams/game.py index cf72d2b4..088863bf 100644 --- a/adagrams/game.py +++ b/adagrams/game.py @@ -49,7 +49,7 @@ def draw_letters(): if letter_bank_dict[letter] > 0: res_letters.append(letter) letter_bank_dict[letter] -= 1 - print(res_letters) + #print(res_letters) return res_letters def create_dict(data): @@ -80,11 +80,35 @@ def uses_available_letters(word, letter_bank): return False return True - +#def update_dict(key, value, score_dict): +# return score_dict.update(dict.fromkeys([key], value)) + +def score_word(word): +# word as string +# variable stores the final score +# if len(word) >= 7 and <= 10, add 8 points +# loop thru each element of in word +# add points based on the value of the key + + total_score = 0 + word = word.upper() + if len(word) >= 7 and len(word) <= 10: + total_score += 8 + + score_dict = dict.fromkeys(['A', 'E', 'I', 'O', 'U', 'L', 'N', 'R', 'S', 'T'], 1) + score_dict.update(dict.fromkeys (['D', 'G'], 2)) + score_dict.update(dict.fromkeys(['B', 'C', 'M', 'P'], 3)) + score_dict.update(dict.fromkeys (['F', 'H', 'V', 'W', 'Y'], 4)) + score_dict.update(dict.fromkeys (['K'], 5)) + score_dict.update(dict.fromkeys (['J', 'X'], 8)) + score_dict.update(dict.fromkeys (['Q','Z'], 10)) + + for letter in word: + if letter in score_dict.keys(): + total_score += score_dict[letter] + return total_score -def score_word(word): - pass def get_highest_word_score(word_list): pass \ No newline at end of file From 64b7eefdc6d0fecf587dfcae9d78e93db4f09cf8 Mon Sep 17 00:00:00 2001 From: viviantomato Date: Wed, 28 Sep 2022 14:40:16 -0700 Subject: [PATCH 06/10] Wave 3 updated --- adagrams/game.py | 48 ++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 38 insertions(+), 10 deletions(-) diff --git a/adagrams/game.py b/adagrams/game.py index 088863bf..225cd803 100644 --- a/adagrams/game.py +++ b/adagrams/game.py @@ -35,6 +35,35 @@ 'Z': 1 } +SCORE_POOL = { + '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 +} + def copy_letter_from_original(pool): pool_dict_copy = {} for key, value in pool.items(): @@ -78,11 +107,7 @@ def uses_available_letters(word, letter_bank): else: if quantity > letter_bank_dict[letter]: return False - return True - -#def update_dict(key, value, score_dict): -# return score_dict.update(dict.fromkeys([key], value)) - + return True def score_word(word): # word as string @@ -95,7 +120,8 @@ def score_word(word): word = word.upper() if len(word) >= 7 and len(word) <= 10: total_score += 8 - + ''' + # time complexity :O(n) score_dict = dict.fromkeys(['A', 'E', 'I', 'O', 'U', 'L', 'N', 'R', 'S', 'T'], 1) score_dict.update(dict.fromkeys (['D', 'G'], 2)) score_dict.update(dict.fromkeys(['B', 'C', 'M', 'P'], 3)) @@ -103,12 +129,14 @@ def score_word(word): score_dict.update(dict.fromkeys (['K'], 5)) score_dict.update(dict.fromkeys (['J', 'X'], 8)) score_dict.update(dict.fromkeys (['Q','Z'], 10)) - + ''' + for letter in word: - if letter in score_dict.keys(): - total_score += score_dict[letter] + if letter in SCORE_POOL.keys(): + total_score += SCORE_POOL[letter] return total_score def get_highest_word_score(word_list): - pass \ No newline at end of file + # return tuple (word, total_score) + \ No newline at end of file From 721a7e90281fb61f212c1584a6bb2a8564fcf7da Mon Sep 17 00:00:00 2001 From: viviantomato Date: Wed, 28 Sep 2022 15:57:20 -0700 Subject: [PATCH 07/10] Wave 4 pass 2 tests --- adagrams/game.py | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/adagrams/game.py b/adagrams/game.py index 225cd803..62ae93d7 100644 --- a/adagrams/game.py +++ b/adagrams/game.py @@ -1,5 +1,7 @@ +from operator import length_hint import random from lib2to3.pgen2.pgen import DFAState +from urllib.parse import MAX_CACHE_SIZE # initiate the empty list # to keep the original pool - make a copy of dictionary @@ -138,5 +140,29 @@ def score_word(word): def get_highest_word_score(word_list): - # return tuple (word, total_score) - \ No newline at end of file + # return tuple (word, max_score) + + max_score = 0 + final_word_dict = {} + for word in word_list: + word_score = score_word(word) + if word_score > max_score: + max_score = word_score + for word in word_list: + if score_word(word) == max_score: + final_word_dict[word] = len(word) + print(final_word_dict) + + + if len(final_word_dict) == 1: + return final_word_dict[word], max_score + else: + if 10 in final_word_dict.values(): + name = [k for k, v in final_word_dict.items() if v == 10] + return (name, max_score) + elif 10 not in final_word_dict.values(): + name = min(final_word_dict, key=final_word_dict.get) + return (name, max_score) + #else: #there two same length + + #return the first one \ No newline at end of file From 075c1c0c7125f69e386fc6ab0c97f80cc83da557 Mon Sep 17 00:00:00 2001 From: viviantomato Date: Thu, 29 Sep 2022 13:53:12 -0700 Subject: [PATCH 08/10] Wave 4 passed --- adagrams/game.py | 47 ++++++++++++++++++++--------------------------- 1 file changed, 20 insertions(+), 27 deletions(-) diff --git a/adagrams/game.py b/adagrams/game.py index 62ae93d7..8dadd283 100644 --- a/adagrams/game.py +++ b/adagrams/game.py @@ -1,4 +1,5 @@ from operator import length_hint +from platform import win32_edition import random from lib2to3.pgen2.pgen import DFAState from urllib.parse import MAX_CACHE_SIZE @@ -122,47 +123,39 @@ def score_word(word): word = word.upper() if len(word) >= 7 and len(word) <= 10: total_score += 8 - ''' - # time complexity :O(n) - score_dict = dict.fromkeys(['A', 'E', 'I', 'O', 'U', 'L', 'N', 'R', 'S', 'T'], 1) - score_dict.update(dict.fromkeys (['D', 'G'], 2)) - score_dict.update(dict.fromkeys(['B', 'C', 'M', 'P'], 3)) - score_dict.update(dict.fromkeys (['F', 'H', 'V', 'W', 'Y'], 4)) - score_dict.update(dict.fromkeys (['K'], 5)) - score_dict.update(dict.fromkeys (['J', 'X'], 8)) - score_dict.update(dict.fromkeys (['Q','Z'], 10)) - ''' - for letter in word: if letter in SCORE_POOL.keys(): total_score += SCORE_POOL[letter] return total_score - def get_highest_word_score(word_list): - # return tuple (word, max_score) - + # return tuple (word, max_score) max_score = 0 + max_name = "" final_word_dict = {} for word in word_list: word_score = score_word(word) if word_score > max_score: max_score = word_score + max_name = word for word in word_list: if score_word(word) == max_score: final_word_dict[word] = len(word) - print(final_word_dict) - - if len(final_word_dict) == 1: - return final_word_dict[word], max_score + return max_name, max_score + + #if len = 10, this word win + for word, length in final_word_dict.items(): + while length == 10: + return (word, max_score) + #len != 10, word with fewest len win + #same length -> choose the first occurence else: - if 10 in final_word_dict.values(): - name = [k for k, v in final_word_dict.items() if v == 10] - return (name, max_score) - elif 10 not in final_word_dict.values(): - name = min(final_word_dict, key=final_word_dict.get) - return (name, max_score) - #else: #there two same length - - #return the first one \ No newline at end of file + mini_length = 10 + for word, length in final_word_dict.items(): + if length < mini_length: + mini_length = length + key_list = list(final_word_dict.keys()) + val_list = list(final_word_dict.values()) + best_name = key_list[val_list.index(mini_length)] + return (best_name, max_score) \ No newline at end of file From a90a21a0136e5cbcb513f9606cbc99c665acaca7 Mon Sep 17 00:00:00 2001 From: Viktoriia Zolotova Date: Thu, 29 Sep 2022 13:56:16 -0700 Subject: [PATCH 09/10] Add code for wave 4 --- adagrams/game.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/adagrams/game.py b/adagrams/game.py index 62ae93d7..7bff4971 100644 --- a/adagrams/game.py +++ b/adagrams/game.py @@ -1,7 +1,5 @@ -from operator import length_hint import random from lib2to3.pgen2.pgen import DFAState -from urllib.parse import MAX_CACHE_SIZE # initiate the empty list # to keep the original pool - make a copy of dictionary @@ -140,7 +138,7 @@ def score_word(word): def get_highest_word_score(word_list): - # return tuple (word, max_score) + # return tuple (word, total_score) leave this line max_score = 0 final_word_dict = {} From 4a9a5ac56ea240195dc3101b1e58c9cf3e76a904 Mon Sep 17 00:00:00 2001 From: Viktoriia Zolotova Date: Thu, 29 Sep 2022 15:14:24 -0700 Subject: [PATCH 10/10] Add docstrings --- adagrams/game.py | 76 +++++++++++++++++++++++++++--------------------- 1 file changed, 43 insertions(+), 33 deletions(-) diff --git a/adagrams/game.py b/adagrams/game.py index 868c7791..f03229ec 100644 --- a/adagrams/game.py +++ b/adagrams/game.py @@ -66,25 +66,33 @@ 'Z': 10 } -def copy_letter_from_original(pool): +def copy_dictionary(pool): + """ + Returns a copy of a dictionary. + """ pool_dict_copy = {} for key, value in pool.items(): pool_dict_copy[key] = value return pool_dict_copy -def draw_letters(): +def draw_letters(): + """ + Returns an array of ten random strings from letter pool. + """ res_letters = [] - letter_bank_dict = copy_letter_from_original(LETTER_POOL) + letter_bank_dict = copy_dictionary(LETTER_POOL) while len(res_letters) < 10: letter = random.choice(list(letter_bank_dict.keys())) if letter_bank_dict[letter] > 0: res_letters.append(letter) letter_bank_dict[letter] -= 1 - #print(res_letters) return res_letters def create_dict(data): - # initiatite word_dict + """ + Returns dictionary with key "element" and + with value equal to the frequency of the element. + """ data_dict = {} for element in data: if element not in data_dict: @@ -94,11 +102,10 @@ def create_dict(data): return data_dict def uses_available_letters(word, letter_bank): - # convert word to capital - # for each key, value in word dict.items() - # check if key of word_dict <= key of letetr_bank dict - # return True - # else: return False + """ + Returns True if every letter from word + belongs to the letter bank, otherwise False. + """ word = word.upper() word_dict = create_dict(word) letter_bank_dict = create_dict(letter_bank) @@ -111,13 +118,10 @@ def uses_available_letters(word, letter_bank): return False return True -def score_word(word): -# word as string -# variable stores the final score -# if len(word) >= 7 and <= 10, add 8 points -# loop thru each element of in word -# add points based on the value of the key - +def score_word(word): + """ + Returns the score of the given word. + """ total_score = 0 word = word.upper() if len(word) >= 7 and len(word) <= 10: @@ -128,33 +132,39 @@ def score_word(word): return total_score def get_highest_word_score(word_list): - # return tuple (word, max_score) + """ + Returns a tuple of a winning word and it's score. + """ max_score = 0 - max_name = "" - final_word_dict = {} + win_name = "" + tie_word_dict = {} for word in word_list: word_score = score_word(word) if word_score > max_score: max_score = word_score - max_name = word + win_name = word + for word in word_list: if score_word(word) == max_score: - final_word_dict[word] = len(word) - if len(final_word_dict) == 1: - return max_name, max_score + tie_word_dict[word] = len(word) - #if len = 10, this word win - for word, length in final_word_dict.items(): + # check if only one word in tie_word_dict + if len(tie_word_dict) == 1: + return win_name, max_score + + #check if len of word in tie_word_dict = 10, this word win + for word, length in tie_word_dict.items(): while length == 10: return (word, max_score) - #len != 10, word with fewest len win - #same length -> choose the first occurence + + #check if len of word != 10, word with fewest len win + #and if words with the same length -> pick the first one in tie_word_dict else: mini_length = 10 - for word, length in final_word_dict.items(): + for word, length in tie_word_dict.items(): if length < mini_length: mini_length = length - key_list = list(final_word_dict.keys()) - val_list = list(final_word_dict.values()) - best_name = key_list[val_list.index(mini_length)] - return (best_name, max_score) \ No newline at end of file + key_list = list(tie_word_dict.keys()) + val_list = list(tie_word_dict.values()) + win_name = key_list[val_list.index(mini_length)] + return (win_name, max_score) \ No newline at end of file