Finished the text
[cas-master-teacher-training.git] / hangman / 02-hangman-guesser.ipynb
index 8f482b1852f8f02f3f9f8cbf6bcb4268afa69f0a..66f3b491cd05243aadde8b3aefea25bcf8769bd3 100644 (file)
@@ -1,7 +1,7 @@
 {
  "metadata": {
   "name": "",
-  "signature": "sha256:393162de43635426518dd3dca8100dca49558a55f990aede7c52f3a98de60612"
+  "signature": "sha256:eb35fa497310659186b8d082192529c5f3ce0083adaa1704282cce83da804db6"
  },
  "nbformat": 3,
  "nbformat_minor": 0,
       "Someone needs to keep track of the incorrect guesses so that the guesser doesn't keep making the same wrong guess. As the setter is already keeping track of the rest of the state, it's probably easier if the setter also keeps track of the wrong letters. That might allow us to keep the guesser state-free, which will keep it simpler. "
      ]
     },
+    {
+     "cell_type": "markdown",
+     "metadata": {},
+     "source": [
+      "## Getting a game state\n",
+      "If we need the guesser to interact with a human, let's get it to read the game state from a human.\n",
+      "\n",
+      "Remember that we want to return two lists of characters, not two strings.\n",
+      "\n",
+      "We'll also not do any input validation. Life's too short (for this example)."
+     ]
+    },
+    {
+     "cell_type": "code",
+     "collapsed": false,
+     "input": [
+      "def read_game():\n",
+      "    discovered = input('Enter the discovered word: ')\n",
+      "    missed = input('Enter the wrong guesses: ')\n",
+      "    return list(discovered), list(missed)"
+     ],
+     "language": "python",
+     "metadata": {},
+     "outputs": [],
+     "prompt_number": 18
+    },
+    {
+     "cell_type": "code",
+     "collapsed": false,
+     "input": [
+      "read_game()"
+     ],
+     "language": "python",
+     "metadata": {},
+     "outputs": [
+      {
+       "name": "stdout",
+       "output_type": "stream",
+       "stream": "stdout",
+       "text": [
+        "Enter the discovered word: __pp_\n"
+       ]
+      },
+      {
+       "name": "stdout",
+       "output_type": "stream",
+       "stream": "stdout",
+       "text": [
+        "Enter the wrong guesses: xv\n"
+       ]
+      },
+      {
+       "metadata": {},
+       "output_type": "pyout",
+       "prompt_number": 19,
+       "text": [
+        "(['_', '_', 'p', 'p', '_'], ['x', 'v'])"
+       ]
+      }
+     ],
+     "prompt_number": 19
+    },
+    {
+     "cell_type": "markdown",
+     "metadata": {},
+     "source": [
+      "That was easy."
+     ]
+    },
     {
      "cell_type": "markdown",
      "metadata": {},
      "language": "python",
      "metadata": {},
      "outputs": [],
-     "prompt_number": 1
+     "prompt_number": 20
     },
     {
      "cell_type": "markdown",
       {
        "metadata": {},
        "output_type": "pyout",
-       "prompt_number": 3,
+       "prompt_number": 21,
        "text": [
         "Counter({'e': 53111, 't': 38981, 'a': 35137, 'o': 33512, 'i': 30140, 'h': 29047, 'n': 28682, 's': 27194, 'r': 24508, 'd': 18563, 'l': 17145, 'u': 13116, 'm': 11787, 'w': 11266, 'c': 10499, 'y': 9431, 'f': 8975, 'g': 7887, 'p': 6835, 'b': 6362, 'v': 4452, 'k': 3543, 'x': 549, 'j': 452, 'q': 426, 'z': 149})"
        ]
       }
      ],
-     "prompt_number": 3
+     "prompt_number": 21
     },
     {
      "cell_type": "markdown",
       {
        "metadata": {},
        "output_type": "pyout",
-       "prompt_number": 6,
+       "prompt_number": 22,
        "text": [
         "[('e', 53111),\n",
         " ('t', 38981),\n",
        ]
       }
      ],
