diff --git a/adagrams/constants.py b/adagrams/constants.py new file mode 100644 index 00000000..623fbbf2 --- /dev/null +++ b/adagrams/constants.py @@ -0,0 +1,38 @@ +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 +} + +LETTER_SCORE_DICT = { + 1: ["A", "E", "I", "O", "U", "L", "N", "R", "S", "T"], + 2: ["D", "G"], + 3: ["B", "C", "M", "P"], + 4: ["F", "H", "V", "W", "Y"], + 5: ["K"], + 8: ["J", "X"], + 10: ["Q", "Z"] + } \ No newline at end of file diff --git a/adagrams/game.py b/adagrams/game.py index 5fb37b11..654e2a7b 100644 --- a/adagrams/game.py +++ b/adagrams/game.py @@ -1,11 +1,80 @@ +import random +import copy +from adagrams.constants import LETTER_POOL, LETTER_SCORE_DICT + def draw_letters(): - pass + ''' + input: none + output: return list of 10 strings, 1 letter each + frequency of each letter cannot exceed the value of + each letter in the LETTER_POOL + ''' + hand = [] + letter_freq = {} + + while len(hand) < 10: + random_letter = random.choice(list(LETTER_POOL)) + if random_letter in letter_freq: + if letter_freq[random_letter] < LETTER_POOL[random_letter]: + letter_freq[random_letter] += 1 + hand.append(random_letter) + else: + letter_freq[random_letter] = 1 + hand.append(random_letter) + return(hand) + + +def uses_available_letters(word, hand): + ''' + input: word (a string) and hand (a list of strings, one char each) + output: Returns True if each char is uniquely in hand. Returns + False otherwise or if char in word is not in hand. + ''' + word = word.upper() + hand_copy = copy.deepcopy(hand) + for letter in word: + if letter in hand_copy: + hand_copy.remove(letter) + elif letter not in hand_copy: + return False + return True -def uses_available_letters(word, letter_bank): - pass def score_word(word): - pass + ''' + input: word (a string of characters) + output: Returns a total score based on the value of each char in + word, as defined in LETTER_SCORE_DICT. Words between 7 and 10 + char score an extra 8 points. + ''' + score = 0 + word = word.upper() + for letter in word: + for key, value in LETTER_SCORE_DICT.items(): + if letter in value: + score += key + if 7 <= len(word) <= 10: + score += 8 + return score + + +def get_highest_word_score(word_list): + ''' + input: list of strings representing each word user has created + output: returns tuple with highest scoring word and score. If tied: + shortest length word is preferred, unless length is 10 char + ''' + played_word_dict = {} + for word in word_list: + score = score_word(word) + played_word_dict[word] = score + + highest_score = max(played_word_dict.values()) + best_word_list = [key for key, value in played_word_dict.items()\ + if value == highest_score] -def get_highest_word_score(word_list): - pass \ No newline at end of file + if len(best_word_list) > 1: + for word in best_word_list: + if len(word) == 10: + return word, highest_score + return min(best_word_list, key=len), highest_score \ No newline at end of file diff --git a/adagrams/ui_helper.py b/adagrams/ui_helper.py index 80f665f1..87b77418 100644 --- a/adagrams/ui_helper.py +++ b/adagrams/ui_helper.py @@ -27,4 +27,5 @@ def display_goodbye_message(): # is the word and the second element is the score. def display_highest_score(word_score): print("Thanks for playing Adagrams!") - print(f"The highest score from this game was {word_score[0]}, which was worth {word_score[1]} points.") \ No newline at end of file + print(f"The highest score from this game was {word_score[0]}, which was worth {word_score[1]} points.") + diff --git a/tests/test_wave_01.py b/tests/test_wave_01.py index 25ef73e7..932f40ff 100644 --- a/tests/test_wave_01.py +++ b/tests/test_wave_01.py @@ -31,6 +31,7 @@ 'Z': 1 } +# Test 1 def test_draw_letters_draws_ten(): # Arrange/Act letters = draw_letters() @@ -38,6 +39,7 @@ def test_draw_letters_draws_ten(): # Assert assert len(letters) == 10 +# Test 2 def test_draw_letters_is_list_of_letter_strings(): # Arrange/Act letters = draw_letters() @@ -49,6 +51,7 @@ def test_draw_letters_is_list_of_letter_strings(): assert type(elem) == str assert len(elem) == 1 +# Test 3 def test_letter_not_selected_too_many_times(): for i in range(1000): @@ -56,6 +59,7 @@ def test_letter_not_selected_too_many_times(): letters = draw_letters() letter_freq = {} + #for each letter in your hand, count how many times it shows up for letter in letters: if letter in letter_freq: letter_freq[letter] += 1 diff --git a/tests/test_wave_02.py b/tests/test_wave_02.py index a5170d8a..4945108c 100644 --- a/tests/test_wave_02.py +++ b/tests/test_wave_02.py @@ -2,6 +2,7 @@ from adagrams.game import uses_available_letters +# Test 4 def test_uses_available_letters_true_word_in_letter_bank(): # Arrange letters = ["D", "O", "G", "X", "X", "X", "X", "X", "X", "X"] @@ -13,6 +14,7 @@ def test_uses_available_letters_true_word_in_letter_bank(): # Assert assert is_valid == True +# Test 5 def test_uses_available_letters_false_word_in_letter_bank(): # Arrange letters = ["D", "O", "X", "X", "X", "X", "X", "X", "X", "X"] @@ -24,6 +26,7 @@ def test_uses_available_letters_false_word_in_letter_bank(): # Assert assert is_valid == False +# Test 6 def test_uses_available_letters_false_word_overuses_letter(): # Arrange letters = ["A", "X", "X", "X", "X", "X", "X", "X", "X", "X"] @@ -35,6 +38,7 @@ def test_uses_available_letters_false_word_overuses_letter(): # Assert assert is_valid == False +# Test 7 def test_uses_available_letters_does_not_change_letter_bank(): # Arrange letters = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J"] @@ -48,6 +52,7 @@ def test_uses_available_letters_does_not_change_letter_bank(): assert is_valid == True assert letters == letters_copy +# Test 8 def test_uses_available_letters_ignores_case(): # Arrange letters = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J"] diff --git a/tests/test_wave_03.py b/tests/test_wave_03.py index 5473db39..3c0f5198 100644 --- a/tests/test_wave_03.py +++ b/tests/test_wave_03.py @@ -2,22 +2,26 @@ from adagrams.game import score_word +# Test 9 def test_score_word_accurate(): # Assert assert score_word("A") == 1 assert score_word("DOG") == 5 assert score_word("WHIMSY") == 17 +# Test 10 def test_score_word_accurate_ignores_case(): # Assert assert score_word("a") == 1 assert score_word("dog") == 5 assert score_word("wHiMsY") == 17 +# Test 11 def test_score_zero_for_empty(): # Assert assert score_word("") == 0 +# Test 12 def test_score_extra_points_for_seven_or_longer(): # Assert assert score_word("XXXXXXX") == 64 diff --git a/tests/test_wave_04.py b/tests/test_wave_04.py index 8fdedf66..69c97e04 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 +# Test 13 def test_get_highest_word_score_accurate(): # Arrange words = ["X", "XX", "XXX", "XXXX"] @@ -14,6 +15,7 @@ def test_get_highest_word_score_accurate(): assert best_word[0] == "XXXX" assert best_word[1] == 32 +# Test 14 def test_get_highest_word_score_accurate_unsorted_list(): # Arrange words = ["XXX", "XXXX", "XX", "X"] @@ -25,6 +27,7 @@ def test_get_highest_word_score_accurate_unsorted_list(): assert best_word[0] == "XXXX" assert best_word[1] == 32 +# Test 15 def test_get_highest_word_tie_prefers_shorter_word(): # Arrange words = ["MMMM", "WWW"] @@ -38,6 +41,7 @@ def test_get_highest_word_tie_prefers_shorter_word(): assert best_word[0] == "WWW" assert best_word[1] == 12 +# Test 16 def test_get_highest_word_tie_prefers_shorter_word_unsorted_list(): # Arrange words = ["WWW", "MMMM"] @@ -51,6 +55,7 @@ def test_get_highest_word_tie_prefers_shorter_word_unsorted_list(): assert best_word[0] == "WWW" assert best_word[1] == 12 +# Test 17 def test_get_highest_word_tie_prefers_ten_letters(): # Arrange words = ["AAAAAAAAAA", "BBBBBB"] @@ -62,6 +67,7 @@ def test_get_highest_word_tie_prefers_ten_letters(): assert best_word[0] == "AAAAAAAAAA" assert best_word[1] == 18 +# Test 18 def test_get_highest_word_tie_prefers_ten_letters_unsorted_list(): # Arrange words = ["BBBBBB", "AAAAAAAAAA"] @@ -73,6 +79,7 @@ def test_get_highest_word_tie_prefers_ten_letters_unsorted_list(): assert best_word[0] == "AAAAAAAAAA" assert best_word[1] == 18 +# Test 19 def test_get_highest_word_tie_same_length_prefers_first(): # Arrange words = ["AAAAAAAAAA", "EEEEEEEEEE"]