First bit of the A-level miscellany
[cas-master-teacher-training.git] / hangman / hangman-split-player.ipynb
1 {
2 "metadata": {
3 "name": "",
4 "signature": "sha256:5a2b414ce60f525ddfcbb85f2b57ef6ecf5d08662151337bdc833cd40f541f71"
5 },
6 "nbformat": 3,
7 "nbformat_minor": 0,
8 "worksheets": [
9 {
10 "cells": [
11 {
12 "cell_type": "code",
13 "collapsed": false,
14 "input": [
15 "import re\n",
16 "import random\n",
17 "import string\n",
18 "import collections"
19 ],
20 "language": "python",
21 "metadata": {},
22 "outputs": [],
23 "prompt_number": 4
24 },
25 {
26 "cell_type": "code",
27 "collapsed": false,
28 "input": [
29 "WORDS = [w.strip() for w in open('/usr/share/dict/british-english').readlines() \n",
30 " if re.match(r'^[a-z]*$', w.strip())]"
31 ],
32 "language": "python",
33 "metadata": {},
34 "outputs": [],
35 "prompt_number": 5
36 },
37 {
38 "cell_type": "code",
39 "collapsed": false,
40 "input": [
41 "LETTER_COUNTS = collections.Counter(l.lower() for l in open('../sherlock-holmes.txt').read() if l in string.ascii_letters)\n",
42 "LETTERS_IN_ORDER = [p[0] for p in LETTER_COUNTS.most_common()]"
43 ],
44 "language": "python",
45 "metadata": {},
46 "outputs": [],
47 "prompt_number": 6
48 },
49 {
50 "cell_type": "code",
51 "collapsed": false,
52 "input": [
53 "STARTING_LIVES = 10"
54 ],
55 "language": "python",
56 "metadata": {},
57 "outputs": [],
58 "prompt_number": 7
59 },
60 {
61 "cell_type": "code",
62 "collapsed": false,
63 "input": [
64 "class Game:\n",
65 " def __init__(self, target, player=None, lives=STARTING_LIVES):\n",
66 " self.lives = lives\n",
67 " self.player = player\n",
68 " self.target = target\n",
69 " self.discovered = list('_' * len(target))\n",
70 " self.wrong_letters = []\n",
71 " self.game_finished = False\n",
72 " self.game_won = False\n",
73 " self.game_lost = False\n",
74 " \n",
75 " def find_all(self, letter):\n",
76 " return [p for p, l in enumerate(self.target) if l == letter]\n",
77 " \n",
78 " def update_discovered_word(self, guessed_letter):\n",
79 " locations = self.find_all(guessed_letter)\n",
80 " for location in locations:\n",
81 " self.discovered[location] = guessed_letter\n",
82 " return self.discovered\n",
83 " \n",
84 " def do_turn(self):\n",
85 " if self.player:\n",
86 " guess = self.player.guess(self.discovered, self.wrong_letters, self.lives)\n",
87 " else:\n",
88 " guess = self.ask_for_guess()\n",
89 " if guess in self.target:\n",
90 " self.update_discovered_word(guess)\n",
91 " else:\n",
92 " self.lives -= 1\n",
93 " if guess not in self.wrong_letters:\n",
94 " self.wrong_letters += [guess]\n",
95 " if self.lives == 0:\n",
96 " self.game_finished = True\n",
97 " self.game_lost = True\n",
98 " if '_' not in self.discovered:\n",
99 " self.game_finished = True\n",
100 " self.game_won = True\n",
101 " \n",
102 " def ask_for_guess(self):\n",
103 " print('Word:', ' '.join(self.discovered), \n",
104 " ' : Lives =', self.lives, \n",
105 " ', wrong guesses:', ' '.join(sorted(self.wrong_letters)))\n",
106 " guess = input('Enter letter: ').strip().lower()[0]\n",
107 " return guess\n",
108 " \n",
109 " def play_game(self):\n",
110 " while not self.game_finished:\n",
111 " self.do_turn()\n",
112 " if not self.player:\n",
113 " self.report_on_game()\n",
114 " return self.game_won\n",
115 " \n",
116 " def report_on_game(self):\n",
117 " if self.game_won:\n",
118 " print('You won! The word was', self.target)\n",
119 " else:\n",
120 " print('You lost. The word was', self.target)\n",
121 " return self.game_won"
122 ],
123 "language": "python",
124 "metadata": {},
125 "outputs": [],
126 "prompt_number": 8
127 },
128 {
129 "cell_type": "code",
130 "collapsed": false,
131 "input": [
132 "DICT_COUNTS = collections.Counter(l.lower() for l in open('/usr/share/dict/british-english').read() if l in string.ascii_letters)\n",
133 "DICT_LETTERS_IN_ORDER = [p[0] for p in DICT_COUNTS.most_common()]"
134 ],
135 "language": "python",
136 "metadata": {},
137 "outputs": [],
138 "prompt_number": 9
139 },
140 {
141 "cell_type": "code",
142 "collapsed": false,
143 "input": [
144 "class PlayerAdaptiveNoRegex:\n",
145 " def __init__(self, words):\n",
146 " self.candidate_words = words\n",
147 " \n",
148 " def guess(self, discovered, missed, lives):\n",
149 " self.filter_candidate_words(discovered, missed)\n",
150 " self.set_ordered_letters()\n",
151 " guessed_letters = [l.lower() for l in discovered + missed if l in string.ascii_letters]\n",
152 " return [l for l in self.ordered_letters if l not in guessed_letters][0]\n",
153 " \n",
154 " def filter_candidate_words(self, discovered, missed):\n",
155 " pass\n",
156 " \n",
157 " def set_ordered_letters(self):\n",
158 " counts = collections.Counter(l.lower() \n",
159 " for l in ''.join(self.candidate_words) + string.ascii_lowercase \n",
160 " if l in string.ascii_letters)\n",
161 " self.ordered_letters = [p[0] for p in counts.most_common()]\n",
162 "\n",
163 " def match(self, pattern, target, excluded=None):\n",
164 " if not excluded:\n",
165 " excluded = ''\n",
166 " if len(pattern) != len(target):\n",
167 " return False\n",
168 " for m, c in zip(pattern, target):\n",
169 " if m == '_' and c not in excluded:\n",
170 " # true\n",
171 " pass\n",
172 " elif m != '_' and m == c:\n",
173 " # true\n",
174 " pass\n",
175 " else:\n",
176 " return False\n",
177 " return True "
178 ],
179 "language": "python",
180 "metadata": {},
181 "outputs": [],
182 "prompt_number": 10
183 },
184 {
185 "cell_type": "code",
186 "collapsed": false,
187 "input": [
188 "class PlayerAdaptiveLengthNoRegex(PlayerAdaptiveNoRegex):\n",
189 " def __init__(self, words):\n",
190 " super().__init__(words)\n",
191 " self.word_len = None\n",
192 " self.ordered_letters = None\n",
193 " \n",
194 " def filter_candidate_words(self, discovered, missed):\n",
195 " if not self.word_len:\n",
196 " self.word_len = len(discovered)\n",
197 " self.candidate_words = [w for w in self.candidate_words if len(w) == self.word_len]\n",
198 " \n",
199 " def set_ordered_letters(self):\n",
200 " if not self.ordered_letters:\n",
201 " super().set_ordered_letters()"
202 ],
203 "language": "python",
204 "metadata": {},
205 "outputs": [],
206 "prompt_number": 11
207 },
208 {
209 "cell_type": "code",
210 "collapsed": false,
211 "input": [
212 "class PlayerAdaptiveIncludedLettersNoRegex(PlayerAdaptiveNoRegex):\n",
213 " def filter_candidate_words(self, discovered, missed):\n",
214 " self.candidate_words = [w for w in self.candidate_words if self.match(discovered, w)]"
215 ],
216 "language": "python",
217 "metadata": {},
218 "outputs": [],
219 "prompt_number": 12
220 },
221 {
222 "cell_type": "code",
223 "collapsed": false,
224 "input": [
225 "class PlayerAdaptiveExcludedLettersNoRegex(PlayerAdaptiveNoRegex):\n",
226 " def filter_candidate_words(self, discovered, missed):\n",
227 " if missed:\n",
228 " empty_target = '_' * len(discovered)\n",
229 " self.candidate_words = [w for w in self.candidate_words if self.match(empty_target, w, missed)] "
230 ],
231 "language": "python",
232 "metadata": {},
233 "outputs": [],
234 "prompt_number": 13
235 },
236 {
237 "cell_type": "code",
238 "collapsed": false,
239 "input": [
240 "class PlayerAdaptivePatternNoRegex(PlayerAdaptiveNoRegex):\n",
241 " def filter_candidate_words(self, discovered, missed):\n",
242 " attempted_letters = [l for l in discovered if l != '_'] + missed\n",
243 " self.candidate_words = [w for w in self.candidate_words if self.match(discovered, w, attempted_letters)]"
244 ],
245 "language": "python",
246 "metadata": {},
247 "outputs": [],
248 "prompt_number": 14
249 },
250 {
251 "cell_type": "code",
252 "collapsed": false,
253 "input": [
254 "%%timeit\n",
255 "\n",
256 "wins = 0\n",
257 "for _ in range(1000):\n",
258 " g = Game(random.choice(WORDS), player=PlayerAdaptivePatternNoRegex(WORDS))\n",
259 " g.play_game()\n",
260 " if g.game_won:\n",
261 " wins += 1\n",
262 "print(wins)"
263 ],
264 "language": "python",
265 "metadata": {},
266 "outputs": [
267 {
268 "output_type": "stream",
269 "stream": "stdout",
270 "text": [
271 "993\n",
272 "992"
273 ]
274 },
275 {
276 "output_type": "stream",
277 "stream": "stdout",
278 "text": [
279 "\n",
280 "994"
281 ]
282 },
283 {
284 "output_type": "stream",
285 "stream": "stdout",
286 "text": [
287 "\n",
288 "991"
289 ]
290 },
291 {
292 "output_type": "stream",
293 "stream": "stdout",
294 "text": [
295 "\n",
296 "1 loops, best of 3: 48.2 s per loop\n"
297 ]
298 }
299 ],
300 "prompt_number": 15
301 },
302 {
303 "cell_type": "code",
304 "collapsed": false,
305 "input": [
306 "len([w for w in WORDS if 'r' in w])"
307 ],
308 "language": "python",
309 "metadata": {},
310 "outputs": [
311 {
312 "metadata": {},
313 "output_type": "pyout",
314 "prompt_number": 21,
315 "text": [
316 "31398"
317 ]
318 }
319 ],
320 "prompt_number": 21
321 },
322 {
323 "cell_type": "code",
324 "collapsed": false,
325 "input": [
326 "len([w for w in WORDS if 'r' not in w])"
327 ],
328 "language": "python",
329 "metadata": {},
330 "outputs": [
331 {
332 "metadata": {},
333 "output_type": "pyout",
334 "prompt_number": 22,
335 "text": [
336 "31458"
337 ]
338 }
339 ],
340 "prompt_number": 22
341 },
342 {
343 "cell_type": "code",
344 "collapsed": false,
345 "input": [
346 "letter_diffs = []\n",
347 "for l in string.ascii_lowercase:\n",
348 " n = 0\n",
349 " for w in WORDS:\n",
350 " if l in w:\n",
351 " n += 1\n",
352 " else:\n",
353 " n -=1\n",
354 " letter_diffs += [(l, abs(n))]\n",
355 "sorted(letter_diffs, key=lambda p: p[1])"
356 ],
357 "language": "python",
358 "metadata": {},
359 "outputs": [
360 {
361 "metadata": {},
362 "output_type": "pyout",
363 "prompt_number": 19,
364 "text": [
365 "[('r', 60),\n",
366 " ('a', 98),\n",
367 " ('n', 3720),\n",
368 " ('t', 4728),\n",
369 " ('i', 6136),\n",
370 " ('s', 8662),\n",
371 " ('o', 12788),\n",
372 " ('l', 17878),\n",
373 " ('e', 22936),\n",
374 " ('c', 26102),\n",
375 " ('d', 26368),\n",
376 " ('u', 30282),\n",
377 " ('g', 33260),\n",
378 " ('p', 35960),\n",
379 " ('m', 37904),\n",
380 " ('h', 41134),\n",
381 " ('b', 44784),\n",
382 " ('y', 47462),\n",
383 " ('f', 49626),\n",
384 " ('v', 52502),\n",
385 " ('k', 53616),\n",
386 " ('w', 53688),\n",
387 " ('x', 60010),\n",
388 " ('q', 60816),\n",
389 " ('j', 60938),\n",
390 " ('z', 61244)]"
391 ]
392 }
393 ],
394 "prompt_number": 19
395 },
396 {
397 "cell_type": "code",
398 "collapsed": false,
399 "input": [
400 "def letter_diff(l):\n",
401 " return abs(sum(1 if l in w else -1 for w in WORDS))\n",
402 "\n",
403 "letter_diffs = [(l, letter_diff(l)) \n",
404 " for l in string.ascii_lowercase]\n",
405 "sorted(letter_diffs, key=lambda p: p[1])"
406 ],
407 "language": "python",
408 "metadata": {},
409 "outputs": [
410 {
411 "metadata": {},
412 "output_type": "pyout",
413 "prompt_number": 23,
414 "text": [
415 "[('r', 60),\n",
416 " ('a', 98),\n",
417 " ('n', 3720),\n",
418 " ('t', 4728),\n",
419 " ('i', 6136),\n",
420 " ('s', 8662),\n",
421 " ('o', 12788),\n",
422 " ('l', 17878),\n",
423 " ('e', 22936),\n",
424 " ('c', 26102),\n",
425 " ('d', 26368),\n",
426 " ('u', 30282),\n",
427 " ('g', 33260),\n",
428 " ('p', 35960),\n",
429 " ('m', 37904),\n",
430 " ('h', 41134),\n",
431 " ('b', 44784),\n",
432 " ('y', 47462),\n",
433 " ('f', 49626),\n",
434 " ('v', 52502),\n",
435 " ('k', 53616),\n",
436 " ('w', 53688),\n",
437 " ('x', 60010),\n",
438 " ('q', 60816),\n",
439 " ('j', 60938),\n",
440 " ('z', 61244)]"
441 ]
442 }
443 ],
444 "prompt_number": 23
445 },
446 {
447 "cell_type": "code",
448 "collapsed": false,
449 "input": [
450 "class PlayerAdaptiveSplit(PlayerAdaptivePatternNoRegex):\n",
451 " def set_ordered_letters(self):\n",
452 " def letter_diff(l):\n",
453 " return abs(sum(1 if l in w else -1 for w in self.candidate_words))\n",
454 " possible_letters = set(''.join(self.candidate_words))\n",
455 " # if len(self.candidate_words) > 1:\n",
456 " letter_diffs = [(l, letter_diff(l)) for l in possible_letters]\n",
457 " self.ordered_letters = [p[0] for p in sorted(letter_diffs, key=lambda p: p[1])]\n",
458 " # else:\n",
459 " # self.ordered_letters = list(self.candidate_words[0])"
460 ],
461 "language": "python",
462 "metadata": {},
463 "outputs": [],
464 "prompt_number": 71
465 },
466 {
467 "cell_type": "code",
468 "collapsed": false,
469 "input": [
470 "g = Game(random.choice(WORDS), player=PlayerAdaptiveSplit(WORDS))\n",
471 "g.play_game()"
472 ],
473 "language": "python",
474 "metadata": {},
475 "outputs": [
476 {
477 "metadata": {},
478 "output_type": "pyout",
479 "prompt_number": 72,
480 "text": [
481 "True"
482 ]
483 }
484 ],
485 "prompt_number": 72
486 },
487 {
488 "cell_type": "code",
489 "collapsed": false,
490 "input": [
491 "g.target"
492 ],
493 "language": "python",
494 "metadata": {},
495 "outputs": [
496 {
497 "metadata": {},
498 "output_type": "pyout",
499 "prompt_number": 73,
500 "text": [
501 "'baste'"
502 ]
503 }
504 ],
505 "prompt_number": 73
506 },
507 {
508 "cell_type": "code",
509 "collapsed": false,
510 "input": [
511 "g.discovered"
512 ],
513 "language": "python",
514 "metadata": {},
515 "outputs": [
516 {
517 "metadata": {},
518 "output_type": "pyout",
519 "prompt_number": 74,
520 "text": [
521 "['b', 'a', 's', 't', 'e']"
522 ]
523 }
524 ],
525 "prompt_number": 74
526 },
527 {
528 "cell_type": "code",
529 "collapsed": false,
530 "input": [
531 "g.wrong_letters"
532 ],
533 "language": "python",
534 "metadata": {},
535 "outputs": [
536 {
537 "metadata": {},
538 "output_type": "pyout",
539 "prompt_number": 75,
540 "text": [
541 "['c', 'h']"
542 ]
543 }
544 ],
545 "prompt_number": 75
546 },
547 {
548 "cell_type": "code",
549 "collapsed": false,
550 "input": [
551 "%%timeit\n",
552 "\n",
553 "wins = 0\n",
554 "for _ in range(1000):\n",
555 " g = Game(random.choice(WORDS), player=PlayerAdaptiveSplit(WORDS))\n",
556 " g.play_game()\n",
557 " if g.game_won:\n",
558 " wins += 1\n",
559 "print(wins)"
560 ],
561 "language": "python",
562 "metadata": {},
563 "outputs": [
564 {
565 "output_type": "stream",
566 "stream": "stdout",
567 "text": [
568 "983\n",
569 "982"
570 ]
571 },
572 {
573 "output_type": "stream",
574 "stream": "stdout",
575 "text": [
576 "\n",
577 "981"
578 ]
579 },
580 {
581 "output_type": "stream",
582 "stream": "stdout",
583 "text": [
584 "\n",
585 "987"
586 ]
587 },
588 {
589 "output_type": "stream",
590 "stream": "stdout",
591 "text": [
592 "\n",
593 "1 loops, best of 3: 55.6 s per loop\n"
594 ]
595 }
596 ],
597 "prompt_number": 78
598 },
599 {
600 "cell_type": "code",
601 "collapsed": false,
602 "input": [
603 "p=PlayerAdaptiveSplit(WORDS)"
604 ],
605 "language": "python",
606 "metadata": {},
607 "outputs": [],
608 "prompt_number": 54
609 },
610 {
611 "cell_type": "code",
612 "collapsed": false,
613 "input": [
614 "dsc = ['_'] * len('recognition')\n",
615 "dsc"
616 ],
617 "language": "python",
618 "metadata": {},
619 "outputs": [
620 {
621 "metadata": {},
622 "output_type": "pyout",
623 "prompt_number": 55,
624 "text": [
625 "['_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_']"
626 ]
627 }
628 ],
629 "prompt_number": 55
630 },
631 {
632 "cell_type": "code",
633 "collapsed": false,
634 "input": [
635 "p.guess(dsc, [], 10)"
636 ],
637 "language": "python",
638 "metadata": {},
639 "outputs": [
640 {
641 "metadata": {},
642 "output_type": "pyout",
643 "prompt_number": 56,
644 "text": [
645 "'o'"
646 ]
647 }
648 ],
649 "prompt_number": 56
650 },
651 {
652 "cell_type": "code",
653 "collapsed": false,
654 "input": [
655 "len(p.candidate_words)"
656 ],
657 "language": "python",
658 "metadata": {},
659 "outputs": [
660 {
661 "metadata": {},
662 "output_type": "pyout",
663 "prompt_number": 57,
664 "text": [
665 "5027"
666 ]
667 }
668 ],
669 "prompt_number": 57
670 },
671 {
672 "cell_type": "code",
673 "collapsed": false,
674 "input": [
675 "p.guess(['_', '_', '_', 'o', '_', '_', '_', '_', '_', 'o', '_'], [], 10)"
676 ],
677 "language": "python",
678 "metadata": {},
679 "outputs": [
680 {
681 "metadata": {},
682 "output_type": "pyout",
683 "prompt_number": 58,
684 "text": [
685 "'c'"
686 ]
687 }
688 ],
689 "prompt_number": 58
690 },
691 {
692 "cell_type": "code",
693 "collapsed": false,
694 "input": [
695 "p.candidate_words"
696 ],
697 "language": "python",
698 "metadata": {},
699 "outputs": [
700 {
701 "metadata": {},
702 "output_type": "pyout",
703 "prompt_number": 59,
704 "text": [
705 "['association',\n",
706 " 'defoliation',\n",
707 " 'deformation',\n",
708 " 'denominator',\n",
709 " 'deportation',\n",
710 " 'excoriation',\n",
711 " 'exhortation',\n",
712 " 'exportation',\n",
713 " 'importation',\n",
714 " 'information',\n",
715 " 'liposuction',\n",
716 " 'negotiation',\n",
717 " 'recognition',\n",
718 " 'recondition',\n",
719 " 'reformation',\n",
720 " 'subornation']"
721 ]
722 }
723 ],
724 "prompt_number": 59
725 },
726 {
727 "cell_type": "code",
728 "collapsed": false,
729 "input": [
730 "p.guess(['_', '_', 'c', 'o', '_', '_', '_', '_', '_', 'o', '_'], [], 10)"
731 ],
732 "language": "python",
733 "metadata": {},
734 "outputs": [
735 {
736 "metadata": {},
737 "output_type": "pyout",
738 "prompt_number": 60,
739 "text": [
740 "'a'"
741 ]
742 }
743 ],
744 "prompt_number": 60
745 },
746 {
747 "cell_type": "code",
748 "collapsed": false,
749 "input": [
750 "p.candidate_words"
751 ],
752 "language": "python",
753 "metadata": {},
754 "outputs": [
755 {
756 "metadata": {},
757 "output_type": "pyout",
758 "prompt_number": 61,
759 "text": [
760 "['excoriation', 'recognition', 'recondition']"
761 ]
762 }
763 ],
764 "prompt_number": 61
765 },
766 {
767 "cell_type": "code",
768 "collapsed": false,
769 "input": [
770 "p.guess(['_', '_', 'c', 'o', '_', '_', '_', '_', '_', 'o', '_'], ['a'], 9)"
771 ],
772 "language": "python",
773 "metadata": {},
774 "outputs": [
775 {
776 "metadata": {},
777 "output_type": "pyout",
778 "prompt_number": 62,
779 "text": [
780 "'d'"
781 ]
782 }
783 ],
784 "prompt_number": 62
785 },
786 {
787 "cell_type": "code",
788 "collapsed": false,
789 "input": [
790 "p.candidate_words"
791 ],
792 "language": "python",
793 "metadata": {},
794 "outputs": [
795 {
796 "metadata": {},
797 "output_type": "pyout",
798 "prompt_number": 63,
799 "text": [
800 "['recognition', 'recondition']"
801 ]
802 }
803 ],
804 "prompt_number": 63
805 },
806 {
807 "cell_type": "code",
808 "collapsed": false,
809 "input": [
810 "p.guess(['_', '_', 'c', 'o', '_', '_', '_', '_', '_', 'o', '_'], ['a', 'd'], 8)"
811 ],
812 "language": "python",
813 "metadata": {},
814 "outputs": [
815 {
816 "metadata": {},
817 "output_type": "pyout",
818 "prompt_number": 64,
819 "text": [
820 "'r'"
821 ]
822 }
823 ],
824 "prompt_number": 64
825 },
826 {
827 "cell_type": "code",
828 "collapsed": false,
829 "input": [
830 "p.candidate_words"
831 ],
832 "language": "python",
833 "metadata": {},
834 "outputs": [
835 {
836 "metadata": {},
837 "output_type": "pyout",
838 "prompt_number": 65,
839 "text": [
840 "['recognition']"
841 ]
842 }
843 ],
844 "prompt_number": 65
845 },
846 {
847 "cell_type": "code",
848 "collapsed": false,
849 "input": [
850 "g = Game('recognition', player=PlayerAdaptiveSplit(WORDS))\n",
851 "g.play_game()"
852 ],
853 "language": "python",
854 "metadata": {},
855 "outputs": [
856 {
857 "metadata": {},
858 "output_type": "pyout",
859 "prompt_number": 67,
860 "text": [
861 "True"
862 ]
863 }
864 ],
865 "prompt_number": 67
866 },
867 {
868 "cell_type": "code",
869 "collapsed": false,
870 "input": [
871 "g.discovered"
872 ],
873 "language": "python",
874 "metadata": {},
875 "outputs": [
876 {
877 "metadata": {},
878 "output_type": "pyout",
879 "prompt_number": 68,
880 "text": [
881 "['r', 'e', 'c', 'o', 'g', 'n', 'i', 't', 'i', 'o', 'n']"
882 ]
883 }
884 ],
885 "prompt_number": 68
886 },
887 {
888 "cell_type": "code",
889 "collapsed": false,
890 "input": [
891 "g.lives"
892 ],
893 "language": "python",
894 "metadata": {},
895 "outputs": [
896 {
897 "metadata": {},
898 "output_type": "pyout",
899 "prompt_number": 69,
900 "text": [
901 "8"
902 ]
903 }
904 ],
905 "prompt_number": 69
906 },
907 {
908 "cell_type": "code",
909 "collapsed": false,
910 "input": [
911 "%%timeit\n",
912 "\n",
913 "wins = 0\n",
914 "for _ in range(10000):\n",
915 " g = Game(random.choice(WORDS), player=PlayerAdaptiveSplit(WORDS))\n",
916 " g.play_game()\n",
917 " if g.game_won:\n",
918 " wins += 1\n",
919 "print(wins)"
920 ],
921 "language": "python",
922 "metadata": {},
923 "outputs": [
924 {
925 "output_type": "stream",
926 "stream": "stdout",
927 "text": [
928 "9857\n",
929 "9862"
930 ]
931 },
932 {
933 "output_type": "stream",
934 "stream": "stdout",
935 "text": [
936 "\n",
937 "9844"
938 ]
939 },
940 {
941 "output_type": "stream",
942 "stream": "stdout",
943 "text": [
944 "\n",
945 "9860"
946 ]
947 },
948 {
949 "output_type": "stream",
950 "stream": "stdout",
951 "text": [
952 "\n",
953 "1 loops, best of 3: 9min 15s per loop\n"
954 ]
955 }
956 ],
957 "prompt_number": 79
958 },
959 {
960 "cell_type": "code",
961 "collapsed": false,
962 "input": [
963 "%%timeit\n",
964 "\n",
965 "wins = 0\n",
966 "for _ in range(10000):\n",
967 " g = Game(random.choice(WORDS), player=PlayerAdaptivePatternNoRegex(WORDS))\n",
968 " g.play_game()\n",
969 " if g.game_won:\n",
970 " wins += 1\n",
971 "print(wins)"
972 ],
973 "language": "python",
974 "metadata": {},
975 "outputs": [
976 {
977 "output_type": "stream",
978 "stream": "stdout",
979 "text": [
980 "9934\n",
981 "9916"
982 ]
983 },
984 {
985 "output_type": "stream",
986 "stream": "stdout",
987 "text": [
988 "\n",
989 "9921"
990 ]
991 },
992 {
993 "output_type": "stream",
994 "stream": "stdout",
995 "text": [
996 "\n",
997 "9932"
998 ]
999 },
1000 {
1001 "output_type": "stream",
1002 "stream": "stdout",
1003 "text": [
1004 "\n",
1005 "1 loops, best of 3: 8min 12s per loop\n"
1006 ]
1007 }
1008 ],
1009 "prompt_number": 81
1010 },
1011 {
1012 "cell_type": "code",
1013 "collapsed": false,
1014 "input": [
1015 "for w in random.sample(WORDS, 5000):\n",
1016 " gp = Game(w, player=PlayerAdaptivePatternNoRegex(WORDS))\n",
1017 " gp.play_game()\n",
1018 " gs = Game(w, player=PlayerAdaptiveSplit(WORDS))\n",
1019 " gs.play_game()\n",
1020 " if not gp.game_won and not gs.game_won:\n",
1021 " print('Both:::::', gp.target, 'Pattern:', '[' + ' '.join(gp.discovered) + ']', ''.join(gp.wrong_letters), \n",
1022 " ':: Split:', '[' + ' '.join(gs.discovered) + ']', ''.join(gs.wrong_letters))\n",
1023 " if not gp.game_won and gs.game_won:\n",
1024 " print('Pattern::', gp.target, '[' + ' '.join(gp.discovered) + ']', ''.join(gp.wrong_letters))\n",
1025 " if gp.game_won and not gs.game_won:\n",
1026 " print('Split::::', gs.target, '[' + ' '.join(gs.discovered) + ']', ''.join(gs.wrong_letters))"
1027 ],
1028 "language": "python",
1029 "metadata": {},
1030 "outputs": [
1031 {
1032 "output_type": "stream",
1033 "stream": "stdout",
1034 "text": [
1035 "Split:::: cut [_ _ t] aoeiybgnpj\n",
1036 "Split::::"
1037 ]
1038 },
1039 {
1040 "output_type": "stream",
1041 "stream": "stdout",
1042 "text": [
1043 " reviewers [_ _ _ _ _ _ _ _ _] taoldgnupc\n",
1044 "Split::::"
1045 ]
1046 },
1047 {
1048 "output_type": "stream",
1049 "stream": "stdout",
1050 "text": [
1051 " piped [_ i _ e d] saolrnkvbm\n",
1052 "Both:::::"
1053 ]
1054 },
1055 {
1056 "output_type": "stream",
1057 "stream": "stdout",
1058 "text": [
1059 " joying Pattern: [_ o _ i n g] esapwdtrkm :: Split: [_ o _ _ n _] srdatpwhvk\n",
1060 "Both:::::"
1061 ]
1062 },
1063 {
1064 "output_type": "stream",
1065 "stream": "stdout",
1066 "text": [
1067 " duck Pattern: [_ u _ _] esoailfrnm :: Split: [_ u _ _] esaorlnfmt\n",
1068 "Split::::"
1069 ]
1070 },
1071 {
1072 "output_type": "stream",
1073 "stream": "stdout",
1074 "text": [
1075 " bum [b _ _] aoeiyrtgns\n",
1076 "Pattern::"
1077 ]
1078 },
1079 {
1080 "output_type": "stream",
1081 "stream": "stdout",
1082 "text": [
1083 " jibing [_ i _ i n g] esrldmpkvt\n",
1084 "Split::::"
1085 ]
1086 },
1087 {
1088 "output_type": "stream",
1089 "stream": "stdout",
1090 "text": [
1091 " begged [_ _ _ _ _ d] srlnoauipt\n",
1092 "Pattern::"
1093 ]
1094 },
1095 {
1096 "output_type": "stream",
1097 "stream": "stdout",
1098 "text": [
1099 " bucked [b u _ _ e d] aoilstfgpr\n",
1100 "Pattern::"
1101 ]
1102 },
1103 {
1104 "output_type": "stream",
1105 "stream": "stdout",
1106 "text": [
1107 " bunk [_ u n k] esoailfrgp\n",
1108 "Split::::"
1109 ]
1110 },
1111 {
1112 "output_type": "stream",
1113 "stream": "stdout",
1114 "text": [
1115 " dumping [_ u _ p _ _ g] srlaoecjhb\n",
1116 "Split::::"
1117 ]
1118 },
1119 {
1120 "output_type": "stream",
1121 "stream": "stdout",
1122 "text": [
1123 " meekest [_ _ _ _ _ s _] iaournlpdw\n",
1124 "Pattern::"
1125 ]
1126 },
1127 {
1128 "output_type": "stream",
1129 "stream": "stdout",
1130 "text": [
1131 " wove [_ o v e] arnldptkmc\n",
1132 "Split::::"
1133 ]
1134 },
1135 {
1136 "output_type": "stream",
1137 "stream": "stdout",
1138 "text": [
1139 " finking [_ _ _ _ _ _ g] srlaoeutpd\n",
1140 "Both:::::"
1141 ]
1142 },
1143 {
1144 "output_type": "stream",
1145 "stream": "stdout",
1146 "text": [
1147 " fan Pattern: [_ a _] tpgwdmrbys :: Split: [_ a n] tpgwmbyrdv\n",
1148 "Pattern::"
1149 ]
1150 },
1151 {
1152 "output_type": "stream",
1153 "stream": "stdout",
1154 "text": [
1155 " hug [_ u g] aoeibpdmtj\n",
1156 "Split::::"
1157 ]
1158 },
1159 {
1160 "output_type": "stream",
1161 "stream": "stdout",
1162 "text": [
1163 " feminism [_ _ _ _ _ _ _ _] ratlogdcuh\n",
1164 "Split::::"
1165 ]
1166 },
1167 {
1168 "output_type": "stream",
1169 "stream": "stdout",
1170 "text": [
1171 " effect [_ _ _ _ c t] srdnaioulp\n",
1172 "Split::::"
1173 ]
1174 },
1175 {
1176 "output_type": "stream",
1177 "stream": "stdout",
1178 "text": [
1179 " puff [_ u f f] esaorlnmgc\n",
1180 "Split::::"
1181 ]
1182 },
1183 {
1184 "output_type": "stream",
1185 "stream": "stdout",
1186 "text": [
1187 " skivvies [_ _ _ _ _ _ _ _] ratlogdcuh\n",
1188 "Split::::"
1189 ]
1190 },
1191 {
1192 "output_type": "stream",
1193 "stream": "stdout",
1194 "text": [
1195 " miffing [_ _ _ _ _ _ g] srlaoeutpd\n",
1196 "Both:::::"
1197 ]
1198 },
1199 {
1200 "output_type": "stream",
1201 "stream": "stdout",
1202 "text": [
1203 " dung Pattern: [_ u n _] esoailfrkt :: Split: [_ u n g] esaorlkthb\n",
1204 "Pattern::"
1205 ]
1206 },
1207 {
1208 "output_type": "stream",
1209 "stream": "stdout",
1210 "text": [
1211 " gibed [_ i _ e d] saomlprkvn\n",
1212 "Pattern::"
1213 ]
1214 },
1215 {
1216 "output_type": "stream",
1217 "stream": "stdout",
1218 "text": [
1219 " rubs [_ u b s] eaoicpdtnh\n",
1220 "Pattern::"
1221 ]
1222 },
1223 {
1224 "output_type": "stream",
1225 "stream": "stdout",
1226 "text": [
1227 " bat [_ a t] ecpsofmvhr\n",
1228 "Split::::"
1229 ]
1230 },
1231 {
1232 "output_type": "stream",
1233 "stream": "stdout",
1234 "text": [
1235 " boobs [_ o o _ s] eatdklmpfn\n",
1236 "Both:::::"
1237 ]
1238 },
1239 {
1240 "output_type": "stream",
1241 "stream": "stdout",
1242 "text": [
1243 " yon Pattern: [_ o n] atbdwpiecs :: Split: [_ o n] atbdwpiesc\n",
1244 "Both:::::"
1245 ]
1246 },
1247 {
1248 "output_type": "stream",
1249 "stream": "stdout",
1250 "text": [
1251 " firs Pattern: [f i _ s] eaoptgbdmn :: Split: [_ i _ s] eaotpgbdmn\n",
1252 "Split::::"
1253 ]
1254 },
1255 {
1256 "output_type": "stream",
1257 "stream": "stdout",
1258 "text": [
1259 " quipping [_ _ _ _ _ _ _ g] ratloscedh\n",
1260 "Split::::"
1261 ]
1262 },
1263 {
1264 "output_type": "stream",
1265 "stream": "stdout",
1266 "text": [
1267 " ragging [r a _ _ _ n _] seotzclpdm\n",
1268 "Split::::"
1269 ]
1270 },
1271 {
1272 "output_type": "stream",
1273 "stream": "stdout",
1274 "text": [
1275 " fuddled [_ u _ _ l _ _] sraoibzmgc\n",
1276 "Both:::::"
1277 ]
1278 },
1279 {
1280 "output_type": "stream",
1281 "stream": "stdout",
1282 "text": [
1283 " yack Pattern: [_ a c k] esolrntmpj :: Split: [_ a c k] esrlntmjhb\n",
1284 "Split::::"
1285 ]
1286 },
1287 {
1288 "output_type": "stream",
1289 "stream": "stdout",
1290 "text": [
1291 " vanning [_ a _ _ _ _ g] srltpbwmck\n",
1292 "Split::::"
1293 ]
1294 },
1295 {
1296 "output_type": "stream",
1297 "stream": "stdout",
1298 "text": [
1299 " fizziest [_ _ _ _ _ _ _ t] rauonlphdk\n",
1300 "Pattern::"
1301 ]
1302 },
1303 {
1304 "output_type": "stream",
1305 "stream": "stdout",
1306 "text": [
1307 " rug [_ u g] aoeibpdmtj\n",
1308 "Both:::::"
1309 ]
1310 },
1311 {
1312 "output_type": "stream",
1313 "stream": "stdout",
1314 "text": [
1315 " fixed Pattern: [_ i _ e d] saomlprkvn :: Split: [_ i _ e d] saolrnkvbm\n",
1316 "Split::::"
1317 ]
1318 },
1319 {
1320 "output_type": "stream",
1321 "stream": "stdout",
1322 "text": [
1323 " mop [_ o p] atbdwchlsf\n",
1324 "Split::::"
1325 ]
1326 },
1327 {
1328 "output_type": "stream",
1329 "stream": "stdout",
1330 "text": [
1331 " separatists [_ _ p _ _ _ _ _ _ _ _] oldcgnymbx\n",
1332 "Split::::"
1333 ]
1334 },
1335 {
1336 "output_type": "stream",
1337 "stream": "stdout",
1338 "text": [
1339 " miff [_ _ _ _] esaoutnlrc\n",
1340 "Pattern::"
1341 ]
1342 },
1343 {
1344 "output_type": "stream",
1345 "stream": "stdout",
1346 "text": [
1347 " putty [p u _ _ y] seaoimlnrf\n",
1348 "Split::::"
1349 ]
1350 },
1351 {
1352 "output_type": "stream",
1353 "stream": "stdout",
1354 "text": [
1355 " mice [_ i _ e] aorlnvtdkw\n",
1356 "Both:::::"
1357 ]
1358 },
1359 {
1360 "output_type": "stream",
1361 "stream": "stdout",
1362 "text": [
1363 " fixing Pattern: [_ i _ i n g] esrldmpkvt :: Split: [_ _ _ _ n _] srdaoeulbp\n",
1364 "Split::::"
1365 ]
1366 },
1367 {
1368 "output_type": "stream",
1369 "stream": "stdout",
1370 "text": [
1371 " gaged [_ a _ e d] srwctpmzbh\n",
1372 "Split::::"
1373 ]
1374 },
1375 {
1376 "output_type": "stream",
1377 "stream": "stdout",
1378 "text": [
1379 " fag [_ a g] tpjnhrlbsw\n",
1380 "Split::::"
1381 ]
1382 },
1383 {
1384 "output_type": "stream",
1385 "stream": "stdout",
1386 "text": [
1387 " woeful [_ o _ _ _ _] srdnaictyb\n",
1388 "Split::::"
1389 ]
1390 },
1391 {
1392 "output_type": "stream",
1393 "stream": "stdout",
1394 "text": [
1395 " pauper [_ a _ _ _ r] sntlmidkvj\n",
1396 "Both:::::"
1397 ]
1398 },
1399 {
1400 "output_type": "stream",
1401 "stream": "stdout",
1402 "text": [
1403 " faxing Pattern: [f a _ i n g] esrwtlcdkz :: Split: [_ a _ _ n _] srdtwmpczh\n",
1404 "Both:::::"
1405 ]
1406 },
1407 {
1408 "output_type": "stream",
1409 "stream": "stdout",
1410 "text": [
1411 " yoking Pattern: [_ o k i n g] esapwdtrcj :: Split: [_ o k _ n _] srdatpwhvj\n",
1412 "Both:::::"
1413 ]
1414 },
1415 {
1416 "output_type": "stream",
1417 "stream": "stdout",
1418 "text": [
1419 " cox Pattern: [_ o _] atbdwpnsge :: Split: [_ o _] atbdwpngse\n",
1420 "Split::::"
1421 ]
1422 },
1423 {
1424 "output_type": "stream",
1425 "stream": "stdout",
1426 "text": [
1427 " doff [_ o _ _] esalrnctyb\n",
1428 "Both:::::"
1429 ]
1430 },
1431 {
1432 "output_type": "stream",
1433 "stream": "stdout",
1434 "text": [
1435 " puck Pattern: [_ u _ _] esoailfrnm :: Split: [_ u _ _] esaorlnfmt\n",
1436 "Pattern::"
1437 ]
1438 },
1439 {
1440 "output_type": "stream",
1441 "stream": "stdout",
1442 "text": [
1443 " tuck [_ u _ _] esoailfrnm\n",
1444 "Split::::"
1445 ]
1446 },
1447 {
1448 "output_type": "stream",
1449 "stream": "stdout",
1450 "text": [
1451 " kerchiefs [_ _ _ c _ _ _ _ _] taoldgnupv\n",
1452 "Split::::"
1453 ]
1454 },
1455 {
1456 "output_type": "stream",
1457 "stream": "stdout",
1458 "text": [
1459 " members [_ _ _ _ _ r s] aoiutdpcgv\n",
1460 "Both:::::"
1461 ]
1462 },
1463 {
1464 "output_type": "stream",
1465 "stream": "stdout",
1466 "text": [
1467 " foxing Pattern: [_ o _ i n g] esapwdtrkm :: Split: [_ o _ _ n _] srdatpwhvk\n",
1468 "Split::::"
1469 ]
1470 },
1471 {
1472 "output_type": "stream",
1473 "stream": "stdout",
1474 "text": [
1475 " anaesthetises [_ _ _ _ _ _ _ _ _ _ _ _ _] clgmpdvuro\n",
1476 "Split::::"
1477 ]
1478 },
1479 {
1480 "output_type": "stream",
1481 "stream": "stdout",
1482 "text": [
1483 " versifies [_ _ _ _ _ _ _ _ _] taoldgnupc\n",
1484 "Both:::::"
1485 ]
1486 },
1487 {
1488 "output_type": "stream",
1489 "stream": "stdout",
1490 "text": [
1491 " babes Pattern: [_ a _ e s] rltngcdkzv :: Split: [_ a _ e s] rltngcdkzv\n",
1492 "Split::::"
1493 ]
1494 },
1495 {
1496 "output_type": "stream",
1497 "stream": "stdout",
1498 "text": [
1499 " huffing [_ u f f _ _ g] srlaoecpbm\n",
1500 "Split::::"
1501 ]
1502 },
1503 {
1504 "output_type": "stream",
1505 "stream": "stdout",
1506 "text": [
1507 " weeper [_ _ _ p _ r] saioutdhbk\n",
1508 "Split::::"
1509 ]
1510 },
1511 {
1512 "output_type": "stream",
1513 "stream": "stdout",
1514 "text": [
1515 " buffering [_ u _ _ _ _ _ _ g] taoldsphmv\n",
1516 "Split::::"
1517 ]
1518 },
1519 {
1520 "output_type": "stream",
1521 "stream": "stdout",
1522 "text": [
1523 " dills [_ _ l l s] eaountghrb\n",
1524 "Split::::"
1525 ]
1526 },
1527 {
1528 "output_type": "stream",
1529 "stream": "stdout",
1530 "text": [
1531 " wigging [_ _ g g _ _ g] srlaouejpd\n",
1532 "Split::::"
1533 ]
1534 },
1535 {
1536 "output_type": "stream",
1537 "stream": "stdout",
1538 "text": [
1539 " indenting [_ _ d _ _ t _ _ _] aoscrlbvhf\n",
1540 "Split::::"
1541 ]
1542 },
1543 {
1544 "output_type": "stream",
1545 "stream": "stdout",
1546 "text": [
1547 " morn [_ o r n] esaltchbpw\n",
1548 "Both:::::"
1549 ]
1550 },
1551 {
1552 "output_type": "stream",
1553 "stream": "stdout",
1554 "text": [
1555 " buff Pattern: [_ u f f] esoailgcpd :: Split: [_ u f f] esaorlnmgc\n",
1556 "Split::::"
1557 ]
1558 },
1559 {
1560 "output_type": "stream",
1561 "stream": "stdout",
1562 "text": [
1563 " zero [_ e r _] satlbnhpyg\n",
1564 "Both:::::"
1565 ]
1566 },
1567 {
1568 "output_type": "stream",
1569 "stream": "stdout",
1570 "text": [
1571 " jazz Pattern: [_ a _ _] esolrntmky :: Split: [_ a _ _] esrlntmkdw\n",
1572 "Split::::"
1573 ]
1574 },
1575 {
1576 "output_type": "stream",
1577 "stream": "stdout",
1578 "text": [
1579 " k [_] geopdtuyiz\n",
1580 "Split::::"
1581 ]
1582 },
1583 {
1584 "output_type": "stream",
1585 "stream": "stdout",
1586 "text": [
1587 " find [_ _ n d] esaoutkhrb\n",
1588 "Split::::"
1589 ]
1590 },
1591 {
1592 "output_type": "stream",
1593 "stream": "stdout",
1594 "text": [
1595 " happy [_ a _ _ y] sentdrglcz\n",
1596 "Split::::"
1597 ]
1598 },
1599 {
1600 "output_type": "stream",
1601 "stream": "stdout",
1602 "text": [
1603 " fibbing [_ _ _ _ _ _ g] srlaoeutpd\n",
1604 "Split::::"
1605 ]
1606 },
1607 {
1608 "output_type": "stream",
1609 "stream": "stdout",
1610 "text": [
1611 " wifeliest [_ _ _ _ _ _ _ _ t] nroacmhpgu\n",
1612 "Both:::::"
1613 ]
1614 },
1615 {
1616 "output_type": "stream",
1617 "stream": "stdout",
1618 "text": [
1619 " r Pattern: [_] giecposdwk :: Split: [_] geopdtuyiz\n",
1620 "Split::::"
1621 ]
1622 },
1623 {
1624 "output_type": "stream",
1625 "stream": "stdout",
1626 "text": [
1627 " businesses [_ _ _ _ n _ _ _ _ _] olatdgcphr\n",
1628 "Both:::::"
1629 ]
1630 },
1631 {
1632 "output_type": "stream",
1633 "stream": "stdout",
1634 "text": [
1635 " fife Pattern: [_ i _ e] aorlndvtpm :: Split: [_ i _ e] aorlnvtdkw\n",
1636 "Both:::::"
1637 ]
1638 },
1639 {
1640 "output_type": "stream",
1641 "stream": "stdout",
1642 "text": [
1643 " fix Pattern: [_ i _] aoeptdngsb :: Split: [_ i _] aoetndpgbs\n",
1644 "Both:::::"
1645 ]
1646 },
1647 {
1648 "output_type": "stream",
1649 "stream": "stdout",
1650 "text": [
1651 " mil Pattern: [_ i _] aoeptdngsb :: Split: [_ i _] aoetndpgbs\n",
1652 "Split::::"
1653 ]
1654 },
1655 {
1656 "output_type": "stream",
1657 "stream": "stdout",
1658 "text": [
1659 " wetted [_ _ t t _ d] srlnoauipj\n"
1660 ]
1661 }
1662 ],
1663 "prompt_number": 90
1664 },
1665 {
1666 "cell_type": "code",
1667 "collapsed": false,
1668 "input": [
1669 "gs = Game('businesses', player=PlayerAdaptiveSplit(WORDS))"
1670 ],
1671 "language": "python",
1672 "metadata": {},
1673 "outputs": [],
1674 "prompt_number": 91
1675 },
1676 {
1677 "cell_type": "code",
1678 "collapsed": false,
1679 "input": [
1680 "g = Game('feminism', player=PlayerAdaptiveSplit(WORDS))\n",
1681 "while not g.game_finished:\n",
1682 " guess = g.player.guess(g.discovered, g.wrong_letters, g.lives)\n",
1683 " print(g.target, '(' + str(g.lives) + ')', \n",
1684 " '[' + ' '.join(g.discovered) + ']', ''.join(g.wrong_letters), \n",
1685 " ';', len(g.player.candidate_words), 'candidate words')\n",
1686 " print('Guess = ', guess)\n",
1687 " g.do_turn()"
1688 ],
1689 "language": "python",
1690 "metadata": {},
1691 "outputs": [
1692 {
1693 "output_type": "stream",
1694 "stream": "stdout",
1695 "text": [
1696 "feminism (10) [_ _ _ _ _ _ _ _] ; 10328 candidate words\n",
1697 "Guess = r\n",
1698 "feminism"
1699 ]
1700 },
1701 {
1702 "output_type": "stream",
1703 "stream": "stdout",
1704 "text": [
1705 " (9) [_ _ _ _ _ _ _ _] r ; 5102 candidate words\n",
1706 "Guess = a\n",
1707 "feminism (8) [_ _ _ _ _ _ _ _] ra ; 2673 candidate words\n",
1708 "Guess = t\n",
1709 "feminism"
1710 ]
1711 },
1712 {
1713 "output_type": "stream",
1714 "stream": "stdout",
1715 "text": [
1716 " (7) [_ _ _ _ _ _ _ _] rat ; 1466 candidate words\n",
1717 "Guess = l\n",
1718 "feminism (6) [_ _ _ _ _ _ _ _] ratl ; 704 candidate words\n",
1719 "Guess = o\n",
1720 "feminism (5) [_ _ _ _ _ _ _ _] ratlo ; 359 candidate words\n",
1721 "Guess = g\n",
1722 "feminism (4) [_ _ _ _ _ _ _ _] ratlog ; 189 candidate words\n",
1723 "Guess = d\n",
1724 "feminism (3) [_ _ _ _ _ _ _ _] ratlogd ; 94 candidate words\n",
1725 "Guess = c\n",
1726 "feminism (2) [_ _ _ _ _ _ _ _] ratlogdc ; 50 candidate words\n",
1727 "Guess = u\n",
1728 "feminism (1) [_ _ _ _ _ _ _ _] ratlogdcu ; 31 candidate words\n",
1729 "Guess = h\n"
1730 ]
1731 }
1732 ],
1733 "prompt_number": 170
1734 },
1735 {
1736 "cell_type": "code",
1737 "collapsed": false,
1738 "input": [
1739 "g = Game('feminism', player=PlayerAdaptivePatternNoRegex(WORDS))\n",
1740 "while not g.game_finished:\n",
1741 " guess = g.player.guess(g.discovered, g.wrong_letters, g.lives)\n",
1742 " print(g.target, '(' + str(g.lives) + ')', \n",
1743 " '[' + ' '.join(g.discovered) + ']', ''.join(g.wrong_letters), \n",
1744 " ';', len(g.player.candidate_words), 'candidate words')\n",
1745 " print('Guess = ', guess)\n",
1746 " g.do_turn()"
1747 ],
1748 "language": "python",
1749 "metadata": {},
1750 "outputs": [
1751 {
1752 "output_type": "stream",
1753 "stream": "stdout",
1754 "text": [
1755 "feminism (10) [_ _ _ _ _ _ _ _] ; 10328 candidate words\n",
1756 "Guess = e\n",
1757 "feminism"
1758 ]
1759 },
1760 {
1761 "output_type": "stream",
1762 "stream": "stdout",
1763 "text": [
1764 " (10) [_ e _ _ _ _ _ _] ; 540 candidate words\n",
1765 "Guess = i\n",
1766 "feminism (10) [_ e _ i _ i _ _] ; 42 candidate words\n",
1767 "Guess = n\n",
1768 "feminism (10) [_ e _ i n i _ _] ; 3 candidate words\n",
1769 "Guess = s\n",
1770 "feminism (10) [_ e _ i n i s _] ; 3 candidate words\n",
1771 "Guess = f\n",
1772 "feminism (10) [f e _ i n i s _] ; 2 candidate words\n",
1773 "Guess = m\n"
1774 ]
1775 }
1776 ],
1777 "prompt_number": 172
1778 },
1779 {
1780 "cell_type": "code",
1781 "collapsed": false,
1782 "input": [
1783 "g.player.candidate_words"
1784 ],
1785 "language": "python",
1786 "metadata": {},
1787 "outputs": [
1788 {
1789 "metadata": {},
1790 "output_type": "pyout",
1791 "prompt_number": 171,
1792 "text": [
1793 "['beehives',\n",
1794 " 'enmeshes',\n",
1795 " 'evenness',\n",
1796 " 'expenses',\n",
1797 " 'feminine',\n",
1798 " 'feminism',\n",
1799 " 'fineness',\n",
1800 " 'finesses',\n",
1801 " 'finishes',\n",
1802 " 'fishwife',\n",
1803 " 'inkiness',\n",
1804 " 'keenness',\n",
1805 " 'meekness',\n",
1806 " 'minibike',\n",
1807 " 'minimise',\n",
1808 " 'missives',\n",
1809 " 'ninepins',\n",
1810 " 'penknife',\n",
1811 " 'sexiness',\n",
1812 " 'sheepish',\n",
1813 " 'shimmies',\n",
1814 " 'shinnies',\n",
1815 " 'skivvies',\n",
1816 " 'sphinxes',\n",
1817 " 'vivifies',\n",
1818 " 'vixenish',\n",
1819 " 'whimseys',\n",
1820 " 'whimsies',\n",
1821 " 'whinnies',\n",
1822 " 'whiskeys',\n",
1823 " 'whiskies']"
1824 ]
1825 }
1826 ],
1827 "prompt_number": 171
1828 },
1829 {
1830 "cell_type": "code",
1831 "collapsed": false,
1832 "input": [],
1833 "language": "python",
1834 "metadata": {},
1835 "outputs": []
1836 }
1837 ],
1838 "metadata": {}
1839 }
1840 ]
1841 }