-     "prompt_number": 6
+     "prompt_number": 22
     },
     {
      "cell_type": "code",
       {
        "metadata": {},
        "output_type": "pyout",
-       "prompt_number": 4,
-       "text": [
-        "['e',\n",
-        " 't',\n",
-        " 'a',\n",
-        " 'o',\n",
-        " 'i',\n",
-        " 'h',\n",
-        " 'n',\n",
-        " 's',\n",
-        " 'r',\n",
-        " 'd',\n",
-        " 'l',\n",
-        " 'u',\n",
-        " 'm',\n",
-        " 'w',\n",
-        " 'c',\n",
-        " 'y',\n",
-        " 'f',\n",
-        " 'g',\n",
-        " 'p',\n",
-        " 'b',\n",
-        " 'v',\n",
-        " 'k',\n",
-        " 'x',\n",
-        " 'j',\n",
-        " 'q',\n",
-        " 'z']"
-       ]
-      }
-     ],
-     "prompt_number": 4
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "def make_guess():\n",
-      "    guessed_letters = read_game()\n",
-      "    unguessed_letters_in_order = ordered_subtract(letters_in_order, guessed_letters)\n",
-      "    print('My guess is:', unguessed_letters_in_order[0])"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [],
-     "prompt_number": 29
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "def read_game():\n",
-      "    discovered = input('Enter the discovered word: ')\n",
-      "    missed = input('Enter the wrong guesses: ')\n",
-      "    return [l for l in lower(discovered + missed) if l in string.ascii_letters]"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [],
-     "prompt_number": 30
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "def ordered_subtract(ordered_list, to_remove):\n",
-      "    for r in to_remove:\n",
-      "        if r in ordered_list:\n",
-      "            ordered_list.remove(r)\n",
-      "    return ordered_list"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [],
-     "prompt_number": 19
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "letters_in_order"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 20,
+       "prompt_number": 23,
        "text": [
         "['e',\n",
         " 't',\n",
        ]
       }
      ],
-     "prompt_number": 20
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "ordered_subtract(letters_in_order, 'etaoin')"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 21,
-       "text": [
-        "['h',\n",
-        " 's',\n",
-        " 'r',\n",
-        " 'd',\n",
-        " 'l',\n",
-        " 'u',\n",
-        " 'm',\n",
-        " 'w',\n",
-        " 'c',\n",
-        " 'y',\n",
-        " 'f',\n",
-        " 'g',\n",
-        " 'p',\n",
-        " 'b',\n",
-        " 'v',\n",
-        " 'k',\n",
-        " 'x',\n",
-        " 'j',\n",
-        " 'q',\n",
-        " 'z']"
-       ]
-      }
-     ],
-     "prompt_number": 21
+     "prompt_number": 23
     },
     {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "letters_in_order"
-     ],
-     "language": "python",
+     "cell_type": "markdown",
      "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 22,
