diff --git a/adagrams/game.py b/adagrams/game.py index 5fb37b11..eb6af1da 100644 --- a/adagrams/game.py +++ b/adagrams/game.py @@ -1,11 +1,144 @@ +from multiprocessing import pool +import random + +def build_letter_pool(): + 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 + } + + return LETTER_POOL + + +def build_available_letters_list(LETTER_POOL): + available_letters = [] + + for letter,frequency in LETTER_POOL.items(): + for i in range(frequency): + available_letters.append(letter) + + return available_letters + + def draw_letters(): - pass + hand = [] + LETTER_POOL = build_letter_pool() + available_letters = build_available_letters_list(LETTER_POOL) + count_dict = {} + + while len(hand) < 10: + random_letter = random.choice(available_letters) + + if random_letter not in hand: + hand.append(random_letter) + count_dict[random_letter] = 1 + elif LETTER_POOL[random_letter] > count_dict[random_letter]: + hand.append(random_letter) + count_dict[random_letter] += 1 + + return hand + def uses_available_letters(word, letter_bank): - pass + letter_bank_copy = letter_bank.copy() + for letter in word.upper(): + if letter not in letter_bank_copy: + return False + + letter_bank_copy.remove(letter) + + return True + + +def build_score_chart(): + """ + |Letter | Value| + |:----------------------------:|:----:| + |A, E, I, O, U, L, N, R, S, T | 1 | + |D, G | 2 | + |B, C, M, P | 3 | + |F, H, V, W, Y | 4 | + |K | 5 | + |J, X | 8 | + |Q, Z | 10 | + """ + + score_chart = { + ("A", "E", "I", "O", "U", "L", "N", "R", "S", "T"): 1, + ("D", "G"): 2, + ("B", "C", "M", "P"): 3, + ("F", "H", "V", "W", "Y"): 4, + ("K"): 5, + ("J", "X"): 8, + ("Q", "Z"): 10 + } + + return score_chart + def score_word(word): - pass + score_chart = build_score_chart() + score = 0 + + if 7 <= len(word) <= 10: + score += 8 + + for letters, points in score_chart.items(): + for char in word.upper(): + if char in letters: + score += points + + return score + def get_highest_word_score(word_list): - pass \ No newline at end of file + highest_word_score = ("", 0) + + for word in word_list: + current_word_score = (word, score_word(word)) + if current_word_score[1] > highest_word_score[1]: + highest_word_score = current_word_score + + # tie breakers + if current_word_score[1] == highest_word_score[1]: + # if they're the same length pick the first word + if len(current_word_score[0]) == len(highest_word_score[0]): + continue + + # or pick the word with a length of 10 + elif len(current_word_score[0]) == 10: + highest_word_score = current_word_score + + elif len(highest_word_score[0]) == 10: + continue + + # or pick the word with the fewest letters + elif len(current_word_score[0]) < len(highest_word_score[0]): + highest_word_score = current_word_score + + return highest_word_score + diff --git a/main.py b/main.py index bcd6ab0b..3ec6e3eb 100644 --- a/main.py +++ b/main.py @@ -13,7 +13,7 @@ def wave_1_run_game(): display_retry_instructions() continue_input = input() game_continue = continue_input == "y" - + display_goodbye_message() def wave_2_run_game(): @@ -33,7 +33,7 @@ def wave_2_run_game(): display_retry_instructions() continue_input = input() game_continue = continue_input == "y" - + display_goodbye_message() def wave_3_run_game(): @@ -101,4 +101,4 @@ def main(wave): wave = int(args[1]) else: wave = "ERROR" - main(wave) \ No newline at end of file + main(wave) diff --git a/tests/test_wave_01.py b/tests/test_wave_01.py index 25ef73e7..34b4f0d0 100644 --- a/tests/test_wave_01.py +++ b/tests/test_wave_01.py @@ -30,7 +30,7 @@ 'Y': 2, 'Z': 1 } - +#@pytest.mark.skip() def test_draw_letters_draws_ten(): # Arrange/Act letters = draw_letters() @@ -38,6 +38,7 @@ def test_draw_letters_draws_ten(): # Assert assert len(letters) == 10 +#@pytest.mark.skip() def test_draw_letters_is_list_of_letter_strings(): # Arrange/Act letters = draw_letters() @@ -49,6 +50,7 @@ def test_draw_letters_is_list_of_letter_strings(): assert type(elem) == str assert len(elem) == 1 +#@pytest.mark.skip() def test_letter_not_selected_too_many_times(): for i in range(1000): diff --git a/tests/test_wave_02.py b/tests/test_wave_02.py index a5170d8a..41d2b6b1 100644 --- a/tests/test_wave_02.py +++ b/tests/test_wave_02.py @@ -2,6 +2,7 @@ from adagrams.game import uses_available_letters +#@pytest.mark.skip() 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 +#@pytest.mark.skip() 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 +#@pytest.mark.skip() 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 +#@pytest.mark.skip() 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 +#@pytest.mark.skip() 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..d39e0de9 100644 --- a/tests/test_wave_03.py +++ b/tests/test_wave_03.py @@ -2,22 +2,26 @@ from adagrams.game import score_word +#@pytest.mark.skip() def test_score_word_accurate(): # Assert assert score_word("A") == 1 assert score_word("DOG") == 5 assert score_word("WHIMSY") == 17 +#@pytest.mark.skip() def test_score_word_accurate_ignores_case(): # Assert assert score_word("a") == 1 assert score_word("dog") == 5 assert score_word("wHiMsY") == 17 +#@pytest.mark.skip() def test_score_zero_for_empty(): # Assert assert score_word("") == 0 +#@pytest.mark.skip() 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..c4074674 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 +#@pytest.mark.skip() 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 +#@pytest.mark.skip() 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 +#@pytest.mark.skip() 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 +#@pytest.mark.skip() 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 +#@pytest.mark.skip() 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 +#@pytest.mark.skip() 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 +#@pytest.mark.skip() def test_get_highest_word_tie_same_length_prefers_first(): # Arrange words = ["AAAAAAAAAA", "EEEEEEEEEE"]