4 "signature": "sha256:5e9f030b42097ebbcce2654cdb1d9370fde38b61bdbfa85a0cc700e76d5a8a71"
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",
64 " return [p for p, l in enumerate(self.target) if l == letter]\n",
66 " def update_discovered_word(self, guessed_letter):\n",
67 " locations = self.find_all(guessed_letter)\n",
68 " for location in locations:\n",
69 " self.discovered[location] = guessed_letter\n",
70 " return self.discovered\n",
72 " def do_turn(self):\n",
74 " guess = self.player.guess(self.discovered, self.wrong_letters, self.lives)\n",
76 " guess = self.ask_for_guess()\n",
77 " if guess in self.target:\n",
78 " self.update_discovered_word(guess)\n",
81 " if guess not in self.wrong_letters:\n",
82 " self.wrong_letters += [guess]\n",
83 " if self.lives == 0:\n",
84 " self.game_finished = True\n",
85 " self.game_lost = True\n",
86 " if '_' not in self.discovered:\n",
87 " self.game_finished = True\n",
88 " self.game_won = True\n",
90 " def ask_for_guess(self):\n",
91 " print('Word:', ' '.join(self.discovered), \n",
92 " ' : Lives =', self.lives, \n",
93 " ', wrong guesses:', ' '.join(sorted(self.wrong_letters)))\n",
94 " guess = input('Enter letter: ').strip().lower()[0]\n",
97 " def play_game(self):\n",
99 " while not self.game_finished:\n",
101 " if not self.player:\n",
102 " self.report_on_game()\n",
103 " return self.game_won\n",
105 " def report_on_game(self):\n",
106 " if self.game_won:\n",
107 " print('You won! The word was', self.target)\n",
109 " print('You lost. The word was', self.target)\n",
110 " return self.game_won"
112 "language": "python",
121 "g = Game(random.choice(WORDS))"
123 "language": "python",
134 "language": "python",
139 "output_type": "pyout",
154 "language": "python",
159 "output_type": "pyout",
162 "['_', '_', '_', '_', '_', '_']"
174 "language": "python",
178 "output_type": "stream",
181 "Word: _ _ _ _ _ _ : Lives = 10 , wrong guesses: \n"
186 "output_type": "stream",
201 "language": "python",
206 "output_type": "pyout",
221 "language": "python",
226 "output_type": "pyout",
241 "language": "python",
245 "output_type": "stream",
248 "Word: _ _ _ _ _ e : Lives = 10 , wrong guesses: \n"
253 "output_type": "stream",
268 "language": "python",
273 "output_type": "pyout",
288 "language": "python",
293 "output_type": "pyout",
296 "['_', '_', '_', '_', '_', 'e']"
308 "language": "python",
313 "output_type": "pyout",
326 "g = Game(random.choice(WORDS))\n",
329 "language": "python",
333 "output_type": "stream",
336 "Word: _ _ _ _ _ _ _ : Lives = 10 , wrong guesses: \n"
341 "output_type": "stream",
348 "output_type": "stream",
351 "Word: _ _ _ _ _ _ d : Lives = 10 , wrong guesses: \n"
356 "output_type": "stream",
363 "output_type": "stream",
366 "Word: _ e _ _ _ e d : Lives = 10 , wrong guesses: \n"
371 "output_type": "stream",
378 "output_type": "stream",
381 "Word: _ e _ _ _ e d : Lives = 9 , wrong guesses: f\n"
386 "output_type": "stream",
393 "output_type": "stream",
396 "Word: _ e _ _ _ e d : Lives = 9 , wrong guesses: f\n"
401 "output_type": "stream",
408 "output_type": "stream",
411 "Word: _ e _ _ _ e d : Lives = 8 , wrong guesses: f s\n"
416 "output_type": "stream",
423 "output_type": "stream",
426 "Word: _ e _ _ _ e d : Lives = 7 , wrong guesses: f s t\n"
431 "output_type": "stream",
438 "output_type": "stream",
441 "Word: _ e _ _ _ e d : Lives = 6 , wrong guesses: f n s t\n"
446 "output_type": "stream",
453 "output_type": "stream",
456 "Word: _ e _ _ _ e d : Lives = 5 , wrong guesses: f m n s t\n"
461 "output_type": "stream",
468 "output_type": "stream",
471 "Word: _ e _ _ _ e d : Lives = 4 , wrong guesses: f h m n s t\n"
476 "output_type": "stream",
483 "output_type": "stream",
486 "Word: _ e _ _ _ e d : Lives = 3 , wrong guesses: f h m n o s t\n"
491 "output_type": "stream",
498 "output_type": "stream",
501 "Word: _ e _ i _ e d : Lives = 3 , wrong guesses: f h m n o s t\n"
506 "output_type": "stream",
513 "output_type": "stream",
516 "Word: r e _ i r e d : Lives = 3 , wrong guesses: f h m n o s t\n"
521 "output_type": "stream",
528 "output_type": "stream",
531 "You won! The word was rewired\n"
536 "output_type": "pyout",
549 "g = Game(random.choice(WORDS))\n",
552 "language": "python",
556 "output_type": "stream",
559 "Word: _ _ _ _ _ : Lives = 10 , wrong guesses: \n"
564 "output_type": "stream",
571 "output_type": "stream",
574 "Word: _ _ _ _ _ : Lives = 9 , wrong guesses: e\n"
579 "output_type": "stream",
586 "output_type": "stream",
589 "Word: _ _ _ _ s : Lives = 9 , wrong guesses: e\n"
594 "output_type": "stream",
601 "output_type": "stream",
604 "Word: _ _ _ _ s : Lives = 8 , wrong guesses: e t\n"
609 "output_type": "stream",
616 "output_type": "stream",
619 "Word: _ _ _ _ s : Lives = 7 , wrong guesses: e o t\n"
624 "output_type": "stream",
631 "output_type": "stream",
634 "Word: _ _ _ _ s : Lives = 6 , wrong guesses: e i o t\n"
639 "output_type": "stream",
646 "output_type": "stream",
649 "Word: _ _ _ _ s : Lives = 5 , wrong guesses: e i o t u\n"
654 "output_type": "stream",
661 "output_type": "stream",
664 "Word: _ _ _ _ s : Lives = 4 , wrong guesses: a e i o t u\n"
669 "output_type": "stream",
676 "output_type": "stream",
679 "Word: _ y _ _ s : Lives = 4 , wrong guesses: a e i o t u\n"
684 "output_type": "stream",
691 "output_type": "stream",
694 "Word: _ y _ _ s : Lives = 3 , wrong guesses: a e i o t u w\n"
699 "output_type": "stream",
706 "output_type": "stream",
709 "Word: h y _ _ s : Lives = 3 , wrong guesses: a e i o t u w\n"
714 "output_type": "stream",
721 "output_type": "stream",
724 "Word: h y m _ s : Lives = 3 , wrong guesses: a e i o t u w\n"
729 "output_type": "stream",
736 "output_type": "stream",
739 "You won! The word was hymns\n"
744 "output_type": "pyout",
759 "language": "python",
764 "output_type": "pyout",
765 "prompt_number": 108,
777 "class PlayerAlphabetical:\n",
778 " def guess(self, discovered, missed, lives):\n",
779 " guessed_letters = [l.lower() for l in discovered + missed if l in string.ascii_letters]\n",
780 " return [l for l in string.ascii_lowercase if l not in guessed_letters][0]"
782 "language": "python",
791 "g = Game(random.choice(WORDS), player=PlayerAlphabetical())"
793 "language": "python",
804 "language": "python",
809 "output_type": "pyout",
810 "prompt_number": 111,
824 "language": "python",
829 "output_type": "pyout",
830 "prompt_number": 112,
832 "['l', 'e', 'g', 'a', 'l', 'l', '_']"
844 "language": "python",
849 "output_type": "pyout",
850 "prompt_number": 113,
862 "g = Game(random.choice(WORDS), player=PlayerAlphabetical())\n",
864 "print('Target:', g.target, '; Discovered:', g.discovered, '; Lives remaining:', g.lives)"
866 "language": "python",
870 "output_type": "stream",
873 "Target: cavalry ; Discovered: ['c', 'a', '_', 'a', 'l', '_', '_'] ; Lives remaining: 0\n"
883 "LETTER_COUNTS = collections.Counter(l.lower() for l in open('sherlock-holmes.txt').read() if l in string.ascii_letters)\n",
884 "LETTERS_IN_ORDER = [p[0] for p in LETTER_COUNTS.most_common()]\n",
886 "class PlayerFreqOrdered:\n",
887 " def guess(self, discovered, missed, lives):\n",
888 " guessed_letters = [l.lower() for l in discovered + missed if l in string.ascii_letters]\n",
889 " return [l for l in LETTERS_IN_ORDER if l not in guessed_letters][0]"
891 "language": "python",
900 "g = Game(random.choice(WORDS), player=PlayerFreqOrdered())\n",
902 "print('Target:', g.target, '; Discovered:', g.discovered, '; Lives remaining:', g.lives)"
904 "language": "python",
908 "output_type": "stream",
911 "Target: deathblow ; Discovered: ['d', 'e', 'a', 't', 'h', '_', 'l', 'o', 'w'] ; Lives remaining: 0\n"
921 "g = Game(random.choice(WORDS), player=PlayerFreqOrdered())\n",
923 "print('Target:', g.target, '; Discovered:', g.discovered, '; Lives remaining:', g.lives)"
925 "language": "python",
929 "output_type": "stream",
932 "Target: littered ; Discovered: ['l', 'i', 't', 't', 'e', 'r', 'e', 'd'] ; Lives remaining: 5\n"
942 "g = Game(random.choice(WORDS), player=PlayerFreqOrdered())\n",
944 "print('Target:', g.target, '; Discovered:', g.discovered, '; Lives remaining:', g.lives)"
946 "language": "python",
950 "output_type": "stream",
953 "Target: licenced ; Discovered: ['l', 'i', 'c', 'e', 'n', 'c', 'e', 'd'] ; Lives remaining: 1\n"
963 "class PlayerFixedOrder:\n",
964 " def __init__(self, ordered_letters):\n",
965 " self.ordered_letters = ordered_letters\n",
967 " def guess(self, discovered, missed, lives):\n",
968 " guessed_letters = [l.lower() for l in discovered + missed if l in string.ascii_letters]\n",
969 " return [l for l in self.ordered_letters if l not in guessed_letters][0]"
971 "language": "python",
980 "class PlayerAlphabetical(PlayerFixedOrder):\n",
981 " def __init__(self):\n",
982 " super().__init__(string.ascii_lowercase)\n",
984 "class PlayerFreqOrdered(PlayerFixedOrder):\n",
985 " def __init__(self):\n",
986 " super().__init__(LETTERS_IN_ORDER)\n"
988 "language": "python",
997 "g = Game(random.choice(WORDS), player=PlayerFreqOrdered())\n",
999 "print('Target:', g.target, '; Discovered:', g.discovered, '; Lives remaining:', g.lives)"
1001 "language": "python",
1005 "output_type": "stream",
1008 "Target: unworthier ; Discovered: ['u', 'n', 'w', 'o', 'r', 't', 'h', 'i', 'e', 'r'] ; Lives remaining: 5\n"
1012 "prompt_number": 121
1015 "cell_type": "code",
1018 "g = Game(random.choice(WORDS), player=PlayerFreqOrdered())\n",
1020 "print('Target:', g.target, '; Discovered:', g.discovered, '; Lives remaining:', g.lives)"
1022 "language": "python",
1026 "output_type": "stream",
1029 "Target: kneel ; Discovered: ['_', 'n', 'e', 'e', 'l'] ; Lives remaining: 0\n"
1033 "prompt_number": 122
1036 "cell_type": "code",
1039 "g = Game(random.choice(WORDS), player=PlayerAlphabetical())\n",
1041 "print('Target:', g.target, '; Discovered:', g.discovered, '; Lives remaining:', g.lives)"
1043 "language": "python",
1047 "output_type": "stream",
1050 "Target: provisoes ; Discovered: ['_', '_', '_', '_', 'i', '_', '_', 'e', '_'] ; Lives remaining: 0\n"
1054 "prompt_number": 123
1057 "cell_type": "code",
1060 "g = Game(random.choice(WORDS), player=PlayerFixedOrder(list(reversed(string.ascii_lowercase))))\n",
1062 "print('Target:', g.target, '; Discovered:', g.discovered, '; Lives remaining:', g.lives)"
1064 "language": "python",
1068 "output_type": "stream",
1071 "Target: invincible ; Discovered: ['_', '_', 'v', '_', '_', '_', '_', '_', '_', '_'] ; Lives remaining: 0\n"
1075 "prompt_number": 124
1078 "cell_type": "code",
1081 "g = Game(random.choice(WORDS), player=PlayerFixedOrder(list(reversed(string.ascii_lowercase))))\n",
1083 "print('Target:', g.target, '; Discovered:', g.discovered, '; Lives remaining:', g.lives)"
1085 "language": "python",
1089 "output_type": "stream",
1092 "Target: clogging ; Discovered: ['_', '_', '_', '_', '_', '_', '_', '_'] ; Lives remaining: 0\n"
1096 "prompt_number": 125
1099 "cell_type": "code",
1103 "for _ in range(1000):\n",
1104 " g = Game(random.choice(WORDS), player=PlayerAlphabetical())\n",
1106 " if g.game_won:\n",
1110 "language": "python",
1114 "output_type": "stream",
1121 "prompt_number": 126
1124 "cell_type": "code",
1128 "for _ in range(1000):\n",
1129 " g = Game(random.choice(WORDS), player=PlayerFreqOrdered())\n",
1131 " if g.game_won:\n",
1135 "language": "python",
1139 "output_type": "stream",
1146 "prompt_number": 127
1149 "cell_type": "code",
1153 "for _ in range(1000):\n",
1154 " g = Game(random.choice(WORDS), player=PlayerFixedOrder(list(reversed(string.ascii_lowercase))))\n",
1156 " if g.game_won:\n",
1160 "language": "python",
1164 "output_type": "stream",
1171 "prompt_number": 128
1174 "cell_type": "code",
1177 "language": "python",
1180 "prompt_number": 128