-       "text": [
-        "['h',\n",
-        " 's',\n",
-        " 'r',\n",
-        " 'd',\n",
-        " 'l',\n",
-        " 'u',\n",
-        " 'm',\n",
-        " 'w',\n",
-        " 'c',\n",
-        " 'y',\n",
-        " 'f',\n",
-        " 'g',\n",
-        " 'p',\n",
-        " 'b',\n",
-        " 'v',\n",
-        " 'k',\n",
-        " 'x',\n",
-        " 'j',\n",
-        " 'q',\n",
-        " 'z']"
-       ]
-      }
-     ],
-     "prompt_number": 22
+     "source": [
+      "## Make a guess\n",
+      "How to make a guess? We want to guess the most common letter that hasn't already been guessed. \n",
+      "\n",
+      "That means we want to filter the available letters by removing the ones already guessed, and then take the first letter of the ones that are left. "
+     ]
     },
     {
      "cell_type": "code",
      "collapsed": false,
      "input": [
-      "def ordered_subtract(ordered_list, to_remove):\n",
-      "    for r in to_remove:\n",
-      "        if r in ordered_list:\n",
-      "            ri = ordered_list.index(r)\n",
-      "            ordered_list = ordered_list[:ri] + ordered_list[ri+1:]\n",
-      "    return ordered_list"
+      "def make_guess(discovered, missed):\n",
+      "    return [l for l in letters_in_order if l not in (discovered + missed)][0]"
      ],
      "language": "python",
      "metadata": {},
      "outputs": [],
-     "prompt_number": 26
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "letters_in_order = [p[0] for p in letter_counts.most_common()]\n",
-      "letters_in_order"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 24,
-       "text": [
-        "['e',\n",
-        " 't',\n",
-        " 'a',\n",
-        " 'o',\n",
-        " 'i',\n",
-        " 'h',\n",
-        " 'n',\n",
-        " 's',\n",
-        " 'r',\n",
-        " 'd',\n",
-        " 'l',\n",
-        " 'u',\n",
-        " 'm',\n",
-        " 'w',\n",
-        " 'c',\n",
-        " 'y',\n",
-        " 'f',\n",
-        " 'g',\n",
-        " 'p',\n",
-        " 'b',\n",
-        " 'v',\n",
-        " 'k',\n",
-        " 'x',\n",
-        " 'j',\n",
-        " 'q',\n",
-        " 'z']"
-       ]
-      }
-     ],
-     "prompt_number": 24
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "ordered_subtract(letters_in_order, 'etaoin')"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 27,
-       "text": [
-        "['h',\n",
-        " 's',\n",
-        " 'r',\n",
-        " 'd',\n",
-        " 'l',\n",
-        " 'u',\n",
-        " 'm',\n",
-        " 'w',\n",
-        " 'c',\n",
-        " 'y',\n",
-        " 'f',\n",
-        " 'g',\n",
-        " 'p',\n",
-        " 'b',\n",
-        " 'v',\n",
-        " 'k',\n",
-        " 'x',\n",
-        " 'j',\n",
-        " 'q',\n",
-        " 'z']"
-       ]
-      }
-     ],
      "prompt_number": 27
     },
     {
      "cell_type": "code",
      "collapsed": false,
      "input": [
-      "letters_in_order"
+      "make_guess(list('__pp_'), list('exv'))"
      ],
      "language": "python",
      "metadata": {},
       {
        "metadata": {},
        "output_type": "pyout",
-       "prompt_number": 28,
+       "prompt_number": 26,
        "text": [
-        "['e',\n",
-        " 't',\n",
-        " 'a',\n",
-        " 'o',\n",
-        " 'i',\n",
-        " 'h',\n",
-        " 'n',\n",
-        " 's',\n",
-        " 'r',\n",
-        " 'd',\n",
-        " 'l',\n",
-        " 'u',\n",
-        " 'm',\n",
-        " 'w',\n",
-        " 'c',\n",
-        " 'y',\n",
-        " 'f',\n",
-        " 'g',\n",
-        " 'p',\n",
-        " 'b',\n",
-        " 'v',\n",
-        " 'k',\n",
-        " 'x',\n",
-        " 'j',\n",
-        " 'q',\n",
-        " 'z']"
+        "'t'"
        ]
       }
      ],
-     "prompt_number": 28
+     "prompt_number": 26
     },
     {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "make_guess()"
-     ],
-     "language": "python",
+     "cell_type": "markdown",
      "metadata": {},
-     "outputs": [
-      {
-       "name": "stdout",
-       "output_type": "stream",
-       "stream": "stdout",
-       "text": [
-        "Enter the discovered word: _a__y\n"
-       ]
-      },
-      {
-       "name": "stdout",
-       "output_type": "stream",
-       "stream": "stdout",
-       "text": [
-        "Enter the wrong guesses: eit\n"
-       ]
-      },
-      {
-       "output_type": "stream",
-       "stream": "stdout",
-       "text": [
-        "My guess is: o\n"
-       ]
-      }
-     ],
-     "prompt_number": 31
+     "source": [
+      "...and that's it. We don't need to keep track of game end: the setting player can do that.\n",
+      "\n",
+      "It's easy to see how we could have different strategies, depending on the order of letters used in the `make_guess` procedure. But that's for next time."
+     ]
     },
     {
      "cell_type": "code",