4 "signature": "sha256:e848b3bb14cbbc0d122596bd49c2e49d1d795881920f1f2a98206e14ff6b2b0a"
29 "WORDS = [w.strip() for w in open('/usr/share/dict/british-english').readlines() \n",
30 " if re.match(r'^[a-z]*$', w.strip())]"
53 " def __init__(self, target, player=None, lives=STARTING_LIVES):\n",
54 " self.lives = lives\n",
55 " self.player = player\n",
56 " self.target = target\n",
57 " self.discovered = list('_' * len(target))\n",
58 " self.wrong_letters = []\n",
59 " self.game_finished = False\n",
60 " self.game_won = False\n",
61 " self.game_lost = False\n",
63 " def find_all(self, letter):\n",
66 " location = self.target.find(letter)\n",
67 " while location > -1:\n",
68 " locations += [location]\n",
69 " starting = location + 1\n",
70 " location = self.target.find(letter, starting)\n",
71 " return locations\n",
73 " def update_discovered_word(self, guessed_letter):\n",
74 " locations = self.find_all(guessed_letter)\n",
75 " for location in locations:\n",
76 " self.discovered[location] = guessed_letter\n",
77 " return self.discovered\n",
79 " def do_turn(self):\n",
81 " guess = self.player.guess(self.discovered, self.wrong_letters, self.lives)\n",
83 " guess = self.ask_for_guess()\n",
84 " if guess in self.target:\n",
85 " self.update_discovered_word(guess)\n",
88 " if guess not in self.wrong_letters:\n",
89 " self.wrong_letters += [guess]\n",
90 " if self.lives == 0:\n",
91 " self.game_finished = True\n",
92 " self.game_lost = True\n",
93 " if '_' not in self.discovered:\n",
94 " self.game_finished = True\n",
95 " self.game_won = True\n",
97 " def ask_for_guess(self):\n",
98 " print('Word:', ' '.join(self.discovered), \n",
99 " ' : Lives =', self.lives, \n",
100 " ', wrong guesses:', ' '.join(sorted(self.wrong_letters)))\n",
101 " guess = input('Enter letter: ').strip().lower()[0]\n",
104 " def play_game(self):\n",
106 " while not self.game_finished:\n",
108 " if not self.player:\n",
109 " self.report_on_game()\n",
110 " return self.game_won\n",
112 " def report_on_game(self):\n",
113 " if self.game_won:\n",
114 " print('You won! The word was', self.target)\n",
116 " print('You lost. The word was', self.target)\n",
117 " return self.game_won"
119 "language": "python",
128 "g = Game(random.choice(WORDS))"
130 "language": "python",
141 "language": "python",
146 "output_type": "pyout",
161 "language": "python",
166 "output_type": "pyout",
169 "['_', '_', '_', '_', '_', '_', '_', '_', '_', '_']"
181 "language": "python",
185 "output_type": "stream",
188 "Word: _ _ _ _ _ _ _ _ _ _ : Lives = 10 , wrong guesses: \n"
193 "output_type": "stream",
208 "language": "python",
213 "output_type": "pyout",
228 "language": "python",
233 "output_type": "pyout",
248 "language": "python",
252 "output_type": "stream",
255 "Word: _ _ _ _ _ _ _ _ _ _ : Lives = 9 , wrong guesses: e\n"
260 "output_type": "stream",
275 "language": "python",
280 "output_type": "pyout",
295 "language": "python",
300 "output_type": "pyout",
303 "['_', 'a', '_', '_', '_', '_', '_', '_', '_', '_']"
315 "language": "python",
320 "output_type": "pyout",
333 "g = Game(random.choice(WORDS))\n",
336 "language": "python",
340 "output_type": "stream",
343 "Word: _ _ _ _ _ : Lives = 10 , wrong guesses: \n"
348 "output_type": "stream",
355 "output_type": "stream",
358 "Word: _ _ _ _ _ : Lives = 9 , wrong guesses: e\n"
363 "output_type": "stream",
370 "output_type": "stream",
373 "Word: a _ _ _ _ : Lives = 9 , wrong guesses: e\n"
378 "output_type": "stream",
385 "output_type": "stream",
388 "Word: a _ _ _ _ : Lives = 8 , wrong guesses: e t\n"
393 "output_type": "stream",
400 "output_type": "stream",
403 "Word: a _ _ _ _ : Lives = 7 , wrong guesses: e i t\n"
408 "output_type": "stream",
415 "output_type": "stream",
418 "Word: a _ _ o _ : Lives = 7 , wrong guesses: e i t\n"
423 "output_type": "stream",
430 "output_type": "stream",
433 "Word: a _ _ o _ : Lives = 6 , wrong guesses: e i s t\n"
438 "output_type": "stream",
445 "output_type": "stream",
448 "Word: a _ _ o _ : Lives = 5 , wrong guesses: e i n s t\n"
453 "output_type": "stream",
460 "output_type": "stream",
463 "Word: a _ _ o _ : Lives = 4 , wrong guesses: e h i n s t\n"
468 "output_type": "stream",
475 "output_type": "stream",
478 "Word: a _ _ o _ : Lives = 3 , wrong guesses: e h i n r s t\n"
483 "output_type": "stream",
490 "output_type": "stream",
493 "Word: a _ _ o _ : Lives = 2 , wrong guesses: d e h i n r s t\n"
498 "output_type": "stream",
505 "output_type": "stream",
508 "Word: a l l o _ : Lives = 2 , wrong guesses: d e h i n r s t\n"
513 "output_type": "stream",
520 "output_type": "stream",
523 "Word: a l l o _ : Lives = 1 , wrong guesses: d e h i n r s t y\n"
528 "output_type": "stream",
535 "output_type": "stream",
538 "You won! The word was allow\n"
543 "output_type": "pyout",
556 "g = Game(random.choice(WORDS))\n",
559 "language": "python",
563 "output_type": "stream",
566 "Word: _ _ _ _ _ _ _ _ : Lives = 10 , wrong guesses: \n"
571 "output_type": "stream",
578 "output_type": "stream",
581 "Word: _ _ _ e e _ _ _ : Lives = 10 , wrong guesses: \n"
586 "output_type": "stream",
593 "output_type": "stream",
596 "Word: _ _ _ e e _ _ _ : Lives = 9 , wrong guesses: a\n"
601 "output_type": "stream",
608 "output_type": "stream",
611 "Word: _ _ _ e e i _ _ : Lives = 9 , wrong guesses: a\n"
616 "output_type": "stream",
623 "output_type": "stream",
626 "Word: _ _ _ e e i n _ : Lives = 9 , wrong guesses: a\n"
631 "output_type": "stream",
638 "output_type": "stream",
641 "Word: _ _ _ e e i n g : Lives = 9 , wrong guesses: a\n"
646 "output_type": "stream",
653 "output_type": "stream",
656 "Word: _ _ _ e e i n g : Lives = 8 , wrong guesses: a u\n"
661 "output_type": "stream",
668 "output_type": "stream",
671 "Word: s _ _ e e i n g : Lives = 8 , wrong guesses: a u\n"
676 "output_type": "stream",
683 "output_type": "stream",
686 "Word: s _ _ e e i n g : Lives = 7 , wrong guesses: a h u\n"
691 "output_type": "stream",
698 "output_type": "stream",
701 "Word: s _ _ e e i n g : Lives = 6 , wrong guesses: a c h u\n"
706 "output_type": "stream",
713 "output_type": "stream",
716 "Word: s _ _ e e i n g : Lives = 5 , wrong guesses: a c h t u\n"
721 "output_type": "stream",
728 "output_type": "stream",
731 "Word: s _ r e e i n g : Lives = 5 , wrong guesses: a c h t u\n"
736 "output_type": "stream",
743 "output_type": "stream",
746 "Word: s _ r e e i n g : Lives = 4 , wrong guesses: a c h t u\n"
751 "output_type": "stream",
759 "output_type": "pyout",
774 "language": "python",
779 "output_type": "pyout",
792 "class PlayerAlphabetical:\n",
793 " def guess(self, discovered, missed, lives):\n",
794 " guessed_letters = [l.lower() for l in discovered + missed if l in string.ascii_letters]\n",
795 " return self.ordered_subtract(string.ascii_lowercase, guessed_letters)[0]\n",
797 " def ordered_subtract(self, ordered_list, to_remove):\n",
798 " for r in to_remove:\n",
799 " if r in ordered_list:\n",
800 " ri = ordered_list.index(r)\n",
801 " ordered_list = ordered_list[:ri] + ordered_list[ri+1:]\n",
802 " return ordered_list"
804 "language": "python",
813 "g = Game(random.choice(WORDS), player=PlayerAlphabetical())"
815 "language": "python",
826 "language": "python",
831 "output_type": "pyout",
846 "language": "python",
851 "output_type": "pyout",
854 "['d', 'e', '_', 'i', 'a', 'n', '_', '_']"
866 "language": "python",
871 "output_type": "pyout",
884 "g = Game(random.choice(WORDS), player=PlayerAlphabetical())\n",
886 "print('Target:', g.target, '; Discovered:', g.discovered, '; Lives remaining:', g.lives)"
888 "language": "python",
892 "output_type": "stream",
895 "Target: peoples ; Discovered: ['_', 'e', '_', '_', '_', 'e', '_'] ; Lives remaining: 0\n"
905 "LETTER_COUNTS = collections.Counter(l.lower() for l in open('sherlock-holmes.txt').read() if l in string.ascii_letters)\n",
906 "LETTERS_IN_ORDER = [p[0] for p in LETTER_COUNTS.most_common()]\n",
908 "class PlayerFreqOrdered:\n",
909 " def guess(self, discovered, missed, lives):\n",
910 " guessed_letters = [l.lower() for l in discovered + missed if l in string.ascii_letters]\n",
911 " return self.ordered_subtract(LETTERS_IN_ORDER, guessed_letters)[0]\n",
913 " def ordered_subtract(self, ordered_list, to_remove):\n",
914 " for r in to_remove:\n",
915 " if r in ordered_list:\n",
916 " ri = ordered_list.index(r)\n",
917 " ordered_list = ordered_list[:ri] + ordered_list[ri+1:]\n",
918 " return ordered_list"
920 "language": "python",
929 "g = Game(random.choice(WORDS), player=PlayerFreqOrdered())\n",
931 "print('Target:', g.target, '; Discovered:', g.discovered, '; Lives remaining:', g.lives)"
933 "language": "python",
937 "output_type": "stream",
940 "Target: wadding ; Discovered: ['w', 'a', 'd', 'd', 'i', 'n', '_'] ; Lives remaining: 0\n"
950 "g = Game(random.choice(WORDS), player=PlayerFreqOrdered())\n",
952 "print('Target:', g.target, '; Discovered:', g.discovered, '; Lives remaining:', g.lives)"
954 "language": "python",
958 "output_type": "stream",
961 "Target: pharmacopoeias ; Discovered: ['p', 'h', 'a', 'r', 'm', 'a', 'c', 'o', 'p', 'o', 'e', 'i', 'a', 's'] ; Lives remaining: 1\n"
971 "g = Game(random.choice(WORDS), player=PlayerFreqOrdered())\n",
973 "print('Target:', g.target, '; Discovered:', g.discovered, '; Lives remaining:', g.lives)"
975 "language": "python",
979 "output_type": "stream",
982 "Target: forklift ; Discovered: ['_', 'o', 'r', '_', 'l', 'i', '_', 't'] ; Lives remaining: 0\n"
992 "class PlayerFixedOrder:\n",
993 " def __init__(self, ordered_letters):\n",
994 " self.ordered_letters = ordered_letters\n",
996 " def guess(self, discovered, missed, lives):\n",
997 " guessed_letters = [l.lower() for l in discovered + missed if l in string.ascii_letters]\n",
998 " self.ordered_subtract(guessed_letters)\n",
999 " return self.ordered_letters[0]\n",
1001 " def ordered_subtract(self, to_remove):\n",
1002 " for r in to_remove:\n",
1003 " if r in self.ordered_letters:\n",
1004 " ri = self.ordered_letters.index(r)\n",
1005 " self.ordered_letters = self.ordered_letters[:ri] + self.ordered_letters[ri+1:]"
1007 "language": "python",
1013 "cell_type": "code",
1016 "class PlayerAlphabetical(PlayerFixedOrder):\n",
1017 " def __init__(self):\n",
1018 " super().__init__(string.ascii_lowercase)\n",
1020 "class PlayerFreqOrdered(PlayerFixedOrder):\n",
1021 " def __init__(self):\n",
1022 " super().__init__(LETTERS_IN_ORDER)\n"
1024 "language": "python",
1030 "cell_type": "code",
1033 "g = Game(random.choice(WORDS), player=PlayerFreqOrdered())\n",
1035 "print('Target:', g.target, '; Discovered:', g.discovered, '; Lives remaining:', g.lives)"
1037 "language": "python",
1041 "output_type": "stream",
1044 "Target: nods ; Discovered: ['n', 'o', 'd', 's'] ; Lives remaining: 4\n"
1051 "cell_type": "code",
1054 "g = Game(random.choice(WORDS), player=PlayerFreqOrdered())\n",
1056 "print('Target:', g.target, '; Discovered:', g.discovered, '; Lives remaining:', g.lives)"
1058 "language": "python",
1062 "output_type": "stream",
1065 "Target: firsthand ; Discovered: ['f', 'i', 'r', 's', 't', 'h', 'a', 'n', 'd'] ; Lives remaining: 2\n"
1072 "cell_type": "code",
1075 "g = Game(random.choice(WORDS), player=PlayerAlphabetical())\n",
1077 "print('Target:', g.target, '; Discovered:', g.discovered, '; Lives remaining:', g.lives)"
1079 "language": "python",
1083 "output_type": "stream",
1086 "Target: lawbreakers ; Discovered: ['l', 'a', '_', 'b', '_', 'e', 'a', 'k', 'e', '_', '_'] ; Lives remaining: 0\n"
1093 "cell_type": "code",
1096 "g = Game(random.choice(WORDS), player=PlayerFixedOrder(list(reversed(string.ascii_lowercase))))\n",
1098 "print('Target:', g.target, '; Discovered:', g.discovered, '; Lives remaining:', g.lives)"
1100 "language": "python",
1104 "output_type": "stream",
1107 "Target: chilblains ; Discovered: ['_', '_', '_', '_', '_', '_', '_', '_', '_', 's'] ; Lives remaining: 0\n"
1114 "cell_type": "code",
1117 "g = Game(random.choice(WORDS), player=PlayerFixedOrder(list(reversed(string.ascii_lowercase))))\n",
1119 "print('Target:', g.target, '; Discovered:', g.discovered, '; Lives remaining:', g.lives)"
1121 "language": "python",
1125 "output_type": "stream",
1128 "Target: talks ; Discovered: ['t', '_', '_', '_', 's'] ; Lives remaining: 0\n"
1135 "cell_type": "code",
1139 "for _ in range(1000):\n",
1140 " g = Game(random.choice(WORDS), player=PlayerAlphabetical())\n",
1142 " if g.game_won:\n",
1146 "language": "python",
1150 "output_type": "stream",
1160 "cell_type": "code",
1164 "for _ in range(1000):\n",
1165 " g = Game(random.choice(WORDS), player=PlayerFreqOrdered())\n",
1167 " if g.game_won:\n",
1171 "language": "python",
1175 "output_type": "stream",
1185 "cell_type": "code",
1189 "for _ in range(1000):\n",
1190 " g = Game(random.choice(WORDS), player=PlayerFixedOrder(list(reversed(string.ascii_lowercase))))\n",
1192 " if g.game_won:\n",
1196 "language": "python",
1200 "output_type": "stream",
1210 "cell_type": "code",
1213 "language": "python",