+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "class PlayerAdaptiveNoRegex:\n",
+ " def __init__(self, words):\n",
+ " self.candidate_words = words\n",
+ " \n",
+ " def guess(self, discovered, missed, lives):\n",
+ " self.filter_candidate_words(discovered, missed)\n",
+ " self.set_ordered_letters()\n",
+ " guessed_letters = [l.lower() for l in discovered + missed if l in string.ascii_letters]\n",
+ " return [l for l in self.ordered_letters if l not in guessed_letters][0]\n",
+ " \n",
+ " def filter_candidate_words(self, discovered, missed):\n",
+ " pass\n",
+ " \n",
+ " def set_ordered_letters(self):\n",
+ " counts = collections.Counter(l.lower() \n",
+ " for l in ''.join(self.candidate_words) + string.ascii_lowercase \n",
+ " if l in string.ascii_letters)\n",
+ " self.ordered_letters = [p[0] for p in counts.most_common()]\n",
+ "\n",
+ " def match(self, pattern, target, excluded=None):\n",
+ " if not excluded:\n",
+ " excluded = ''\n",
+ " if len(pattern) != len(target):\n",
+ " return False\n",
+ " for m, c in zip(pattern, target):\n",
+ " if m == '_' and c not in excluded:\n",
+ " # true\n",
+ " pass\n",
+ " elif m != '_' and m == c:\n",
+ " # true\n",
+ " pass\n",
+ " else:\n",
+ " return False\n",
+ " return True "
+ ],
+ "language": "python",
+ "metadata": {},
+ "outputs": [],
+ "prompt_number": 59
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "class PlayerAdaptiveLengthNoRegex(PlayerAdaptiveNoRegex):\n",
+ " def __init__(self, words):\n",
+ " super().__init__(words)\n",
+ " self.word_len = None\n",
+ " self.ordered_letters = None\n",
+ " \n",
+ " def filter_candidate_words(self, discovered, missed):\n",
+ " if not self.word_len:\n",
+ " self.word_len = len(discovered)\n",
+ " self.candidate_words = [w for w in self.candidate_words if len(w) == self.word_len]\n",
+ " \n",
+ " def set_ordered_letters(self):\n",
+ " if not self.ordered_letters:\n",
+ " super().set_ordered_letters()"
+ ],
+ "language": "python",
+ "metadata": {},
+ "outputs": [],
+ "prompt_number": 60
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "class PlayerAdaptiveIncludedLettersNoRegex(PlayerAdaptiveNoRegex):\n",
+ " def filter_candidate_words(self, discovered, missed):\n",
+ " self.candidate_words = [w for w in self.candidate_words if self.match(discovered, w)]"
+ ],
+ "language": "python",
+ "metadata": {},
+ "outputs": [],
+ "prompt_number": 61
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "class PlayerAdaptiveExcludedLettersNoRegex(PlayerAdaptiveNoRegex):\n",
+ " def filter_candidate_words(self, discovered, missed):\n",
+ " if missed:\n",
+ " empty_target = '_' * len(discovered)\n",
+ " self.candidate_words = [w for w in self.candidate_words if self.match(empty_target, w, missed)] "
+ ],
+ "language": "python",
+ "metadata": {},
+ "outputs": [],
+ "prompt_number": 66
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "class PlayerAdaptivePatternNoRegex(PlayerAdaptiveNoRegex):\n",
+ " def filter_candidate_words(self, discovered, missed):\n",
+ " attempted_letters = [l for l in discovered if l != '_'] + missed\n",
+ " self.candidate_words = [w for w in self.candidate_words if self.match(discovered, w, attempted_letters)]"
+ ],
+ "language": "python",
+ "metadata": {},
+ "outputs": [],
+ "prompt_number": 67
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "%%timeit\n",
+ "\n",
+ "wins = 0\n",
+ "for _ in range(1000):\n",
+ " g = Game(random.choice(WORDS), player=PlayerAdaptiveLengthNoRegex(WORDS))\n",
+ " g.play_game()\n",
+ " if g.game_won:\n",
+ " wins += 1\n",
+ "print(wins)"
+ ],
+ "language": "python",
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "471\n",
+ "492"
+ ]
+ },
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "\n",
+ "502"
+ ]
+ },
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "\n",
+ "469"
+ ]
+ },
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "\n",
+ "1 loops, best of 3: 16 s per loop\n"
+ ]
+ }
+ ],
+ "prompt_number": 69
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "%%timeit\n",
+ "\n",
+ "wins = 0\n",
+ "for _ in range(1000):\n",
+ " g = Game(random.choice(WORDS), player=PlayerAdaptiveIncludedLettersNoRegex(WORDS))\n",
+ " g.play_game()\n",
+ " if g.game_won:\n",
+ " wins += 1\n",
+ "print(wins)"
+ ],
+ "language": "python",
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "978\n",
+ "979"
+ ]
+ },
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "\n",
+ "983"
+ ]
+ },
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "\n",
+ "979"
+ ]
+ },
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "\n",
+ "1 loops, best of 3: 48 s per loop\n"
+ ]
+ }
+ ],
+ "prompt_number": 70
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "%%timeit\n",
+ "\n",
+ "wins = 0\n",
+ "for _ in range(1000):\n",
+ " g = Game(random.choice(WORDS), player=PlayerAdaptiveExcludedLettersNoRegex(WORDS))\n",
+ " g.play_game()\n",
+ " if g.game_won:\n",
+ " wins += 1\n",
+ "print(wins)"
+ ],
+ "language": "python",
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "582\n",
+ "595"
+ ]
+ },
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "\n",
+ "587"
+ ]
+ },
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "\n",
+ "611"
+ ]
+ },
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "\n",
+ "1 loops, best of 3: 4min 59s per loop\n"
+ ]
+ }
+ ],
+ "prompt_number": 71
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "%%timeit\n",
+ "\n",
+ "wins = 0\n",
+ "for _ in range(1000):\n",
+ " g = Game(random.choice(WORDS), player=PlayerAdaptivePatternNoRegex(WORDS))\n",
+ " g.play_game()\n",
+ " if g.game_won:\n",
+ " wins += 1\n",
+ "print(wins)"
+ ],
+ "language": "python",
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "991\n",
+ "992"
+ ]
+ },
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "\n",
+ "993"
+ ]
+ },
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "\n",
+ "994"
+ ]
+ },
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "\n",
+ "1 loops, best of 3: 37.9 s per loop\n"
+ ]
+ }
+ ],
+ "prompt_number": 72
+ },