Initial files
authorNeil Smith <neil.git@njae.me.uk>
Thu, 11 May 2017 16:39:23 +0000 (17:39 +0100)
committerNeil Smith <neil.git@njae.me.uk>
Thu, 11 May 2017 16:39:23 +0000 (17:39 +0100)
menace-nac.ipynb [new file with mode: 0644]
menace-nim-project.ipynb [new file with mode: 0644]
menace-nim.ipynb [new file with mode: 0644]
nac-trinket/__pycache__/menace.cpython-35.pyc [new file with mode: 0644]
nac-trinket/__pycache__/nac.cpython-35.pyc [new file with mode: 0644]
nac-trinket/main.py [new file with mode: 0644]
nac-trinket/menace.py [new file with mode: 0644]
nac-trinket/nac.py [new file with mode: 0644]
nim-trinket/__pycache__/menace.cpython-35.pyc [new file with mode: 0644]
nim-trinket/main.py [new file with mode: 0644]
nim-trinket/menace.py [new file with mode: 0644]

diff --git a/menace-nac.ipynb b/menace-nac.ipynb
new file mode 100644 (file)
index 0000000..8d7b208
--- /dev/null
@@ -0,0 +1,17265 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": 132,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "import itertools\n",
+    "import functools\n",
+    "import collections\n",
+    "import random\n",
+    "from IPython.display import HTML, display"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "INITIAL_BEAD_COUNT = 3"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def xo_count(board):\n",
+    "    xs = 0\n",
+    "    os = 0\n",
+    "    for c in board:\n",
+    "        if c == 'x':\n",
+    "            xs += 1\n",
+    "        elif c == 'o':\n",
+    "            os += 1\n",
+    "    return xs, os"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 195,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def valid_board(board):\n",
+    "    xs, os = xo_count(board)\n",
+    "    return (xs - os) == 0 or (xs - os) == 1"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def empty_board():\n",
+    "    return tuple('.' * 9)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "('.', '.', '.', '.', '.', '.', '.', '.', '.')"
+      ]
+     },
+     "execution_count": 6,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "empty_board()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def all_boards():\n",
+    "    return [b for b in itertools.product('.xo', repeat=9)\n",
+    "           if valid_board(b)\n",
+    "           ]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def winner(board):\n",
+    "    winning_player = None\n",
+    "    if board[0] == board[1] == board[2] and board[0] != '.':\n",
+    "        winning_player = board[0]\n",
+    "    if board[3] == board[4] == board[5] and board[3] != '.':\n",
+    "        winning_player = board[3]\n",
+    "    if board[6] == board[7] == board[8] and board[6] != '.':\n",
+    "        winning_player = board[6]\n",
+    "    if board[0] == board[3] == board[6] and board[0] != '.':\n",
+    "        winning_player = board[0]\n",
+    "    if board[1] == board[4] == board[7] and board[1] != '.':\n",
+    "        winning_player = board[1]\n",
+    "    if board[2] == board[5] == board[8] and board[2] != '.':\n",
+    "        winning_player = board[2]\n",
+    "    if board[0] == board[4] == board[8] and board[0] != '.':\n",
+    "        winning_player = board[0]\n",
+    "    if board[2] == board[4] == board[6] and board[2] != '.':\n",
+    "        winning_player = board[2]\n",
+    "    return winning_player"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 196,
+   "metadata": {
+    "scrolled": true
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "6046"
+      ]
+     },
+     "execution_count": 196,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "len(all_boards())"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 197,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[('.', '.', '.', '.', '.', '.', '.', '.', '.'),\n",
+       " ('.', '.', '.', '.', '.', '.', '.', '.', 'x'),\n",
+       " ('.', '.', '.', '.', '.', '.', '.', 'x', '.'),\n",
+       " ('.', '.', '.', '.', '.', '.', '.', 'x', 'o'),\n",
+       " ('.', '.', '.', '.', '.', '.', '.', 'o', 'x'),\n",
+       " ('.', '.', '.', '.', '.', '.', 'x', '.', '.'),\n",
+       " ('.', '.', '.', '.', '.', '.', 'x', '.', 'o'),\n",
+       " ('.', '.', '.', '.', '.', '.', 'x', 'x', 'o'),\n",
+       " ('.', '.', '.', '.', '.', '.', 'x', 'o', '.'),\n",
+       " ('.', '.', '.', '.', '.', '.', 'x', 'o', 'x')]"
+      ]
+     },
+     "execution_count": 197,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "all_boards()[:10]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 198,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def show_board(b):\n",
+    "    s = ''.join(b)\n",
+    "    return s[0:3] + '\\n' + s[3:6] + '\\n' + s[6:9]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 199,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "...\n",
+      ".oo\n",
+      "xxx\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(show_board([b for b in all_boards() if winner(b)][0]))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 200,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      ".x.\n",
+      "oox\n",
+      "...\n"
+     ]
+    }
+   ],
+   "source": [
+    "test_board = all_boards()[1000]\n",
+    "\n",
+    "print(show_board(test_board))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 201,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def show_boards(bs):\n",
+    "    rows = [[], [], []]\n",
+    "    for b in bs:\n",
+    "        s = ''.join(b)\n",
+    "        for i in range(3):\n",
+    "            rows[i] += [s[i*3:i*3+3]]\n",
+    "    return '\\n'.join('  '.join(r) for r in rows)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 202,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      ".x.  .x.  .x.  .x.  .x.  .x.  .x.  .x.  .x.  .x.\n",
+      "oox  oox  oox  oox  oox  oox  oox  oox  oox  oox\n",
+      "...  ..x  .x.  .xo  .ox  x..  x.o  xxo  xo.  xox\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(show_boards(all_boards()[1000:1010]))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 203,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "# 0 1 2    6 3 0\n",
+    "# 3 4 5 -> 7 4 1\n",
+    "# 6 7 8    8 5 2\n",
+    "rotation = {0: 6, 1: 3, 2: 0, 3: 7, 4: 4, 5: 1, 6: 8, 7: 5, 8: 2}\n",
+    "inverse_rotation = {t: f for f, t in rotation.items()}"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 204,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "# 0 1 2    2 1 0\n",
+    "# 3 4 5 -> 5 4 3\n",
+    "# 6 7 8    8 7 6\n",
+    "reflection = {0: 2, 1: 1, 2: 0, 3: 5, 4: 4, 5: 3, 6: 8, 7: 7, 8: 6}"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 205,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def rotate(board, n=1):\n",
+    "    b = board\n",
+    "    for _ in range(n):\n",
+    "        b = tuple(b[rotation[i]] for i in range(len(board)))\n",
+    "    return b"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 206,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def reflect(board, r=True):\n",
+    "    if r: \n",
+    "        return tuple(board[reflection[i]] for i in range(len(board)))\n",
+    "    else:\n",
+    "        return board"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 207,
+   "metadata": {
+    "scrolled": true
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      ".x.  .o.  ...  .x.  .x.\n",
+      "oox  .ox  xoo  xo.  oox\n",
+      "...  .x.  .x.  .o.  ...\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(show_boards(rotate(test_board, i) for i in range(5)))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 184,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "..o  o..\n",
+      "xox  xox\n",
+      "xoo  oox\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(show_boards([test_board, reflect(test_board)]))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 20,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def transform(board, n, r):\n",
+    "    b = rotate(board, n)\n",
+    "    return reflect(b, r)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 21,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def untransform(board, n, r):\n",
+    "    b = reflect(board, r)\n",
+    "    return rotate(b, abs(4-n))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 22,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def all_transforms(board):\n",
+    "    return [(transform(board, rot, ref), rot, ref)\n",
+    "            for rot in range(4)\n",
+    "            for ref in [False, True]]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 185,
+   "metadata": {
+    "scrolled": true
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "..o  o..  xx.  .xx  oox  xoo  oxo  oxo\n",
+      "xox  xox  oo.  .oo  xox  xox  .oo  oo.\n",
+      "xoo  oox  oxo  oxo  o..  ..o  .xx  xx.\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(show_boards(b for b, r, f in all_transforms(test_board)))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 24,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def score(board):\n",
+    "    return ''.join(board)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 25,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'..oxoxxoo'"
+      ]
+     },
+     "execution_count": 25,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "score(test_board)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 26,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def canonical(board):\n",
+    "    return max(all_transforms(board), key=lambda brf: score(brf[0]))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 27,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(('x', 'x', '.', 'o', 'o', '.', 'o', 'x', 'o'), 1, False)"
+      ]
+     },
+     "execution_count": 27,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "canonical(test_board)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 28,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "True"
+      ]
+     },
+     "execution_count": 28,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "b, r, f = canonical(test_board)\n",
+    "untransform(b, r, f) == test_board"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 29,
+   "metadata": {
+    "collapsed": true,
+    "scrolled": true
+   },
+   "outputs": [],
+   "source": [
+    "for b, r, f in all_transforms(test_board):\n",
+    "    assert untransform(b, r, f) == test_board"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 30,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "8953"
+      ]
+     },
+     "execution_count": 30,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "len(all_boards())"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 31,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "1262"
+      ]
+     },
+     "execution_count": 31,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "canonical_boards = set([canonical(b)[0] for b in all_boards()])\n",
+    "len(canonical_boards)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 186,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "...  .x.  x..\n",
+      ".x.  ...  ...\n",
+      "...  ...  ...\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(show_boards(b for b in sorted([b for b in canonical_boards if xo_count(b) == (1, 0)], key=score)))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 33,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def non_winning_boards():\n",
+    "    return set([canonical(b)[0] for b in all_boards()\n",
+    "           if not winner(b)\n",
+    "           ])"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 34,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[('.', '.', '.', '.', '.', '.', '.', '.', '.'),\n",
+       " ('.', '.', '.', '.', 'o', '.', '.', '.', '.'),\n",
+       " ('.', '.', '.', '.', 'x', '.', '.', '.', '.'),\n",
+       " ('.', 'o', '.', '.', '.', '.', '.', '.', '.'),\n",
+       " ('.', 'o', '.', '.', 'x', '.', '.', '.', '.'),\n",
+       " ('.', 'o', '.', '.', 'x', '.', '.', 'o', '.'),\n",
+       " ('.', 'o', '.', 'o', 'x', '.', '.', '.', '.'),\n",
+       " ('.', 'x', '.', '.', '.', '.', '.', '.', '.'),\n",
+       " ('.', 'x', '.', '.', '.', '.', '.', 'o', '.'),\n",
+       " ('.', 'x', '.', '.', 'o', '.', '.', '.', '.')]"
+      ]
+     },
+     "execution_count": 34,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "sorted(non_winning_boards())[:10]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 210,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def successors(board):\n",
+    "    xs, os = xo_count(board)\n",
+    "    succs = []\n",
+    "    if (xs - os) == 0:\n",
+    "        # add an x\n",
+    "        for i in range(len(board)):\n",
+    "            if board[i] == '.':\n",
+    "                succs += [tuple(board[:i] + ('x',) + board[i+1:])]\n",
+    "\n",
+    "    if (xs - os) == 1:\n",
+    "        # add an o\n",
+    "        for i in range(len(board)):\n",
+    "            if board[i] == '.':\n",
+    "                succs += [tuple(board[:i] + ('o',) + board[i+1:])]\n",
+    "    return succs"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 211,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "('.', 'x', '.', 'o', 'o', 'x', '.', '.', '.')"
+      ]
+     },
+     "execution_count": 211,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "test_board"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 212,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[('x', 'x', '.', 'o', 'o', 'x', '.', '.', '.'),\n",
+       " ('.', 'x', 'x', 'o', 'o', 'x', '.', '.', '.'),\n",
+       " ('.', 'x', '.', 'o', 'o', 'x', 'x', '.', '.'),\n",
+       " ('.', 'x', '.', 'o', 'o', 'x', '.', 'x', '.'),\n",
+       " ('.', 'x', '.', 'o', 'o', 'x', '.', '.', 'x')]"
+      ]
+     },
+     "execution_count": 212,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "successors(test_board)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 38,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def vacants(board):\n",
+    "    return [i for i, c in enumerate(board) if c == '.']"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 39,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[0, 1]"
+      ]
+     },
+     "execution_count": 39,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "vacants(test_board)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 40,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def apply_move(board, position, piece):\n",
+    "    return tuple(board[:position] + (piece,) + board[position+1:])"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 41,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(('o', '.', 'o', 'x', 'o', 'x', 'x', 'o', 'o'),\n",
+       " ('.', 'x', 'o', 'x', 'o', 'x', 'x', 'o', 'o'))"
+      ]
+     },
+     "execution_count": 41,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "apply_move(test_board, 0, 'o'), apply_move(test_board, 1, 'x')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 42,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def token_for_player(is_player_1):\n",
+    "    if is_player_1:\n",
+    "        return 'x'\n",
+    "    else:\n",
+    "        return 'o'"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 43,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def new_game(player1, player2):\n",
+    "    return {'board': empty_board(),\n",
+    "           'player1': player1,\n",
+    "           'player2': player2,\n",
+    "           'player1_active': True,\n",
+    "           'history': []}"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 79,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def game_finished(game):\n",
+    "    return (winner(game['board']) is not None) or (game['board'].count('.') == 0)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 50,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def active_player(game):\n",
+    "    if game['player1_active']:\n",
+    "        return game['player1']\n",
+    "    else:\n",
+    "        return game['player2']"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 213,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def new_menace():\n",
+    "    boxes = {'human?': False}\n",
+    "    for b in non_winning_boards():\n",
+    "        box = collections.Counter()\n",
+    "        for s in vacants(b):\n",
+    "            box[s] = INITIAL_BEAD_COUNT\n",
+    "        boxes[b] = box\n",
+    "    return boxes"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 214,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "{('x', '.', 'o', '.', 'o', 'x', '.', 'x', 'o'): Counter({1: 3, 3: 3, 6: 3}),\n",
+       " ('o',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.'): Counter({3: 3, 4: 3, 5: 3, 6: 3, 8: 3}),\n",
+       " ('x', 'x', '.', 'o', '.', 'x', 'o', 'o', 'x'): Counter({2: 3, 4: 3}),\n",
+       " ('o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.'): Counter({1: 3, 2: 3, 3: 3, 6: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o'): Counter({2: 3, 3: 3, 6: 3, 7: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.'): Counter({2: 3, 3: 3, 4: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'x', '.', '.', 'o', 'x', 'o', 'x', 'o'): Counter({2: 3, 3: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.'): Counter({2: 3, 4: 3, 5: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  'o'): Counter({2: 3, 3: 3, 4: 3, 5: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({2: 3, 3: 3, 4: 3, 5: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({5: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'o', 'o', '.', 'x', 'x', '.', 'x', 'o'): Counter({3: 3, 6: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'o',\n",
+       "  'x'): Counter({2: 3, 3: 3, 4: 3, 5: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({3: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'o', 'o', '.', 'x', 'o', '.', 'x', '.'): Counter({3: 3, 6: 3, 8: 3}),\n",
+       " ('x', 'x', '.', 'o', '.', 'x', 'x', 'o', 'o'): Counter({2: 3, 4: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.'): Counter({2: 3, 3: 3, 6: 3, 8: 3}),\n",
+       " ('x', 'x', '.', '.', 'o', 'x', 'o', 'o', '.'): Counter({2: 3, 3: 3, 8: 3}),\n",
+       " ('.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({0: 3, 2: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({2: 3, 4: 3, 5: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'x', '.', 'o', 'o', 'x', '.', 'x', 'o'): Counter({2: 3, 6: 3}),\n",
+       " ('o',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.'): Counter({1: 3, 3: 3, 5: 3, 6: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o'): Counter({3: 3, 5: 3, 6: 3, 7: 3}),\n",
+       " ('x', 'x', 'o', 'x', '.', 'x', 'o', '.', 'o'): Counter({4: 3, 7: 3}),\n",
+       " ('x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.'): Counter({1: 3, 3: 3, 4: 3, 6: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', 'o', '.', '.', 'o', '.', 'x'): Counter({4: 3, 5: 3, 7: 3}),\n",
+       " ('x', 'x', '.', '.', 'x', 'o', '.', 'o', 'o'): Counter({2: 3, 3: 3, 6: 3}),\n",
+       " ('o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({2: 3, 3: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.'): Counter({2: 3, 3: 3, 5: 3, 6: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.'): Counter({1: 3, 3: 3, 4: 3, 6: 3, 8: 3}),\n",
+       " ('x', 'o', 'x', 'o', 'x', 'o', 'o', 'x', '.'): Counter({8: 3}),\n",
+       " ('o', 'x', 'o', 'x', '.', '.', '.', 'x', 'o'): Counter({4: 3, 5: 3, 6: 3}),\n",
+       " ('o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({1: 3, 2: 3, 3: 3, 4: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o'): Counter({3: 3, 4: 3, 5: 3, 6: 3, 7: 3}),\n",
+       " ('x', 'x', '.', 'o', '.', 'x', 'o', 'o', '.'): Counter({2: 3, 4: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({2: 3, 3: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o'): Counter({2: 3, 3: 3, 5: 3, 6: 3, 7: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({4: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('o', 'x', 'o', 'x', 'o', 'x', '.', '.', '.'): Counter({6: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.'): Counter({2: 3, 3: 3, 6: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', '.', 'x', '.', 'x', 'o', 'o'): Counter({3: 3, 5: 3}),\n",
+       " ('x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({1: 3, 2: 3, 3: 3, 4: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({2: 3, 3: 3, 5: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', '.', 'o', 'x', '.', '.', 'o'): Counter({3: 3, 6: 3, 7: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o'): Counter({2: 3, 5: 3, 6: 3, 7: 3}),\n",
+       " ('x', 'o', '.', 'o', 'x', 'x', '.', '.', 'o'): Counter({2: 3, 6: 3, 7: 3}),\n",
+       " ('x', 'x', '.', 'o', 'x', 'x', 'o', 'o', '.'): Counter({2: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'o'): Counter({2: 3, 3: 3, 4: 3, 5: 3, 6: 3}),\n",
+       " ('x', 'x', '.', 'o', 'o', 'x', 'x', 'o', 'o'): Counter({2: 3}),\n",
+       " ('x', 'x', '.', '.', 'o', 'o', '.', 'x', 'o'): Counter({2: 3, 3: 3, 6: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({2: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.'): Counter({2: 3, 4: 3, 5: 3, 8: 3}),\n",
+       " ('x', 'o', 'x', '.', 'x', '.', 'o', 'o', '.'): Counter({3: 3, 5: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', 'o', '.', 'x', 'x', 'o', '.'): Counter({4: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({3: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.'): Counter({2: 3, 5: 3, 6: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'x'): Counter({2: 3, 3: 3, 4: 3, 5: 3, 6: 3}),\n",
+       " ('x', 'o', 'x', 'o', '.', '.', 'o', '.', 'x'): Counter({4: 3, 5: 3, 7: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o'): Counter({2: 3, 3: 3, 6: 3, 7: 3}),\n",
+       " ('x', 'x', '.', '.', '.', 'o', 'x', 'o', 'o'): Counter({2: 3, 3: 3, 4: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'x'): Counter({2: 3, 3: 3, 5: 3, 6: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({4: 3, 5: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', 'x', '.', 'x', '.', 'o', 'o'): Counter({4: 3, 6: 3}),\n",
+       " ('x', 'o', 'o', 'o', 'x', 'x', '.', 'x', '.'): Counter({6: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', '.', 'o', 'x', 'x', '.', 'o'): Counter({3: 3, 7: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.'): Counter({3: 3, 4: 3, 5: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o'): Counter({1: 3, 2: 3, 3: 3, 6: 3, 7: 3}),\n",
+       " ('x', 'o', 'x', 'o', 'x', '.', '.', '.', 'o'): Counter({5: 3, 6: 3, 7: 3}),\n",
+       " ('o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o'): Counter({2: 3, 5: 3, 6: 3, 7: 3}),\n",
+       " ('x', 'x', 'o', 'o', 'x', '.', '.', '.', 'o'): Counter({5: 3, 6: 3, 7: 3}),\n",
+       " ('x', 'x', '.', '.', 'o', '.', 'o', 'x', 'o'): Counter({2: 3, 3: 3, 5: 3}),\n",
+       " ('x', 'x', 'o', 'o', 'o', 'x', '.', 'o', 'x'): Counter({6: 3}),\n",
+       " ('.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.'): Counter({0: 3, 2: 3, 5: 3, 6: 3, 8: 3}),\n",
+       " ('.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({0: 3, 1: 3, 2: 3, 3: 3, 5: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', '.', 'x', 'x', 'o', '.', 'o'): Counter({3: 3, 7: 3}),\n",
+       " ('x', 'o', 'o', 'o', 'x', 'x', '.', '.', '.'): Counter({6: 3, 7: 3, 8: 3}),\n",
+       " ('.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.'): Counter({0: 3, 2: 3, 3: 3, 4: 3, 5: 3, 6: 3, 8: 3}),\n",
+       " ('x', 'x', '.', 'o', '.', '.', 'x', 'o', 'o'): Counter({2: 3, 4: 3, 5: 3}),\n",
+       " ('x', 'x', 'o', 'o', '.', 'x', 'x', 'o', 'o'): Counter({4: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.'): Counter({2: 3, 3: 3, 4: 3, 5: 3, 8: 3}),\n",
+       " ('.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({0: 3, 2: 3, 5: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.'): Counter({2: 3, 4: 3, 5: 3, 6: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', 'o', 'x', 'o', '.', '.', '.'): Counter({6: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', '.', 'x', 'o', '.', 'o', '.'): Counter({3: 3, 6: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.'): Counter({3: 3, 4: 3, 7: 3, 8: 3}),\n",
+       " 'human?': False,\n",
+       " ('x', 'x', 'o', '.', 'o', 'o', '.', 'x', 'x'): Counter({3: 3, 6: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({2: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', 'x', 'x', 'o', 'o', 'o', '.'): Counter({8: 3}),\n",
+       " ('x', 'x', '.', 'x', 'o', 'o', '.', '.', 'o'): Counter({2: 3, 6: 3, 7: 3}),\n",
+       " ('x', 'o', 'x', 'o', '.', '.', '.', 'o', 'x'): Counter({4: 3, 5: 3, 6: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({3: 3, 5: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({2: 3, 4: 3, 5: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.'): Counter({1: 3, 2: 3, 3: 3, 4: 3, 6: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', '.', 'x', '.', '.', 'o', 'o'): Counter({3: 3, 5: 3, 6: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.'): Counter({2: 3, 3: 3, 4: 3, 6: 3, 8: 3}),\n",
+       " ('x', 'o', '.', 'o', '.', 'x', '.', 'x', 'o'): Counter({2: 3, 4: 3, 6: 3}),\n",
+       " ('x', 'x', 'o', 'o', 'o', 'x', 'x', 'o', 'x'): Counter(),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.'): Counter({3: 3, 5: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.'): Counter({2: 3, 3: 3, 5: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', 'o', 'x', '.', 'x', 'o', 'o'): Counter({5: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x'): Counter({2: 3, 3: 3, 4: 3, 6: 3, 7: 3}),\n",
+       " ('x', 'x', 'o', '.', '.', 'o', 'x', 'o', 'x'): Counter({3: 3, 4: 3}),\n",
+       " ('x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x'): Counter({1: 3, 3: 3, 4: 3, 5: 3, 6: 3, 7: 3}),\n",
+       " ('x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x'): Counter({1: 3, 3: 3, 5: 3, 6: 3, 7: 3}),\n",
+       " ('x',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.'): Counter({1: 3, 3: 3, 5: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'o'): Counter({2: 3, 3: 3, 5: 3, 7: 3}),\n",
+       " ('x', 'o', 'x', '.', 'x', '.', 'o', '.', 'o'): Counter({3: 3, 5: 3, 7: 3}),\n",
+       " ('x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'o'): Counter({1: 3, 3: 3, 4: 3, 6: 3}),\n",
+       " ('x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.'): Counter({1: 3, 3: 3, 5: 3, 6: 3, 8: 3}),\n",
+       " ('x', 'o', 'o', 'o', 'x', 'x', 'o', 'x', '.'): Counter({8: 3}),\n",
+       " ('x', 'x', 'o', '.', 'o', '.', 'x', 'o', '.'): Counter({3: 3, 5: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', 'o', 'x', 'x', '.', '.', 'o'): Counter({6: 3, 7: 3}),\n",
+       " ('x', 'x', 'o', '.', '.', '.', 'x', 'o', 'o'): Counter({3: 3, 4: 3, 5: 3}),\n",
+       " ('x',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.'): Counter({1: 3, 3: 3, 5: 3, 8: 3}),\n",
+       " ('o', 'x', '.', 'x', 'o', 'x', '.', 'o', '.'): Counter({2: 3, 6: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.'): Counter({1: 3, 2: 3, 3: 3, 6: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', 'o', 'x', 'x', 'o', 'o', '.'): Counter({8: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.'): Counter({2: 3, 3: 3, 4: 3, 5: 3, 6: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', '.', 'o', '.', '.', 'x', 'o'): Counter({3: 3, 5: 3, 6: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'o'): Counter({3: 3, 4: 3, 5: 3, 6: 3}),\n",
+       " ('x', 'x', 'o', 'o', 'x', 'x', '.', 'o', '.'): Counter({6: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.'): Counter({3: 3, 5: 3, 6: 3, 8: 3}),\n",
+       " ('x', 'x', '.', '.', 'o', 'o', 'x', '.', 'o'): Counter({2: 3, 3: 3, 7: 3}),\n",
+       " ('x', 'x', 'o', 'o', 'o', '.', 'x', 'x', '.'): Counter({5: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', 'o', 'o', 'x', 'x', 'o', '.'): Counter({8: 3}),\n",
+       " ('o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({1: 3, 2: 3, 3: 3, 5: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'o'): Counter({1: 3, 2: 3, 3: 3, 4: 3, 6: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({2: 3, 3: 3, 5: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o'): Counter({2: 3, 3: 3, 4: 3, 5: 3, 7: 3}),\n",
+       " ('x', 'x', 'o', 'o', 'o', 'x', '.', 'x', '.'): Counter({6: 3, 8: 3}),\n",
+       " ('x', 'o', 'x', 'o', 'o', '.', '.', 'x', '.'): Counter({5: 3, 6: 3, 8: 3}),\n",
+       " ('x', 'o', 'o', '.', 'x', 'x', '.', '.', 'o'): Counter({3: 3, 6: 3, 7: 3}),\n",
+       " ('x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'o'): Counter({1: 3, 2: 3, 3: 3, 6: 3}),\n",
+       " ('.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.'): Counter({0: 3, 2: 3, 4: 3, 5: 3, 6: 3, 8: 3}),\n",
+       " ('x', 'o', 'o', 'o', '.', 'x', '.', 'x', '.'): Counter({4: 3, 6: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.'): Counter({4: 3, 5: 3, 6: 3, 8: 3}),\n",
+       " ('x', 'x', '.', 'o', 'o', 'x', 'o', 'x', 'o'): Counter({2: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o'): Counter({2: 3, 3: 3, 5: 3, 7: 3}),\n",
+       " ('x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o'): Counter({1: 3, 2: 3, 3: 3, 4: 3, 5: 3, 6: 3, 7: 3}),\n",
+       " ('x', 'x', 'o', 'o', 'o', '.', 'x', '.', '.'): Counter({5: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', 'x', '.', 'o', 'o', '.', '.'): Counter({4: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'x', '.', 'o', '.', 'x', '.', 'o', 'o'): Counter({2: 3, 4: 3, 6: 3}),\n",
+       " ('x', 'o', '.', '.', 'o', 'o', 'x', '.', 'x'): Counter({2: 3, 3: 3, 7: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.'): Counter({3: 3, 5: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.'): Counter({4: 3, 5: 3, 6: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', '.', '.', '.', 'o', 'o', 'x'): Counter({3: 3, 4: 3, 5: 3}),\n",
+       " ('o', 'x', 'o', 'x', 'x', '.', 'o', '.', '.'): Counter({5: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.'): Counter({2: 3, 3: 3, 5: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'o', 'o', '.', '.', 'o', 'x', '.', 'x'): Counter({3: 3, 4: 3, 7: 3}),\n",
+       " ('x',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o'): Counter({1: 3, 3: 3, 5: 3, 7: 3}),\n",
+       " ('x', 'o', '.', '.', 'x', 'o', 'x', 'o', '.'): Counter({2: 3, 3: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', 'o', 'o', 'x', 'x', '.', 'o'): Counter({7: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.'): Counter({4: 3, 5: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', '.', '.', 'o', 'o', '.', 'x'): Counter({3: 3, 4: 3, 7: 3}),\n",
+       " ('x', 'x', '.', 'o', 'x', 'o', '.', 'o', '.'): Counter({2: 3, 6: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.'): Counter({2: 3, 5: 3, 6: 3, 8: 3}),\n",
+       " ('o', 'x', 'o', 'x', '.', 'x', 'o', '.', '.'): Counter({4: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x'): Counter({2: 3, 4: 3, 6: 3, 7: 3}),\n",
+       " ('x', 'x', 'o', 'x', '.', 'o', '.', 'o', 'x'): Counter({4: 3, 6: 3}),\n",
+       " ('x', 'o', '.', '.', '.', 'x', 'o', 'x', 'o'): Counter({2: 3, 3: 3, 4: 3}),\n",
+       " ('x', 'x', 'o', 'o', '.', 'o', '.', 'x', 'x'): Counter({4: 3, 6: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.'): Counter({2: 3, 3: 3, 5: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({5: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', 'o', '.', 'o', 'x', '.', 'x'): Counter({4: 3, 7: 3}),\n",
+       " ('x',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  'o'): Counter({1: 3, 3: 3, 4: 3, 5: 3}),\n",
+       " ('x', 'x', '.', 'o', 'o', 'x', 'x', '.', 'o'): Counter({2: 3, 7: 3}),\n",
+       " ('x', 'o', 'o', '.', 'o', 'x', 'x', '.', '.'): Counter({3: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', 'o', '.', 'x', '.', 'x', 'o'): Counter({4: 3, 6: 3}),\n",
+       " ('x', 'x', 'o', '.', '.', 'x', 'o', '.', 'o'): Counter({3: 3, 4: 3, 7: 3}),\n",
+       " ('o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'o'): Counter({2: 3, 3: 3, 4: 3, 5: 3, 6: 3}),\n",
+       " ('x', 'x', 'o', 'o', '.', 'x', 'x', '.', 'o'): Counter({4: 3, 7: 3}),\n",
+       " ('x', 'x', 'o', 'o', 'o', 'x', '.', 'x', 'o'): Counter({6: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.'): Counter({2: 3, 3: 3, 6: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', 'o', '.', 'o', 'x', 'o', 'x'): Counter({4: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.'): Counter({2: 3, 3: 3, 5: 3, 6: 3, 8: 3}),\n",
+       " ('x', 'x', '.', 'o', 'o', '.', '.', 'x', 'o'): Counter({2: 3, 5: 3, 6: 3}),\n",
+       " ('x', 'x', '.', 'o', 'x', 'o', 'x', 'o', '.'): Counter({2: 3, 8: 3}),\n",
+       " ('o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({2: 3, 5: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', 'o', '.', 'x', 'o', '.', 'x'): Counter({4: 3, 7: 3}),\n",
+       " ('x', 'x', '.', 'o', 'x', 'x', 'o', '.', 'o'): Counter({2: 3, 7: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({2: 3, 5: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.'): Counter({1: 3, 3: 3, 5: 3, 6: 3, 8: 3}),\n",
+       " ('x', 'x', '.', '.', 'o', 'o', 'o', '.', 'x'): Counter({2: 3, 3: 3, 7: 3}),\n",
+       " ('o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({2: 3, 5: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({0: 3, 2: 3, 4: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'x'): Counter({3: 3, 4: 3, 5: 3, 7: 3}),\n",
+       " ('.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({0: 3, 2: 3, 3: 3, 4: 3, 5: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('o', 'x', '.', '.', 'x', 'x', 'o', '.', 'o'): Counter({2: 3, 3: 3, 7: 3}),\n",
+       " ('x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.'): Counter({1: 3, 3: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', 'x', 'o', 'o', '.', '.', '.'): Counter({6: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.'): Counter({3: 3, 4: 3, 5: 3, 6: 3, 8: 3}),\n",
+       " ('x', 'o', '.', '.', 'x', 'o', '.', 'x', 'o'): Counter({2: 3, 3: 3, 6: 3}),\n",
+       " ('x', 'x', '.', 'x', 'o', 'o', '.', 'o', 'x'): Counter({2: 3, 6: 3}),\n",
+       " ('x', 'x', '.', 'o', '.', 'o', 'x', 'o', 'x'): Counter({2: 3, 4: 3}),\n",
+       " ('.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.'): Counter({0: 3, 2: 3, 6: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({1: 3, 2: 3, 3: 3, 5: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.'): Counter({1: 3, 3: 3, 6: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', 'o', '.', 'x', 'o', 'x', 'o'): Counter({4: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o'): Counter({3: 3, 4: 3, 6: 3, 7: 3}),\n",
+       " ('x', 'o', 'o', '.', 'x', 'x', '.', 'o', '.'): Counter({3: 3, 6: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.'): Counter({3: 3, 4: 3, 5: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'x', '.', 'o', 'x', 'o', 'x', 'o', 'o'): Counter({2: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({2: 3, 3: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('o', 'x', 'o', 'x', 'o', '.', '.', 'x', '.'): Counter({5: 3, 6: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o'): Counter({3: 3, 4: 3, 5: 3, 7: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'o',\n",
+       "  '.'): Counter({2: 3, 3: 3, 5: 3, 8: 3}),\n",
+       " ('o', 'x', '.', 'x', '.', 'x', '.', 'o', 'o'): Counter({2: 3, 4: 3, 6: 3}),\n",
+       " ('o', 'x', '.', 'o', 'o', 'x', '.', 'x', '.'): Counter({2: 3, 6: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.'): Counter({3: 3, 4: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'o'): Counter({2: 3, 3: 3, 4: 3, 6: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.'): Counter({3: 3, 5: 3, 6: 3, 8: 3}),\n",
+       " ('x', 'o', 'o', '.', 'o', 'x', '.', 'x', '.'): Counter({3: 3, 6: 3, 8: 3}),\n",
+       " ('.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.'): Counter({0: 3, 2: 3, 6: 3, 8: 3}),\n",
+       " ('x', 'x', '.', '.', 'x', 'o', 'o', '.', 'o'): Counter({2: 3, 3: 3, 7: 3}),\n",
+       " ('x', 'x', 'o', 'o', '.', 'x', 'o', 'o', 'x'): Counter({4: 3}),\n",
+       " ('x', 'x', '.', 'o', 'x', 'o', '.', '.', 'o'): Counter({2: 3, 6: 3, 7: 3}),\n",
+       " ('x', 'x', 'o', 'x', 'x', 'o', '.', 'o', '.'): Counter({6: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'x'): Counter({3: 3, 4: 3, 5: 3, 6: 3}),\n",
+       " ('x', 'o', 'o', '.', '.', 'x', 'o', 'x', '.'): Counter({3: 3, 4: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({1: 3, 3: 3, 4: 3, 5: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({1: 3, 3: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'o', 'x', 'o', 'x', 'o', '.', 'x', '.'): Counter({6: 3, 8: 3}),\n",
+       " ('.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.'): Counter({0: 3, 2: 3, 4: 3, 6: 3, 8: 3}),\n",
+       " ('x', 'x', '.', 'x', 'x', 'o', '.', 'o', 'o'): Counter({2: 3, 6: 3}),\n",
+       " ('x', 'x', 'o', '.', 'o', 'o', 'x', '.', '.'): Counter({3: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'o'): Counter({2: 3, 3: 3, 4: 3, 7: 3}),\n",
+       " ('o', 'x', 'o', 'x', 'o', 'x', '.', 'x', '.'): Counter({6: 3, 8: 3}),\n",
+       " ('x', 'o', 'o', '.', 'x', 'x', 'x', '.', 'o'): Counter({3: 3, 7: 3}),\n",
+       " ('x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.'): Counter({1: 3, 3: 3, 6: 3, 8: 3}),\n",
+       " ('o', 'x', 'o', 'x', 'x', 'o', '.', '.', '.'): Counter({6: 3, 7: 3, 8: 3}),\n",
+       " ('x', '.', 'o', '.', 'x', 'x', 'o', 'o', '.'): Counter({1: 3, 3: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.'): Counter({2: 3, 3: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'o', '.', '.', 'o', 'x', 'o', 'x', '.'): Counter({2: 3, 3: 3, 8: 3}),\n",
+       " ('x', 'x', '.', 'o', 'o', '.', 'x', '.', 'o'): Counter({2: 3, 5: 3, 7: 3}),\n",
+       " ('x', 'x', '.', 'o', '.', 'o', 'o', 'x', '.'): Counter({2: 3, 4: 3, 8: 3}),\n",
+       " ('x', 'o', 'x', 'o', 'x', '.', '.', 'o', '.'): Counter({5: 3, 6: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.'): Counter({2: 3, 3: 3, 5: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({2: 3, 3: 3, 4: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({1: 3, 2: 3, 3: 3, 4: 3, 5: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('o', 'x', '.', 'o', 'x', 'x', '.', 'o', '.'): Counter({2: 3, 6: 3, 8: 3}),\n",
+       " ('x', 'o', '.', '.', 'x', '.', 'o', 'x', 'o'): Counter({2: 3, 3: 3, 5: 3}),\n",
+       " ('x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o'): Counter({1: 3, 3: 3, 6: 3, 7: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.'): Counter({4: 3, 5: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', 'x', '.', '.', 'o', '.', 'o'): Counter({4: 3, 5: 3, 7: 3}),\n",
+       " ('x', 'x', 'o', '.', '.', 'o', '.', 'o', 'x'): Counter({3: 3, 4: 3, 6: 3}),\n",
+       " ('x', 'o', 'x', 'o', '.', 'o', 'x', '.', '.'): Counter({4: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'o', 'o', '.', '.', 'x', 'x', 'o', '.'): Counter({3: 3, 4: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', 'o', '.', 'o', 'x', '.', '.'): Counter({4: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', 'o', '.', 'o', '.', '.', 'x'): Counter({4: 3, 6: 3, 7: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o'): Counter({2: 3, 5: 3, 6: 3, 7: 3}),\n",
+       " ('x', 'x', 'o', 'o', 'x', 'x', 'o', '.', 'o'): Counter({7: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  'o',\n",
+       "  '.'): Counter({2: 3, 3: 3, 4: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x'): Counter({2: 3, 4: 3, 5: 3, 6: 3, 7: 3}),\n",
+       " ('o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.'): Counter({2: 3, 3: 3, 4: 3, 6: 3, 8: 3}),\n",
+       " ('.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({0: 3, 2: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'o'): Counter({2: 3, 3: 3, 4: 3, 6: 3}),\n",
+       " ('x', 'x', 'o', 'o', 'o', '.', '.', '.', 'x'): Counter({5: 3, 6: 3, 7: 3}),\n",
+       " ('x', 'x', 'o', 'o', 'o', '.', 'x', 'x', 'o'): Counter({5: 3}),\n",
+       " ('.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.'): Counter({0: 3, 2: 3, 3: 3, 5: 3, 6: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', 'o', 'x', 'x', 'x', 'o', 'o'): Counter(),\n",
+       " ('x', 'x', 'o', '.', 'o', 'x', '.', 'x', 'o'): Counter({3: 3, 6: 3}),\n",
+       " ('x', 'x', 'o', '.', 'o', 'o', 'x', 'o', 'x'): Counter({3: 3}),\n",
+       " ('x', 'o', 'o', '.', 'x', 'x', 'o', 'x', '.'): Counter({3: 3, 8: 3}),\n",
+       " ('x', 'x', '.', '.', 'o', 'x', 'o', '.', 'o'): Counter({2: 3, 3: 3, 7: 3}),\n",
+       " ('x', 'x', 'o', 'o', 'x', '.', 'x', '.', 'o'): Counter({5: 3, 7: 3}),\n",
+       " ('o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({2: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.'): Counter({2: 3, 3: 3, 4: 3, 5: 3, 7: 3, 8: 3}),\n",
+       " ('x', '.', 'x', '.', 'o', '.', 'o', 'x', 'o'): Counter({1: 3, 3: 3, 5: 3}),\n",
+       " ('x',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'o'): Counter({1: 3, 3: 3, 4: 3, 5: 3, 7: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x'): Counter({4: 3, 5: 3, 6: 3, 7: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({4: 3, 5: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'o', 'o', '.', '.', 'x', '.', 'x', 'o'): Counter({3: 3, 4: 3, 6: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.'): Counter({2: 3, 4: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.'): Counter({3: 3, 5: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'x'): Counter({2: 3, 3: 3, 4: 3, 6: 3}),\n",
+       " ('x', 'x', 'o', 'o', 'x', '.', 'o', '.', '.'): Counter({5: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.'): Counter({2: 3, 4: 3, 5: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.'): Counter({3: 3, 4: 3, 5: 3, 6: 3, 8: 3}),\n",
+       " ('.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({0: 3, 2: 3, 3: 3, 5: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', 'o', '.', 'x', '.', 'o', 'x'): Counter({4: 3, 6: 3}),\n",
+       " ('x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.'): Counter({1: 3, 3: 3, 6: 3, 8: 3}),\n",
+       " ('x', 'o', 'x', 'o', 'x', '.', '.', 'x', 'o'): Counter({5: 3, 6: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.'): Counter({2: 3, 3: 3, 4: 3, 5: 3, 8: 3}),\n",
+       " ('x', 'o', 'x', 'o', '.', '.', 'o', 'x', '.'): Counter({4: 3, 5: 3, 8: 3}),\n",
+       " ('o', 'x', 'o', 'x', '.', 'o', '.', 'x', '.'): Counter({4: 3, 6: 3, 8: 3}),\n",
+       " ('x', 'o', '.', '.', 'x', 'o', 'o', 'x', '.'): Counter({2: 3, 3: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.'): Counter({2: 3, 3: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.'): Counter({2: 3, 3: 3, 4: 3, 6: 3, 8: 3}),\n",
+       " ('x', 'x', '.', 'o', 'o', 'x', 'o', 'x', '.'): Counter({2: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'o'): Counter({1: 3, 3: 3, 5: 3, 6: 3}),\n",
+       " ('x', 'o', 'x', 'o', '.', '.', 'x', '.', 'o'): Counter({4: 3, 5: 3, 7: 3}),\n",
+       " ('o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o'): Counter({2: 3, 3: 3, 6: 3, 7: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.'): Counter({2: 3, 3: 3, 4: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', 'o', '.', 'o', '.', 'x', '.'): Counter({4: 3, 6: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', 'o', '.', '.', 'x', 'o', '.'): Counter({4: 3, 5: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', '.', 'o', '.', 'x', '.', 'o'): Counter({3: 3, 5: 3, 7: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o'): Counter({4: 3, 5: 3, 6: 3, 7: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.'): Counter({3: 3, 4: 3, 5: 3, 6: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', 'x', 'o', 'x', '.', '.', 'o'): Counter({6: 3, 7: 3}),\n",
+       " ('o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({2: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'x', '.', 'o', '.', '.', 'o', 'o', 'x'): Counter({2: 3, 4: 3, 5: 3}),\n",
+       " ('x', 'x', '.', 'o', '.', 'o', 'o', '.', 'x'): Counter({2: 3, 4: 3, 7: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'o'): Counter({2: 3, 3: 3, 5: 3, 6: 3}),\n",
+       " ('x', 'o', 'o', '.', 'o', '.', 'x', '.', 'x'): Counter({3: 3, 5: 3, 7: 3}),\n",
+       " ('x', 'o', 'x', '.', 'x', '.', 'o', 'x', 'o'): Counter({3: 3, 5: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.'): Counter({3: 3, 5: 3, 6: 3, 8: 3}),\n",
+       " ('x', 'o', 'o', '.', 'x', 'x', 'x', 'o', '.'): Counter({3: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.'): Counter({2: 3, 3: 3, 5: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({2: 3, 3: 3, 4: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', '.', 'o', '.', '.', 'o', 'x'): Counter({3: 3, 5: 3, 6: 3}),\n",
+       " ('x', 'o', 'x', 'o', 'x', '.', 'o', 'x', 'o'): Counter({5: 3}),\n",
+       " ('x', 'x', '.', 'o', 'x', '.', 'x', 'o', 'o'): Counter({2: 3, 5: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.'): Counter({3: 3, 4: 3, 6: 3, 8: 3}),\n",
+       " ('o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({2: 3, 3: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'x', '.', 'x', 'o', 'x', '.', 'o', 'o'): Counter({2: 3, 6: 3}),\n",
+       " ('x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.'): Counter({1: 3, 3: 3, 4: 3, 8: 3}),\n",
+       " ('x', 'x', '.', 'o', 'o', 'x', 'o', '.', 'x'): Counter({2: 3, 7: 3}),\n",
+       " ('.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.'): Counter({0: 3, 2: 3, 4: 3, 6: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', '.', '.', '.', 'o', 'x', 'o'): Counter({3: 3, 4: 3, 5: 3}),\n",
+       " ('x',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'o'): Counter({1: 3, 3: 3, 5: 3, 7: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({5: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'o', 'x', 'o', '.', '.', '.', 'x', 'o'): Counter({4: 3, 5: 3, 6: 3}),\n",
+       " ('.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.'): Counter({0: 3, 2: 3, 3: 3, 5: 3, 6: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.'): Counter({2: 3, 5: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.'): Counter({2: 3, 3: 3, 4: 3, 8: 3}),\n",
+       " ('x', 'o', 'x', '.', 'o', '.', 'x', '.', 'o'): Counter({3: 3, 5: 3, 7: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'x'): Counter({2: 3, 3: 3, 4: 3, 7: 3}),\n",
+       " ('o',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.'): Counter({2: 3, 3: 3, 5: 3, 6: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.'): Counter({2: 3, 3: 3, 5: 3, 6: 3, 8: 3}),\n",
+       " ('x', 'x', '.', 'o', '.', 'o', '.', 'x', 'o'): Counter({2: 3, 4: 3, 6: 3}),\n",
+       " ('x', 'x', 'o', 'x', 'o', '.', '.', 'x', 'o'): Counter({5: 3, 6: 3}),\n",
+       " ('o',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({3: 3, 5: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', 'x', 'x', '.', '.', 'o', 'o'): Counter({5: 3, 6: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.'): Counter({2: 3, 3: 3, 6: 3, 8: 3}),\n",
+       " ('x', 'x', '.', '.', 'o', 'o', '.', 'o', 'x'): Counter({2: 3, 3: 3, 6: 3}),\n",
+       " ('x', 'x', '.', '.', 'o', '.', 'x', 'o', 'o'): Counter({2: 3, 3: 3, 5: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({2: 3, 3: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({1: 3, 2: 3, 3: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'x'): Counter({1: 3, 3: 3, 4: 3, 5: 3, 7: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.'): Counter({2: 3, 3: 3, 6: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', '.', 'o', 'x', '.', 'o', '.'): Counter({3: 3, 6: 3, 8: 3}),\n",
+       " ('x', 'x', '.', 'o', 'x', '.', 'o', 'o', '.'): Counter({2: 3, 5: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'o',\n",
+       "  '.'): Counter({2: 3, 3: 3, 4: 3, 5: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o'): Counter({2: 3, 3: 3, 4: 3, 5: 3, 6: 3, 7: 3}),\n",
+       " ('x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.'): Counter({1: 3, 3: 3, 4: 3, 5: 3, 6: 3, 8: 3}),\n",
+       " ('o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.'): Counter({2: 3, 3: 3, 6: 3, 8: 3}),\n",
+       " ('x', 'x', '.', 'x', '.', 'o', '.', 'o', 'o'): Counter({2: 3, 4: 3, 6: 3}),\n",
+       " ('.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({0: 3, 1: 3, 2: 3, 3: 3, 4: 3, 5: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'x', '.', 'o', 'x', 'x', '.', 'o', 'o'): Counter({2: 3, 6: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o'): Counter({2: 3, 4: 3, 6: 3, 7: 3}),\n",
+       " ('o', 'x', 'o', 'x', 'x', '.', '.', 'o', '.'): Counter({5: 3, 6: 3, 8: 3}),\n",
+       " ('o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.'): Counter({2: 3, 3: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({3: 3, 4: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'o', 'x', 'o', 'o', '.', 'x', '.', 'x'): Counter({5: 3, 7: 3}),\n",
+       " ('x', 'x', 'o', 'o', 'o', '.', 'x', '.', 'x'): Counter({5: 3, 7: 3}),\n",
+       " ('x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o'): Counter({1: 3, 2: 3, 3: 3, 6: 3, 7: 3}),\n",
+       " ('o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.'): Counter({2: 3, 3: 3, 6: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x'): Counter({1: 3, 2: 3, 3: 3, 5: 3, 6: 3, 7: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'x'): Counter({2: 3, 4: 3, 5: 3, 6: 3}),\n",
+       " ('x',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'o',\n",
+       "  '.'): Counter({1: 3, 3: 3, 5: 3, 8: 3}),\n",
+       " ('x', 'o', '.', '.', 'x', 'x', '.', 'o', 'o'): Counter({2: 3, 3: 3, 6: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.'): Counter({2: 3, 3: 3, 4: 3, 5: 3, 6: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.'): Counter({3: 3, 4: 3, 5: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'o', 'x', 'o', '.', 'o', 'x', 'o', 'x'): Counter({4: 3}),\n",
+       " ('o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.'): Counter({2: 3, 3: 3, 5: 3, 6: 3, 8: 3}),\n",
+       " ('x', 'o', '.', 'o', 'o', 'x', '.', 'x', '.'): Counter({2: 3, 6: 3, 8: 3}),\n",
+       " ('o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({2: 3, 3: 3, 4: 3, 5: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.'): Counter({3: 3, 5: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'o', '.', '.', 'o', 'x', '.', 'x', 'o'): Counter({2: 3, 3: 3, 6: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.'): Counter({2: 3, 3: 3, 4: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.'): Counter({2: 3, 4: 3, 6: 3, 8: 3}),\n",
+       " ('x', 'x', '.', 'o', 'o', 'x', '.', '.', 'o'): Counter({2: 3, 6: 3, 7: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'x'): Counter({2: 3, 4: 3, 5: 3, 7: 3}),\n",
+       " ('x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({1: 3, 3: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', 'o', '.', 'x', '.', 'o', '.'): Counter({4: 3, 6: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', 'o', '.', '.', 'o', 'x', '.'): Counter({4: 3, 5: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.'): Counter({1: 3, 2: 3, 3: 3, 6: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.'): Counter({2: 3, 4: 3, 5: 3, 6: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'o'): Counter({1: 3, 3: 3, 4: 3, 5: 3, 6: 3}),\n",
+       " ('x', 'o', '.', '.', 'x', 'x', 'o', 'o', '.'): Counter({2: 3, 3: 3, 8: 3}),\n",
+       " ('x', 'x', '.', 'o', '.', 'x', 'o', 'x', 'o'): Counter({2: 3, 4: 3}),\n",
+       " ('x', '.', 'o', '.', 'x', 'x', '.', 'o', 'o'): Counter({1: 3, 3: 3, 6: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'o'): Counter({2: 3, 3: 3, 4: 3, 5: 3, 6: 3}),\n",
+       " ('x', 'x', '.', 'o', '.', '.', 'o', 'x', 'o'): Counter({2: 3, 4: 3, 5: 3}),\n",
+       " ('x', 'x', '.', 'o', 'o', 'x', '.', 'o', '.'): Counter({2: 3, 6: 3, 8: 3}),\n",
+       " ('o', 'x', 'o', 'x', '.', 'x', 'o', 'x', 'o'): Counter({4: 3}),\n",
+       " ('x', 'o', 'x', 'o', 'x', '.', 'o', '.', '.'): Counter({5: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({4: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({3: 3, 5: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'x', '.', '.', 'o', 'o', 'x', 'o', 'x'): Counter({2: 3, 3: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o'): Counter({2: 3, 3: 3, 5: 3, 6: 3, 7: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'o'): Counter({2: 3, 4: 3, 5: 3, 6: 3}),\n",
+       " ('x', 'x', 'o', 'x', 'x', 'o', 'o', '.', '.'): Counter({7: 3, 8: 3}),\n",
+       " ('o',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({4: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'x', '.', 'o', '.', 'x', 'o', '.', 'o'): Counter({2: 3, 4: 3, 7: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.'): Counter({2: 3, 3: 3, 4: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'o', 'x', 'o', 'o', '.', 'x', '.', '.'): Counter({5: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.'): Counter({3: 3, 4: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'x', '.', '.', 'o', '.', 'o', 'o', 'x'): Counter({2: 3, 3: 3, 5: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'o'): Counter({2: 3, 3: 3, 4: 3, 6: 3}),\n",
+       " ('x', 'o', 'o', '.', 'x', '.', 'o', 'x', '.'): Counter({3: 3, 5: 3, 8: 3}),\n",
+       " ('o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.'): Counter({1: 3, 2: 3, 3: 3, 4: 3, 6: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', '.', 'o', '.', 'x', 'o', 'x'): Counter({3: 3, 5: 3}),\n",
+       " ('x', 'x', '.', 'o', 'x', 'o', 'x', '.', 'o'): Counter({2: 3, 7: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({2: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'o'): Counter({2: 3, 3: 3, 5: 3, 6: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o'): Counter({3: 3, 4: 3, 5: 3, 7: 3}),\n",
+       " ('x', 'x', 'o', 'o', 'o', 'x', '.', '.', '.'): Counter({6: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x'): Counter({2: 3, 3: 3, 5: 3, 6: 3, 7: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.'): Counter({2: 3, 3: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', 'x', 'x', '.', 'o', '.', 'o'): Counter({5: 3, 7: 3}),\n",
+       " ('x', 'x', 'o', 'o', '.', 'x', '.', '.', 'o'): Counter({4: 3, 6: 3, 7: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.'): Counter({3: 3, 4: 3, 6: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', '.', 'o', 'o', '.', 'x', '.'): Counter({3: 3, 6: 3, 8: 3}),\n",
+       " ('o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.'): Counter({2: 3, 3: 3, 4: 3, 5: 3, 8: 3}),\n",
+       " ('o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({2: 3, 3: 3, 4: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'o', 'x', 'o', 'x', 'o', '.', '.', '.'): Counter({6: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'o', 'x', 'o', 'x', '.', 'o', 'x', '.'): Counter({5: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'x'): Counter({2: 3, 3: 3, 5: 3, 7: 3}),\n",
+       " ('o', 'x', '.', 'x', 'x', 'o', '.', '.', 'o'): Counter({2: 3, 6: 3, 7: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'o'): Counter({2: 3, 3: 3, 4: 3, 5: 3, 7: 3}),\n",
+       " ('x', 'x', 'o', 'x', '.', 'o', 'o', '.', 'x'): Counter({4: 3, 7: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({2: 3, 3: 3, 5: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'o', 'o', '.', 'x', 'x', 'o', 'x', 'o'): Counter({3: 3}),\n",
+       " ('x', 'x', 'o', 'x', 'o', 'o', '.', 'x', '.'): Counter({6: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o'): Counter({2: 3, 3: 3, 4: 3, 6: 3, 7: 3}),\n",
+       " ('x', 'x', '.', 'o', 'o', 'x', '.', 'o', 'x'): Counter({2: 3, 6: 3}),\n",
+       " ('x', 'x', 'o', 'o', 'x', '.', '.', 'o', '.'): Counter({5: 3, 6: 3, 8: 3}),\n",
+       " ('o', 'o', '.', 'o', 'x', 'x', '.', 'x', '.'): Counter({2: 3, 6: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', 'o', '.', 'o', 'x', 'x', '.'): Counter({4: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'o'): Counter({1: 3, 2: 3, 3: 3, 6: 3}),\n",
+       " ('x', 'x', 'o', 'x', 'o', '.', '.', 'o', '.'): Counter({5: 3, 6: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({1: 3, 3: 3, 5: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x'): Counter({4: 3, 5: 3, 6: 3, 7: 3}),\n",
+       " ('x', 'x', 'o', 'x', 'o', 'o', '.', 'o', 'x'): Counter({6: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x'): Counter({3: 3, 5: 3, 6: 3, 7: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.'): Counter({2: 3, 3: 3, 4: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', 'o', 'x', '.', 'x', 'o', '.'): Counter({5: 3, 8: 3}),\n",
+       " ('x', 'o', 'o', '.', '.', 'x', 'x', '.', 'o'): Counter({3: 3, 4: 3, 7: 3}),\n",
+       " ('o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({2: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'o', '.', '.', 'x', 'o', 'x', '.', 'o'): Counter({2: 3, 3: 3, 7: 3}),\n",
+       " ('x', 'o', 'x', 'o', '.', 'o', 'x', '.', 'x'): Counter({4: 3, 7: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.'): Counter({3: 3, 5: 3, 6: 3, 8: 3}),\n",
+       " ('x', 'o', 'o', '.', 'x', '.', 'x', '.', 'o'): Counter({3: 3, 5: 3, 7: 3}),\n",
+       " ('o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.'): Counter({2: 3, 4: 3, 6: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.'): Counter({2: 3, 3: 3, 5: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'x'): Counter({2: 3, 3: 3, 4: 3, 5: 3, 7: 3}),\n",
+       " ('x', 'x', '.', '.', 'o', 'o', 'x', 'o', '.'): Counter({2: 3, 3: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.'): Counter({2: 3, 4: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', 'o', 'x', 'o', 'x', '.', '.'): Counter({7: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', 'x', '.', 'x', 'o', 'o', '.'): Counter({4: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', 'o', '.', '.', '.', 'o', 'x'): Counter({4: 3, 5: 3, 6: 3}),\n",
+       " ('o', 'x', 'o', 'x', '.', 'x', 'o', 'x', '.'): Counter({4: 3, 8: 3}),\n",
+       " ('x', 'x', '.', 'o', 'o', '.', '.', 'o', 'x'): Counter({2: 3, 5: 3, 6: 3}),\n",
+       " ('x', 'x', 'o', 'o', '.', '.', 'x', 'o', 'x'): Counter({4: 3, 5: 3}),\n",
+       " ('o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.'): Counter({2: 3, 3: 3, 4: 3, 5: 3, 6: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o'): Counter({2: 3, 3: 3, 6: 3, 7: 3}),\n",
+       " ('o', 'x', '.', 'o', 'x', 'x', '.', '.', 'o'): Counter({2: 3, 6: 3, 7: 3}),\n",
+       " ('x', 'x', 'o', '.', 'x', 'o', 'o', '.', '.'): Counter({3: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'x', '.', 'o', '.', 'o', '.', 'o', 'x'): Counter({2: 3, 4: 3, 6: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x'): Counter({2: 3, 3: 3, 4: 3, 5: 3, 6: 3, 7: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({2: 3, 4: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', 'x', 'o', 'o', '.', '.', 'x'): Counter({6: 3, 7: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x'): Counter({3: 3, 4: 3, 6: 3, 7: 3}),\n",
+       " ('o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o'): Counter({2: 3, 4: 3, 6: 3, 7: 3}),\n",
+       " ('.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({0: 3, 2: 3, 5: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('o', 'x', '.', '.', 'x', 'x', 'o', 'o', '.'): Counter({2: 3, 3: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', 'x', 'o', '.', '.', 'o', 'x'): Counter({5: 3, 6: 3}),\n",
+       " ('x', 'x', 'o', 'o', 'x', 'x', 'o', '.', '.'): Counter({7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o'): Counter({1: 3, 3: 3, 4: 3, 6: 3, 7: 3}),\n",
+       " ('x', 'o', '.', 'o', 'x', 'x', '.', 'x', 'o'): Counter({2: 3, 6: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.'): Counter({4: 3, 5: 3, 6: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({3: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'o', 'x', 'o', '.', 'o', '.', 'x', '.'): Counter({4: 3, 6: 3, 8: 3}),\n",
+       " ('x', 'o', 'o', '.', 'x', '.', '.', 'x', 'o'): Counter({3: 3, 5: 3, 6: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'o'): Counter({2: 3, 3: 3, 5: 3, 6: 3}),\n",
+       " ('x', 'o', 'x', '.', 'o', '.', 'o', 'x', '.'): Counter({3: 3, 5: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.'): Counter({1: 3, 3: 3, 4: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'x', '.', 'o', 'o', '.', 'x', 'o', '.'): Counter({2: 3, 5: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', '.', 'x', 'o', 'x', 'o', '.'): Counter({3: 3, 8: 3}),\n",
+       " ('x', 'x', '.', 'o', 'x', '.', '.', 'o', 'o'): Counter({2: 3, 5: 3, 6: 3}),\n",
+       " ('o', 'x', 'o', 'x', 'x', '.', '.', '.', 'o'): Counter({5: 3, 6: 3, 7: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({2: 3, 4: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.'): Counter({2: 3, 3: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', '.', 'x', 'x', 'o', 'o', '.'): Counter({3: 3, 8: 3}),\n",
+       " ('o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({2: 3, 4: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'x', '.', 'o', 'o', '.', 'o', '.', 'x'): Counter({2: 3, 5: 3, 7: 3}),\n",
+       " ('x', 'o', 'x', '.', '.', '.', 'x', 'o', 'o'): Counter({3: 3, 4: 3, 5: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o'): Counter({2: 3, 4: 3, 5: 3, 6: 3, 7: 3}),\n",
+       " ('x', 'x', 'o', '.', '.', 'x', 'o', 'o', '.'): Counter({3: 3, 4: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.'): Counter({2: 3, 3: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'x', '.', '.', 'o', 'x', '.', 'o', 'o'): Counter({2: 3, 3: 3, 6: 3}),\n",
+       " ('x', 'x', 'o', 'o', '.', 'x', 'o', 'x', '.'): Counter({4: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', '.', 'x', '.', 'o', 'o', '.'): Counter({3: 3, 5: 3, 8: 3}),\n",
+       " ('o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.'): Counter({2: 3, 3: 3, 5: 3, 6: 3, 8: 3}),\n",
+       " ('x', 'x', '.', 'o', 'o', '.', 'o', 'x', '.'): Counter({2: 3, 5: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o'): Counter({2: 3, 4: 3, 5: 3, 7: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({3: 3, 4: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({3: 3, 4: 3, 5: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'x', '.', 'o', 'o', 'x', 'o', 'o', 'x'): Counter({2: 3}),\n",
+       " ('x', 'x', 'o', 'o', '.', '.', '.', 'x', 'o'): Counter({4: 3, 5: 3, 6: 3}),\n",
+       " ('x', 'o', 'o', '.', 'x', 'x', 'x', 'o', 'o'): Counter({3: 3}),\n",
+       " ('x', 'x', 'o', 'o', 'o', '.', 'x', 'o', 'x'): Counter({5: 3}),\n",
+       " ('x',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.'): Counter({1: 3, 3: 3, 4: 3, 5: 3, 6: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({1: 3, 2: 3, 3: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.'): Counter({2: 3, 4: 3, 6: 3, 8: 3}),\n",
+       " ('x', 'o', '.', '.', 'x', 'x', 'o', '.', 'o'): Counter({2: 3, 3: 3, 7: 3}),\n",
+       " ('x', '.', 'o', '.', 'x', 'x', 'o', '.', 'o'): Counter({1: 3, 3: 3, 7: 3}),\n",
+       " ('o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.'): Counter({2: 3, 4: 3, 6: 3, 8: 3}),\n",
+       " ('o',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.'): Counter({4: 3, 5: 3, 6: 3, 8: 3}),\n",
+       " ('o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o'): Counter({2: 3, 3: 3, 4: 3, 6: 3, 7: 3}),\n",
+       " ('x', 'x', 'o', 'o', 'o', '.', '.', 'x', 'x'): Counter({5: 3, 6: 3}),\n",
+       " ('x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o'): Counter({1: 3, 2: 3, 3: 3, 5: 3, 6: 3, 7: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.'): Counter({2: 3, 3: 3, 6: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'x'): Counter({2: 3, 3: 3, 5: 3, 7: 3}),\n",
+       " ('o', 'x', '.', 'x', 'x', 'o', '.', 'o', '.'): Counter({2: 3, 6: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.'): Counter({2: 3, 4: 3, 6: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'o',\n",
+       "  '.'): Counter({1: 3, 3: 3, 4: 3, 5: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', 'o', '.', 'o', 'o', 'x', 'x'): Counter({4: 3}),\n",
+       " ('x', 'x', 'o', 'x', 'o', '.', '.', '.', 'o'): Counter({5: 3, 6: 3, 7: 3}),\n",
+       " ('x', 'x', 'o', 'x', 'o', 'x', '.', 'o', '.'): Counter({6: 3, 8: 3}),\n",
+       " ('o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({2: 3, 4: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', '.', 'o', 'o', 'x', 'x', '.'): Counter({3: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', 'x', 'o', 'x', '.', 'o', 'o'): Counter({6: 3}),\n",
+       " ('x', 'x', '.', 'o', '.', 'o', 'x', 'o', '.'): Counter({2: 3, 4: 3, 8: 3}),\n",
+       " ('x', 'x', '.', '.', 'o', 'o', 'o', 'x', '.'): Counter({2: 3, 3: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.'): Counter({3: 3, 4: 3, 6: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({3: 3, 5: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', 'o', 'o', 'x', '.', '.', 'x'): Counter({6: 3, 7: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.'): Counter({3: 3, 5: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'x', '.', 'o', 'o', '.', 'x', 'o', 'x'): Counter({2: 3, 5: 3}),\n",
+       " ('x', 'x', 'o', 'o', '.', 'x', 'o', '.', '.'): Counter({4: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'x'): Counter({3: 3, 4: 3, 5: 3, 7: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.'): Counter({2: 3, 4: 3, 6: 3, 8: 3}),\n",
+       " ('x', '.', 'o', '.', '.', 'x', 'o', 'x', 'o'): Counter({1: 3, 3: 3, 4: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o'): Counter({2: 3, 4: 3, 6: 3, 7: 3}),\n",
+       " ('x', 'x', 'o', 'o', '.', '.', 'o', 'x', 'x'): Counter({4: 3, 5: 3}),\n",
+       " ('x', 'x', 'o', '.', '.', 'x', '.', 'o', 'o'): Counter({3: 3, 4: 3, 6: 3}),\n",
+       " ('x', 'x', 'o', 'o', 'o', 'x', 'x', 'x', 'o'): Counter(),\n",
+       " ('x', 'x', '.', '.', 'x', 'o', 'o', 'o', '.'): Counter({2: 3, 3: 3, 8: 3}),\n",
+       " ('x', 'x', '.', 'o', 'x', 'o', 'o', '.', '.'): Counter({2: 3, 7: 3, 8: 3}),\n",
+       " ('o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({1: 3, 2: 3, 3: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('o',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({4: 3, 5: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.'): Counter({3: 3, 4: 3, 5: 3, 8: 3}),\n",
+       " ('o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o'): Counter({2: 3, 4: 3, 5: 3, 6: 3, 7: 3}),\n",
+       " ('x', 'x', 'o', '.', '.', 'o', 'o', 'x', '.'): Counter({3: 3, 4: 3, 8: 3}),\n",
+       " ('.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.'): Counter({0: 3, 2: 3, 5: 3, 6: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'x'): Counter({2: 3, 3: 3, 4: 3, 7: 3}),\n",
+       " ('x', 'o', 'o', '.', 'x', 'o', 'x', '.', '.'): Counter({3: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o'): Counter({2: 3, 3: 3, 4: 3, 6: 3, 7: 3}),\n",
+       " ('o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.'): Counter({2: 3, 3: 3, 5: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.'): Counter({3: 3, 4: 3, 5: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  'o'): Counter({2: 3, 3: 3, 4: 3, 5: 3}),\n",
+       " ('x', 'x', 'o', '.', 'o', '.', 'x', 'x', 'o'): Counter({3: 3, 5: 3}),\n",
+       " ('x', 'x', 'o', '.', '.', 'x', 'x', 'o', 'o'): Counter({3: 3, 4: 3}),\n",
+       " ('x', 'x', 'o', '.', 'x', '.', 'o', '.', 'o'): Counter({3: 3, 5: 3, 7: 3}),\n",
+       " ('o',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.'): Counter({2: 3, 3: 3, 6: 3, 8: 3}),\n",
+       " ('x', 'x', '.', 'o', 'o', 'x', 'x', 'o', '.'): Counter({2: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', 'o', '.', '.', 'x', 'x', 'o'): Counter({4: 3, 5: 3}),\n",
+       " ('x', 'o', 'o', '.', 'x', 'x', 'o', '.', '.'): Counter({3: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', 'x', '.', 'o', '.', 'o', '.'): Counter({4: 3, 6: 3, 8: 3}),\n",
+       " ('.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({0: 3, 2: 3, 3: 3, 5: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.'): Counter({2: 3, 3: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', 'o', 'x', 'x', '.', 'o', 'o'): Counter({6: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.'): Counter({2: 3, 3: 3, 4: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.'): Counter({2: 3, 3: 3, 4: 3, 5: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'o', '.', 'o', 'x', 'x', '.', 'o', '.'): Counter({2: 3, 6: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', '.', '.', 'x', 'o', 'x', 'o'): Counter({3: 3, 4: 3}),\n",
+       " ('x', 'x', 'o', 'x', '.', 'o', 'o', 'o', 'x'): Counter({4: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.'): Counter({3: 3, 4: 3, 5: 3, 8: 3}),\n",
+       " ('x', 'x', '.', 'x', 'o', 'o', '.', 'o', '.'): Counter({2: 3, 6: 3, 8: 3}),\n",
+       " ('x', 'x', '.', '.', '.', 'o', 'o', 'o', 'x'): Counter({2: 3, 3: 3, 4: 3}),\n",
+       " ('x', 'x', 'o', 'o', 'x', 'o', 'x', 'o', '.'): Counter({8: 3}),\n",
+       " ('x', 'o', 'x', 'o', 'o', '.', '.', '.', 'x'): Counter({5: 3, 6: 3, 7: 3}),\n",
+       " ('x', 'x', '.', '.', 'o', 'x', 'x', 'o', 'o'): Counter({2: 3, 3: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.'): Counter({3: 3, 5: 3, 6: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x'): Counter({2: 3, 3: 3, 6: 3, 7: 3}),\n",
+       " ('x', 'o', 'o', 'o', 'x', '.', '.', 'x', '.'): Counter({5: 3, 6: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.'): Counter({3: 3, 4: 3, 5: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.'): Counter({1: 3, 3: 3, 5: 3, 7: 3, 8: 3}),\n",
+       " ('o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.'): Counter({2: 3, 3: 3, 4: 3, 6: 3, 8: 3}),\n",
+       " ('o',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({2: 3, 3: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.'): Counter({1: 3, 3: 3, 4: 3, 5: 3, 7: 3, 8: 3}),\n",
+       " ('.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({0: 3, 2: 3, 4: 3, 5: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.'): Counter({2: 3, 3: 3, 5: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o'): Counter({2: 3, 3: 3, 5: 3, 6: 3, 7: 3}),\n",
+       " ('o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.'): Counter({1: 3, 2: 3, 3: 3, 6: 3, 8: 3}),\n",
+       " ('o',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.'): Counter({2: 3, 3: 3, 4: 3, 6: 3, 8: 3}),\n",
+       " ('x', 'o', '.', '.', 'x', 'x', 'o', 'x', 'o'): Counter({2: 3, 3: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({2: 3, 5: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x', '.', 'o', '.', 'x', 'x', 'o', 'x', 'o'): Counter({1: 3, 3: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.'): Counter({2: 3, 5: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o'): Counter({2: 3, 3: 3, 4: 3, 7: 3}),\n",
+       " ('x', 'x', 'o', '.', 'o', 'x', 'x', 'o', '.'): Counter({3: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', 'o', '.', '.', 'x', '.', 'o'): Counter({4: 3, 5: 3, 7: 3}),\n",
+       " ('x', 'x', 'o', 'o', 'o', 'x', 'x', '.', '.'): Counter({7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o'): Counter({1: 3, 3: 3, 5: 3, 6: 3, 7: 3}),\n",
+       " ('x', 'x', '.', '.', 'x', 'o', 'x', 'o', 'o'): Counter({2: 3, 3: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x'): Counter({3: 3, 4: 3, 5: 3, 6: 3, 7: 3}),\n",
+       " ('x', 'x', 'o', '.', 'x', 'x', '.', 'o', 'o'): Counter({3: 3, 6: 3}),\n",
+       " ('x', 'o', 'x', '.', '.', '.', 'o', 'x', 'o'): Counter({3: 3, 4: 3, 5: 3}),\n",
+       " ('x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o'): Counter({1: 3, 2: 3, 3: 3, 4: 3, 6: 3, 7: 3}),\n",
+       " ('x', 'o', 'o', 'o', 'x', 'x', '.', 'x', 'o'): Counter({6: 3}),\n",
+       " ('x', 'x', 'o', '.', 'o', 'x', 'x', 'o', 'o'): Counter({3: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x'): Counter({2: 3, 5: 3, 6: 3, 7: 3}),\n",
+       " ('x',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.'): Counter({1: 3, 3: 3, 5: 3, 6: 3, 8: 3}),\n",
+       " ('x', 'o', 'o', '.', 'x', '.', 'x', 'o', '.'): Counter({3: 3, 5: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', '.', 'o', 'o', 'x', '.', 'x'): Counter({3: 3, 7: 3}),\n",
+       " ('x', 'x', '.', 'o', '.', 'o', 'x', '.', 'o'): Counter({2: 3, 4: 3, 7: 3}),\n",
+       " ('o', 'x', '.', '.', 'o', 'x', 'o', 'x', '.'): Counter({2: 3, 3: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o'): Counter({2: 3, 3: 3, 5: 3, 7: 3}),\n",
+       " ('o', 'x', 'o', 'x', '.', 'x', '.', 'o', '.'): Counter({4: 3, 6: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({3: 3, 4: 3, 5: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.'): Counter({4: 3, 5: 3, 7: 3, 8: 3}),\n",
+       " ('o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.'): Counter({2: 3, 3: 3, 4: 3, 8: 3}),\n",
+       " ('x', 'x', '.', 'o', 'o', 'x', 'o', '.', '.'): Counter({2: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'x', '.', 'o', 'x', '.', 'o', '.', 'o'): Counter({2: 3, 5: 3, 7: 3}),\n",
+       " ('x',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({1: 3, 3: 3, 5: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('o',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({5: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({2: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', 'o', 'o', '.', '.', 'x', '.'): Counter({5: 3, 6: 3, 8: 3}),\n",
+       " ('x', 'x', '.', '.', '.', 'o', 'o', 'x', 'o'): Counter({2: 3, 3: 3, 4: 3}),\n",
+       " ('x', 'x', 'o', '.', 'o', 'o', '.', '.', 'x'): Counter({3: 3, 6: 3, 7: 3}),\n",
+       " ('x', 'x', 'o', 'x', '.', '.', '.', 'o', 'o'): Counter({4: 3, 5: 3, 6: 3}),\n",
+       " ('o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.'): Counter({2: 3, 3: 3, 4: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.'): Counter({1: 3, 3: 3, 4: 3, 6: 3, 7: 3, 8: 3}),\n",
+       " ('x',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  'x',\n",
+       "  '.',\n",
+       "  'o'): Counter({2: 3, 3: 3, 4: 3, 7: 3}),\n",
+       " ('x', 'o', '.', '.', 'o', 'x', 'x', '.', 'o'): Counter({2: 3, 3: 3, 7: 3}),\n",
+       " ('x',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  '.',\n",
+       "  'o',\n",
+       "  '.',\n",
+       "  'x',\n",
+       "  '.'): Counter({2: 3, 3: 3, 4: 3, 6: 3, 8: 3}),\n",
+       " ('x', 'x', 'o', '.', '.', 'o', 'x', 'o', '.'): Counter({3: 3, 4: 3, 8: 3})}"
+      ]
+     },
+     "execution_count": 214,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "new_menace()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 53,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def menace_move(game):\n",
+    "    board, r, f = canonical(game['board'])\n",
+    "    player = active_player(game)\n",
+    "    token = token_for_player(game['player1_active'])\n",
+    "    cmove = random.choice(list(player[board].elements()))\n",
+    "    cmove_board = apply_move(empty_board(), cmove, token)\n",
+    "    moved_board = untransform(cmove_board, r, f)\n",
+    "    return moved_board.index(token)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 48,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def new_human():\n",
+    "    return {'human?': True}"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 71,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def human_move(game):\n",
+    "    if game['history']:\n",
+    "        print('Opponent moved to', game['history'][-1]['move'])\n",
+    "    else:\n",
+    "        print('You play first.')\n",
+    "    print('The board is:')\n",
+    "    print(show_board(game['board']))\n",
+    "    \n",
+    "    valid_moves = vacants(game['board'])\n",
+    "    valid_input = False\n",
+    "    \n",
+    "    while not valid_input:\n",
+    "        user_input = input('Your move ({})? '.format(', '.join(str(m) for m in valid_moves)))\n",
+    "        if user_input.isnumeric():\n",
+    "            move = int(user_input)\n",
+    "            if move in valid_moves:\n",
+    "                valid_input = True\n",
+    "            else:\n",
+    "                print('Number not a valid move.')\n",
+    "        else:\n",
+    "            print('Please enter a number.')\n",
+    "    return move"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 61,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def make_move(game):\n",
+    "    if game['player1_active']:\n",
+    "        active = game['player1']\n",
+    "    else:\n",
+    "        active = game['player2']\n",
+    "    if active['human?']:\n",
+    "        move = human_move(game)\n",
+    "    else:\n",
+    "        move = menace_move(game)\n",
+    "    token = token_for_player(game['player1_active'])\n",
+    "    game['history'] += [{'player1?': game['player1_active'], 'move': move, 'board': game['board']}]\n",
+    "    game['board'] = apply_move(game['board'], move, token)\n",
+    "    game['player1_active'] = not game['player1_active'] "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 215,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(('x', '.', '.', '.', '.', 'o', 'o', 'x', '.'),\n",
+       " [{'board': ('.', '.', '.', '.', '.', '.', '.', '.', '.'),\n",
+       "   'move': 0,\n",
+       "   'player1?': True},\n",
+       "  {'board': ('x', '.', '.', '.', '.', '.', '.', '.', '.'),\n",
+       "   'move': 5,\n",
+       "   'player1?': False},\n",
+       "  {'board': ('x', '.', '.', '.', '.', 'o', '.', '.', '.'),\n",
+       "   'move': 7,\n",
+       "   'player1?': True},\n",
+       "  {'board': ('x', '.', '.', '.', '.', 'o', '.', 'x', '.'),\n",
+       "   'move': 6,\n",
+       "   'player1?': False}])"
+      ]
+     },
+     "execution_count": 215,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "p1 = new_menace()\n",
+    "p2 = new_menace()\n",
+    "g = new_game(p1, p2)\n",
+    "for _ in range(4):\n",
+    "    make_move(g)\n",
+    "g['board'], g['history']"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 63,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def play_game(game):\n",
+    "    while not game_finished(game):\n",
+    "        make_move(game)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 80,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def winning_player(game):\n",
+    "    if winner(game['board']) is None:\n",
+    "        return None\n",
+    "    elif game['history'][-1]['player1?']:\n",
+    "        return game['player1']\n",
+    "    else:\n",
+    "        return game['player2']\n",
+    "\n",
+    "def losing_player(game):\n",
+    "    if winner(game['board']) is None:\n",
+    "        return None\n",
+    "    elif game['history'][-1]['player1?']:\n",
+    "        return game['player2']\n",
+    "    else:\n",
+    "        return game['player1'] "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 216,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(('.', 'x', 'x', '.', 'x', 'o', 'o', 'x', 'o'),\n",
+       " [{'board': ('.', '.', '.', '.', '.', '.', '.', '.', '.'),\n",
+       "   'move': 1,\n",
+       "   'player1?': True},\n",
+       "  {'board': ('.', 'x', '.', '.', '.', '.', '.', '.', '.'),\n",
+       "   'move': 5,\n",
+       "   'player1?': False},\n",
+       "  {'board': ('.', 'x', '.', '.', '.', 'o', '.', '.', '.'),\n",
+       "   'move': 4,\n",
+       "   'player1?': True},\n",
+       "  {'board': ('.', 'x', '.', '.', 'x', 'o', '.', '.', '.'),\n",
+       "   'move': 6,\n",
+       "   'player1?': False},\n",
+       "  {'board': ('.', 'x', '.', '.', 'x', 'o', 'o', '.', '.'),\n",
+       "   'move': 2,\n",
+       "   'player1?': True},\n",
+       "  {'board': ('.', 'x', 'x', '.', 'x', 'o', 'o', '.', '.'),\n",
+       "   'move': 8,\n",
+       "   'player1?': False},\n",
+       "  {'board': ('.', 'x', 'x', '.', 'x', 'o', 'o', '.', 'o'),\n",
+       "   'move': 7,\n",
+       "   'player1?': True}])"
+      ]
+     },
+     "execution_count": 216,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "p1 = new_menace()\n",
+    "p2 = new_menace()\n",
+    "g = new_game(p1, p2)\n",
+    "play_game(g)\n",
+    "g['board'], g['history']"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 217,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      ".xx\n",
+      ".xo\n",
+      "oxo\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(show_board(g['board']))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 218,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'x'"
+      ]
+     },
+     "execution_count": 218,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "winner(g['board'])"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 219,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "You play first.\n",
+      "The board is:\n",
+      "...\n",
+      "...\n",
+      "...\n",
+      "Your move (0, 1, 2, 3, 4, 5, 6, 7, 8)? 4\n",
+      "Opponent moved to 5\n",
+      "The board is:\n",
+      "...\n",
+      ".xo\n",
+      "...\n",
+      "Your move (0, 1, 2, 3, 6, 7, 8)? 2\n",
+      "Opponent moved to 3\n",
+      "The board is:\n",
+      "..x\n",
+      "oxo\n",
+      "...\n",
+      "Your move (0, 1, 6, 7, 8)? 6\n",
+      "\n",
+      "Final position\n",
+      "..x\n",
+      "oxo\n",
+      "x..\n",
+      "You won\n"
+     ]
+    }
+   ],
+   "source": [
+    "p1 = new_menace()\n",
+    "ph = new_human()\n",
+    "if random.choice([True, False]):\n",
+    "    g = new_game(p1, ph)\n",
+    "else:\n",
+    "    g = new_game(ph, p1)\n",
+    "play_game(g)\n",
+    "\n",
+    "print('\\nFinal position')\n",
+    "print(show_board(g['board']))\n",
+    "if winner(g['board']) is None:\n",
+    "    print('A draw')\n",
+    "elif winning_player(g) == ph:\n",
+    "    print('You won')\n",
+    "else:\n",
+    "    print('You lost')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 220,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "..x\n",
+      "oxo\n",
+      "x..\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(show_board(g['board']))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 91,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def winning_moves(game):\n",
+    "    return [h for h in game['history'] \n",
+    "            if h['player1?'] == game['history'][-1]['player1?']]\n",
+    "\n",
+    "def losing_moves(game):\n",
+    "      return [h for h in game['history'] \n",
+    "            if h['player1?'] != game['history'][-1]['player1?']]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 130,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def update_players(game, allow_drop_move=False):\n",
+    "    if winner(game['board']) is not None:\n",
+    "        update_winner(game)\n",
+    "        update_loser(game, allow_drop_move=allow_drop_move)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 111,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def update_winner(game):\n",
+    "    player = winning_player(game)\n",
+    "    moves = winning_moves(game)\n",
+    "    for m in moves:\n",
+    "        board, r, f = canonical(m['board'])\n",
+    "        move_board = apply_move(empty_board(), m['move'], '+')\n",
+    "        cmove_board = transform(move_board, r, f)\n",
+    "        cmove = cmove_board.index('+')\n",
+    "        player[board][cmove] += 1"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 126,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "def update_loser(game, allow_drop_move=False):\n",
+    "    player = losing_player(game)\n",
+    "    moves = losing_moves(game)\n",
+    "    for m in moves:\n",
+    "        board, r, f = canonical(m['board'])\n",
+    "        move_board = apply_move(empty_board(), m['move'], '+')\n",
+    "        cmove_board = transform(move_board, r, f)\n",
+    "        cmove = cmove_board.index('+')\n",
+    "#         if player[board][cmove] > 1:\n",
+    "#             player[board][cmove] -= 1\n",
+    "        if allow_drop_move:\n",
+    "            if len(list(player[board].elements())) > 1:\n",
+    "                player[board][cmove] -= 1\n",
+    "        else:\n",
+    "            if player[board][cmove] > 1:\n",
+    "                player[board][cmove] -= 1\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 221,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "({('x', '.', 'o', '.', 'o', 'x', '.', 'x', 'o'): Counter({1: 1, 3: 1, 6: 3}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({3: 2, 4: 5, 5: 2, 6: 3, 8: 5}),\n",
+       "  ('x', 'x', '.', 'o', '.', 'x', 'o', 'o', 'x'): Counter({2: 1, 4: 1}),\n",
+       "  ('o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({1: 27, 2: 494, 3: 446, 6: 1146, 8: 88}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 1, 3: 1, 6: 1, 7: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 5, 3: 10, 4: 6, 7: 3, 8: 3}),\n",
+       "  ('x', 'x', '.', '.', 'o', 'x', 'o', 'x', 'o'): Counter({2: 12, 3: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 1, 4: 1, 5: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'o'): Counter({2: 3, 3: 1, 4: 3, 5: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 3, 3: 10, 4: 22, 5: 7, 6: 7, 7: 12, 8: 16}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({5: 1, 6: 1, 7: 1, 8: 1}),\n",
+       "  ('x', 'o', 'o', '.', 'x', 'x', '.', 'x', 'o'): Counter({3: 3, 6: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   'x'): Counter({2: 2, 3: 1, 4: 1, 5: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({3: 13, 6: 25, 7: 2, 8: 6}),\n",
+       "  ('x', 'o', 'o', '.', 'x', 'o', '.', 'x', '.'): Counter({3: 1, 6: 1, 8: 115}),\n",
+       "  ('x', 'x', '.', 'o', '.', 'x', 'x', 'o', 'o'): Counter({2: 3, 4: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({2: 1, 3: 2, 6: 4, 8: 1}),\n",
+       "  ('x', 'x', '.', '.', 'o', 'x', 'o', 'o', '.'): Counter({2: 23, 3: 1, 8: 1}),\n",
+       "  ('.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({0: 9, 2: 3, 6: 5, 7: 2, 8: 3}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 2, 4: 3, 5: 2, 6: 3, 7: 3, 8: 5}),\n",
+       "  ('x', 'x', '.', 'o', 'o', 'x', '.', 'x', 'o'): Counter({2: 3, 6: 1}),\n",
+       "  ('o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({1: 8, 3: 4, 5: 4, 6: 2, 8: 2}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({3: 3, 5: 12, 6: 2, 7: 7}),\n",
+       "  ('x', 'x', 'o', 'x', '.', 'x', 'o', '.', 'o'): Counter({4: 4, 7: 6}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({1: 2, 3: 3, 4: 3, 6: 4, 8: 5}),\n",
+       "  ('x', 'x', 'o', 'o', '.', '.', 'o', '.', 'x'): Counter({4: 4, 5: 3, 7: 2}),\n",
+       "  ('x', 'x', '.', '.', 'x', 'o', '.', 'o', 'o'): Counter({2: 189, 3: 1, 6: 1}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 1, 3: 1, 6: 1, 7: 1, 8: 6}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 209, 3: 301, 5: 454, 6: 475, 8: 269}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({1: 3, 3: 5, 4: 8, 6: 3, 8: 2}),\n",
+       "  ('x', 'o', 'x', 'o', 'x', 'o', 'o', 'x', '.'): Counter({8: 1277}),\n",
+       "  ('o', 'x', 'o', 'x', '.', '.', '.', 'x', 'o'): Counter({4: 5, 5: 2, 6: 1}),\n",
+       "  ('o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({1: 8, 2: 23, 3: 7, 4: 4, 6: 1, 7: 2, 8: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({3: 2, 4: 1, 5: 3, 6: 3, 7: 3}),\n",
+       "  ('x', 'x', '.', 'o', '.', 'x', 'o', 'o', '.'): Counter({2: 3, 4: 4, 8: 3}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 6, 3: 6, 6: 5, 7: 1, 8: 5}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 36, 3: 89, 5: 77, 6: 166, 7: 89}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({4: 5, 6: 1, 7: 1, 8: 2}),\n",
+       "  ('o', 'x', 'o', 'x', 'o', 'x', '.', '.', '.'): Counter({6: 2, 7: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({2: 1, 3: 1, 6: 1, 8: 3}),\n",
+       "  ('x', 'x', 'o', '.', 'x', '.', 'x', 'o', 'o'): Counter({3: 3, 5: 26}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({1: 2, 2: 16, 3: 15, 4: 14, 6: 25, 7: 2, 8: 12}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 1, 3: 1, 5: 1, 6: 1, 7: 1, 8: 1}),\n",
+       "  ('x', 'x', 'o', '.', 'o', 'x', '.', '.', 'o'): Counter({3: 1, 6: 7, 7: 2}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 1, 5: 1, 6: 1, 7: 1}),\n",
+       "  ('x', 'o', '.', 'o', 'x', 'x', '.', '.', 'o'): Counter({2: 11, 6: 75, 7: 3}),\n",
+       "  ('x', 'x', '.', 'o', 'x', 'x', 'o', 'o', '.'): Counter({2: 1, 8: 22}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o'): Counter({2: 4, 3: 4, 4: 3, 5: 3, 6: 4}),\n",
+       "  ('x', 'x', '.', 'o', 'o', 'x', 'x', 'o', 'o'): Counter({2: 27}),\n",
+       "  ('x', 'x', '.', '.', 'o', 'o', '.', 'x', 'o'): Counter({2: 11, 3: 2, 6: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 1, 6: 1, 7: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.'): Counter({2: 4, 4: 1, 5: 2, 8: 1}),\n",
+       "  ('x', 'o', 'x', '.', 'x', '.', 'o', 'o', '.'): Counter({3: 1, 5: 1, 8: 110}),\n",
+       "  ('x', 'x', 'o', 'o', '.', 'x', 'x', 'o', '.'): Counter({4: 3, 8: 3}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({3: 1, 6: 1, 7: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({2: 8, 5: 9, 6: 4, 8: 3}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x'): Counter({2: 2, 3: 3, 4: 4, 5: 4, 6: 3}),\n",
+       "  ('x', 'o', 'x', 'o', '.', '.', 'o', '.', 'x'): Counter({4: 4, 5: 6, 7: 6}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 4, 3: 1, 6: 2, 7: 1}),\n",
+       "  ('x', 'x', '.', '.', '.', 'o', 'x', 'o', 'o'): Counter({2: 5, 3: 5, 4: 3}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x'): Counter({2: 1, 3: 1, 5: 1, 6: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({4: 5, 5: 2, 6: 2, 7: 2, 8: 1}),\n",
+       "  ('x', 'x', 'o', 'x', '.', 'x', '.', 'o', 'o'): Counter({4: 1, 6: 9}),\n",
+       "  ('x', 'o', 'o', 'o', 'x', 'x', '.', 'x', '.'): Counter({6: 1, 8: 3}),\n",
+       "  ('x', 'x', 'o', '.', 'o', 'x', 'x', '.', 'o'): Counter({3: 3, 7: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.'): Counter({3: 3, 4: 7, 5: 3, 8: 3}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({1: 5, 2: 2, 3: 3, 6: 5, 7: 4}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({5: 15, 6: 487, 7: 10}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 1, 5: 1, 6: 1, 7: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({5: 14, 6: 1, 7: 439}),\n",
+       "  ('x', 'x', '.', '.', 'o', '.', 'o', 'x', 'o'): Counter({2: 10, 3: 1, 5: 1}),\n",
+       "  ('x', 'x', 'o', 'o', 'o', 'x', '.', 'o', 'x'): Counter({6: 3}),\n",
+       "  ('.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({0: 747, 2: 600, 5: 1, 6: 499, 8: 184}),\n",
+       "  ('.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({0: 1, 1: 1, 2: 1, 3: 1, 5: 1, 6: 1, 7: 1, 8: 1}),\n",
+       "  ('x', 'x', 'o', '.', 'x', 'x', 'o', '.', 'o'): Counter({3: 1, 7: 18}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({6: 11, 7: 11, 8: 681}),\n",
+       "  ('.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({0: 14, 2: 5, 3: 1, 4: 5, 5: 2, 6: 9, 8: 4}),\n",
+       "  ('x', 'x', '.', 'o', '.', '.', 'x', 'o', 'o'): Counter({2: 4, 4: 3, 5: 3}),\n",
+       "  ('x', 'x', 'o', 'o', '.', 'x', 'x', 'o', 'o'): Counter({4: 3}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 1, 3: 4, 4: 5, 5: 5, 8: 3}),\n",
+       "  ('.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({0: 1, 2: 1, 5: 1, 6: 1, 7: 1, 8: 1}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({2: 3, 4: 8, 5: 2, 6: 7, 8: 5}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({6: 1, 7: 233, 8: 399}),\n",
+       "  ('x', 'x', 'o', '.', 'x', 'o', '.', 'o', '.'): Counter({3: 1, 6: 1, 8: 172}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({3: 3, 4: 3, 7: 2, 8: 8}),\n",
+       "  'human?': False,\n",
+       "  ('x', 'x', 'o', '.', 'o', 'o', '.', 'x', 'x'): Counter({3: 11, 6: 14}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 1, 6: 1, 7: 1, 8: 1}),\n",
+       "  ('x', 'x', 'o', 'x', 'x', 'o', 'o', 'o', '.'): Counter({8: 11}),\n",
+       "  ('x', 'x', '.', 'x', 'o', 'o', '.', '.', 'o'): Counter({2: 7, 6: 5, 7: 3}),\n",
+       "  ('x', 'o', 'x', 'o', '.', '.', '.', 'o', 'x'): Counter({4: 7, 5: 4, 6: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({3: 1268, 5: 788, 6: 687, 7: 14, 8: 1807}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 1, 4: 1, 5: 2, 6: 1, 7: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({1: 3, 2: 1, 3: 1, 4: 1, 6: 8, 8: 2}),\n",
+       "  ('x', 'x', 'o', '.', 'x', '.', '.', 'o', 'o'): Counter({3: 1, 5: 1, 6: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 6, 3: 4, 4: 3, 6: 3, 8: 3}),\n",
+       "  ('x', 'o', '.', 'o', '.', 'x', '.', 'x', 'o'): Counter({2: 3, 4: 3, 6: 3}),\n",
+       "  ('x', 'x', 'o', 'o', 'o', 'x', 'x', 'o', 'x'): Counter(),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.'): Counter({3: 25, 5: 1, 7: 1, 8: 2}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 1, 3: 1, 5: 1, 8: 1}),\n",
+       "  ('x', 'x', 'o', 'o', 'x', '.', 'x', 'o', 'o'): Counter({5: 3}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x'): Counter({2: 3, 3: 5, 4: 4, 6: 4, 7: 4}),\n",
+       "  ('x', 'x', 'o', '.', '.', 'o', 'x', 'o', 'x'): Counter({3: 1, 4: 1}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x'): Counter({1: 1, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x'): Counter({1: 1, 3: 2, 5: 1, 6: 3, 7: 1}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({1: 12, 3: 3, 5: 5, 7: 4, 8: 7}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 1, 3: 1, 5: 1, 7: 20}),\n",
+       "  ('x', 'o', 'x', '.', 'x', '.', 'o', '.', 'o'): Counter({3: 1, 5: 1, 7: 3}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o'): Counter({1: 3, 3: 3, 4: 7, 6: 3}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({1: 1, 3: 451, 5: 807, 6: 1025, 8: 1897}),\n",
+       "  ('x', 'o', 'o', 'o', 'x', 'x', 'o', 'x', '.'): Counter({8: 413}),\n",
+       "  ('x', 'x', 'o', '.', 'o', '.', 'x', 'o', '.'): Counter({3: 11, 5: 3, 8: 3}),\n",
+       "  ('x', 'x', 'o', 'o', 'x', 'x', '.', '.', 'o'): Counter({6: 1, 7: 3}),\n",
+       "  ('x', 'x', 'o', '.', '.', '.', 'x', 'o', 'o'): Counter({3: 9, 4: 2, 5: 3}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.'): Counter({1: 2, 3: 1, 5: 1, 8: 1}),\n",
+       "  ('o', 'x', '.', 'x', 'o', 'x', '.', 'o', '.'): Counter({2: 1, 6: 2, 8: 3}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({1: 43, 2: 1, 3: 1, 6: 2, 8: 1}),\n",
+       "  ('x', 'x', 'o', 'o', 'x', 'x', 'o', 'o', '.'): Counter({8: 227}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({2: 1, 3: 1, 4: 1, 5: 1, 6: 1, 8: 1}),\n",
+       "  ('x', 'x', 'o', '.', 'o', '.', '.', 'x', 'o'): Counter({3: 1, 5: 1, 6: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o'): Counter({3: 2, 4: 4, 5: 5, 6: 4}),\n",
+       "  ('x', 'x', 'o', 'o', 'x', 'x', '.', 'o', '.'): Counter({6: 1, 8: 3}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({3: 1, 5: 1, 6: 1, 8: 1}),\n",
+       "  ('x', 'x', '.', '.', 'o', 'o', 'x', '.', 'o'): Counter({2: 17, 3: 7, 7: 1}),\n",
+       "  ('x', 'x', 'o', 'o', 'o', '.', 'x', 'x', '.'): Counter({5: 19, 8: 3}),\n",
+       "  ('x', 'x', 'o', 'o', 'o', 'x', 'x', 'o', '.'): Counter({8: 3}),\n",
+       "  ('o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({1: 442, 2: 5384, 3: 1790, 5: 7, 6: 14740, 7: 8, 8: 1}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'o'): Counter({1: 3, 2: 2, 3: 3, 4: 3, 6: 6}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 106, 3: 2, 5: 2, 6: 1, 7: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 3, 3: 7, 4: 3, 5: 3, 7: 3}),\n",
+       "  ('x', 'x', 'o', 'o', 'o', 'x', '.', 'x', '.'): Counter({6: 22, 8: 3}),\n",
+       "  ('x', 'o', 'x', 'o', 'o', '.', '.', 'x', '.'): Counter({5: 7, 6: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({3: 1237, 6: 20, 7: 3}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o'): Counter({1: 2, 2: 3, 3: 3, 6: 3}),\n",
+       "  ('.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({0: 3, 2: 4, 4: 3, 5: 1, 6: 3, 8: 2}),\n",
+       "  ('x', 'o', 'o', 'o', '.', 'x', '.', 'x', '.'): Counter({4: 3, 6: 5, 8: 4}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({4: 3, 5: 1, 6: 8, 8: 1}),\n",
+       "  ('x', 'x', '.', 'o', 'o', 'x', 'o', 'x', 'o'): Counter({2: 20}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 1, 3: 1, 5: 1, 7: 1}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({1: 5, 2: 3, 3: 2, 4: 16, 5: 2, 6: 11, 7: 4}),\n",
+       "  ('x', 'x', 'o', 'o', 'o', '.', 'x', '.', '.'): Counter({5: 3, 7: 1, 8: 1}),\n",
+       "  ('x', 'x', 'o', 'x', '.', 'o', 'o', '.', '.'): Counter({4: 2, 7: 1, 8: 4}),\n",
+       "  ('x', 'x', '.', 'o', '.', 'x', '.', 'o', 'o'): Counter({2: 5, 4: 3, 6: 3}),\n",
+       "  ('x', 'o', '.', '.', 'o', 'o', 'x', '.', 'x'): Counter({2: 2, 3: 4, 7: 3}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({3: 1, 5: 1, 7: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({4: 1, 5: 1, 6: 1, 8: 1}),\n",
+       "  ('x', 'x', 'o', '.', '.', '.', 'o', 'o', 'x'): Counter({3: 1, 4: 4, 5: 3}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({5: 31, 7: 38, 8: 43}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 4, 3: 745, 5: 519, 7: 305, 8: 2804}),\n",
+       "  ('x', 'o', 'o', '.', '.', 'o', 'x', '.', 'x'): Counter({3: 3, 4: 4, 7: 5}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o'): Counter({1: 1, 3: 1, 5: 1, 7: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 79, 3: 123, 8: 124}),\n",
+       "  ('x', 'x', 'o', 'o', 'o', 'x', 'x', '.', 'o'): Counter({7: 3}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.'): Counter({4: 4, 5: 9, 7: 1, 8: 5}),\n",
+       "  ('x', 'x', 'o', '.', '.', 'o', 'o', '.', 'x'): Counter({3: 3, 4: 5, 7: 3}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 295, 6: 110, 8: 303}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 1, 5: 1, 6: 1, 8: 1}),\n",
+       "  ('o', 'x', 'o', 'x', '.', 'x', 'o', '.', '.'): Counter({4: 7, 7: 2, 8: 4}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x'): Counter({2: 4, 4: 14, 6: 3, 7: 2}),\n",
+       "  ('x', 'x', 'o', 'x', '.', 'o', '.', 'o', 'x'): Counter({4: 1, 6: 1}),\n",
+       "  ('x', 'o', '.', '.', '.', 'x', 'o', 'x', 'o'): Counter({2: 3, 3: 4, 4: 5}),\n",
+       "  ('x', 'x', 'o', 'o', '.', 'o', '.', 'x', 'x'): Counter({4: 7, 6: 3}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 2, 3: 20, 5: 2, 7: 11, 8: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({5: 1, 6: 1, 7: 1, 8: 1}),\n",
+       "  ('x', 'x', 'o', 'o', '.', 'o', 'x', '.', 'x'): Counter({4: 24, 7: 1}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'o'): Counter({1: 3, 3: 2, 4: 1, 5: 2}),\n",
+       "  ('x', 'x', '.', 'o', 'o', 'x', 'x', '.', 'o'): Counter({2: 3, 7: 1}),\n",
+       "  ('x', 'o', 'o', '.', 'o', 'x', 'x', '.', '.'): Counter({3: 15, 7: 7, 8: 1}),\n",
+       "  ('x', 'x', 'o', 'o', '.', 'x', '.', 'x', 'o'): Counter({4: 3, 6: 1}),\n",
+       "  ('x', 'x', 'o', '.', '.', 'x', 'o', '.', 'o'): Counter({3: 1, 4: 2, 7: 3}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o'): Counter({2: 2, 3: 3, 4: 5, 5: 3, 6: 3}),\n",
+       "  ('x', 'x', 'o', 'o', '.', 'x', 'x', '.', 'o'): Counter({4: 3, 7: 3}),\n",
+       "  ('x', 'x', 'o', 'o', 'o', 'x', '.', 'x', 'o'): Counter({6: 3}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 1, 3: 1, 6: 1, 8: 1}),\n",
+       "  ('x', 'x', 'o', 'o', '.', 'o', 'x', 'o', 'x'): Counter({4: 9}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 4, 3: 3, 5: 8, 6: 10, 8: 5}),\n",
+       "  ('x', 'x', '.', 'o', 'o', '.', '.', 'x', 'o'): Counter({2: 7, 5: 4, 6: 2}),\n",
+       "  ('x', 'x', '.', 'o', 'x', 'o', 'x', 'o', '.'): Counter({2: 1, 8: 1}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 1, 5: 1, 6: 729, 7: 1913, 8: 2}),\n",
+       "  ('x', 'x', 'o', 'o', '.', 'x', 'o', '.', 'x'): Counter({4: 14, 7: 1}),\n",
+       "  ('x', 'x', '.', 'o', 'x', 'x', 'o', '.', 'o'): Counter({2: 1, 7: 20}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 11, 5: 5, 6: 3, 7: 3, 8: 1}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({1: 1, 3: 1, 5: 1, 6: 36, 8: 1}),\n",
+       "  ('x', 'x', '.', '.', 'o', 'o', 'o', '.', 'x'): Counter({2: 8, 3: 2, 7: 2}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 1, 5: 1, 6: 1, 7: 1, 8: 3}),\n",
+       "  ('.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({0: 4, 2: 3, 4: 3, 6: 3, 7: 2, 8: 3}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x'): Counter({3: 2, 4: 23, 5: 1, 7: 2}),\n",
+       "  ('.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({0: 1, 2: 1, 3: 1, 4: 68, 5: 2, 6: 2, 7: 1, 8: 8}),\n",
+       "  ('o', 'x', '.', '.', 'x', 'x', 'o', '.', 'o'): Counter({2: 1, 3: 13, 7: 19}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({1: 1, 3: 1, 7: 1, 8: 1}),\n",
+       "  ('x', 'x', 'o', 'x', 'o', 'o', '.', '.', '.'): Counter({6: 14, 7: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({3: 3, 4: 4, 5: 2, 6: 5, 8: 4}),\n",
+       "  ('x', 'o', '.', '.', 'x', 'o', '.', 'x', 'o'): Counter({2: 39, 3: 1, 6: 1}),\n",
+       "  ('x', 'x', '.', 'x', 'o', 'o', '.', 'o', 'x'): Counter({2: 1, 6: 1}),\n",
+       "  ('x', 'x', '.', 'o', '.', 'o', 'x', 'o', 'x'): Counter({2: 1, 4: 21}),\n",
+       "  ('.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({0: 4, 2: 3, 6: 5, 8: 3}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({1: 1, 2: 1, 3: 1, 5: 21, 6: 1, 7: 38, 8: 1}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({1: 5, 3: 4, 6: 6, 8: 5}),\n",
+       "  ('x', 'x', 'o', 'o', '.', 'x', 'o', 'x', 'o'): Counter({4: 15}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({3: 3, 4: 2, 6: 3, 7: 3}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({3: 355, 6: 611, 8: 82}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({3: 1, 4: 5, 5: 2, 7: 3, 8: 6}),\n",
+       "  ('x', 'x', '.', 'o', 'x', 'o', 'x', 'o', 'o'): Counter({2: 251}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 1, 3: 1, 6: 1, 7: 13, 8: 5}),\n",
+       "  ('o', 'x', 'o', 'x', 'o', '.', '.', 'x', '.'): Counter({5: 1, 6: 3, 8: 3}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o'): Counter({3: 5, 4: 2, 5: 19, 7: 2}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 1, 3: 1, 5: 1, 8: 22}),\n",
+       "  ('o', 'x', '.', 'x', '.', 'x', '.', 'o', 'o'): Counter({2: 3, 4: 3, 6: 3}),\n",
+       "  ('o', 'x', '.', 'o', 'o', 'x', '.', 'x', '.'): Counter({2: 1, 6: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.'): Counter({3: 1, 4: 1, 7: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'o'): Counter({2: 4, 3: 3, 4: 2, 6: 5}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({3: 11, 5: 10, 6: 11, 8: 9}),\n",
+       "  ('x', 'o', 'o', '.', 'o', 'x', '.', 'x', '.'): Counter({3: 2, 6: 9, 8: 3}),\n",
+       "  ('.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({0: 3, 2: 3, 6: 4, 8: 5}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 95, 3: 1, 7: 141}),\n",
+       "  ('x', 'x', 'o', 'o', '.', 'x', 'o', 'o', 'x'): Counter({4: 7}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 357, 6: 1, 7: 42}),\n",
+       "  ('x', 'x', 'o', 'x', 'x', 'o', '.', 'o', '.'): Counter({6: 2, 8: 27}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x'): Counter({3: 1, 4: 2, 5: 1, 6: 1}),\n",
+       "  ('x', 'o', 'o', '.', '.', 'x', 'o', 'x', '.'): Counter({3: 2, 4: 4, 8: 3}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({1: 3, 3: 4, 4: 49, 5: 14, 6: 9, 7: 5, 8: 2}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({1: 1, 3: 1, 6: 1, 7: 1, 8: 4130}),\n",
+       "  ('x', 'o', 'x', 'o', 'x', 'o', '.', 'x', '.'): Counter({6: 1, 8: 1}),\n",
+       "  ('.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({0: 4, 2: 3, 4: 2, 6: 3, 8: 3}),\n",
+       "  ('x', 'x', '.', 'x', 'x', 'o', '.', 'o', 'o'): Counter({2: 11, 6: 3}),\n",
+       "  ('x', 'x', 'o', '.', 'o', 'o', 'x', '.', '.'): Counter({3: 12, 7: 3, 8: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 4, 3: 2, 4: 6, 7: 7}),\n",
+       "  ('o', 'x', 'o', 'x', 'o', 'x', '.', 'x', '.'): Counter({6: 5, 8: 7}),\n",
+       "  ('x', 'o', 'o', '.', 'x', 'x', 'x', '.', 'o'): Counter({3: 3, 7: 1}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({1: 2, 3: 1, 6: 1, 8: 17}),\n",
+       "  ('o', 'x', 'o', 'x', 'x', 'o', '.', '.', '.'): Counter({6: 1, 7: 154, 8: 6}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.'): Counter({1: 1, 3: 410, 8: 275}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 1, 3: 1, 7: 25, 8: 1}),\n",
+       "  ('x', 'o', '.', '.', 'o', 'x', 'o', 'x', '.'): Counter({2: 6, 3: 1, 8: 1}),\n",
+       "  ('x', 'x', '.', 'o', 'o', '.', 'x', '.', 'o'): Counter({2: 14, 5: 4, 7: 1}),\n",
+       "  ('x', 'x', '.', 'o', '.', 'o', 'o', 'x', '.'): Counter({2: 3, 4: 6, 8: 3}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({5: 67, 6: 297, 8: 160}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 1, 3: 1, 5: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 4, 3: 1, 4: 1, 6: 1, 7: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1, 8: 1}),\n",
+       "  ('o', 'x', '.', 'o', 'x', 'x', '.', 'o', '.'): Counter({2: 1, 6: 4, 8: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'o'): Counter({2: 3, 3: 151, 5: 104}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({1: 1, 3: 1, 6: 1, 7: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.'): Counter({4: 15, 5: 1, 7: 2, 8: 1}),\n",
+       "  ('x', 'x', 'o', 'x', '.', '.', 'o', '.', 'o'): Counter({4: 3, 5: 2, 7: 2}),\n",
+       "  ('x', 'x', 'o', '.', '.', 'o', '.', 'o', 'x'): Counter({3: 6, 4: 7, 6: 3}),\n",
+       "  ('x', 'o', 'x', 'o', '.', 'o', 'x', '.', '.'): Counter({4: 7, 7: 1, 8: 3}),\n",
+       "  ('x', 'o', 'o', '.', '.', 'x', 'x', 'o', '.'): Counter({3: 4, 4: 5, 8: 4}),\n",
+       "  ('x', 'x', 'o', 'o', '.', 'o', 'x', '.', '.'): Counter({4: 3, 7: 1, 8: 1}),\n",
+       "  ('x', 'x', 'o', 'o', '.', 'o', '.', '.', 'x'): Counter({4: 3, 6: 1, 7: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 2, 5: 1, 6: 1, 7: 1}),\n",
+       "  ('x', 'x', 'o', 'o', 'x', 'x', 'o', '.', 'o'): Counter({7: 354}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 4, 3: 2, 4: 1, 8: 11}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x'): Counter({2: 3, 4: 5, 5: 3, 6: 3, 7: 7}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({2: 5, 3: 4, 4: 6, 6: 3, 8: 3}),\n",
+       "  ('.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({0: 307, 2: 445, 6: 222, 7: 470, 8: 880}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o'): Counter({2: 2, 3: 3, 4: 2, 6: 2}),\n",
+       "  ('x', 'x', 'o', 'o', 'o', '.', '.', '.', 'x'): Counter({5: 1, 6: 1, 7: 1}),\n",
+       "  ('x', 'x', 'o', 'o', 'o', '.', 'x', 'x', 'o'): Counter({5: 3}),\n",
+       "  ('.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({0: 3, 2: 7, 3: 10, 5: 6, 6: 2, 8: 4}),\n",
+       "  ('x', 'x', 'o', 'o', 'x', 'x', 'x', 'o', 'o'): Counter(),\n",
+       "  ('x', 'x', 'o', '.', 'o', 'x', '.', 'x', 'o'): Counter({3: 3, 6: 20}),\n",
+       "  ('x', 'x', 'o', '.', 'o', 'o', 'x', 'o', 'x'): Counter({3: 18}),\n",
+       "  ('x', 'o', 'o', '.', 'x', 'x', 'o', 'x', '.'): Counter({3: 1, 8: 1}),\n",
+       "  ('x', 'x', '.', '.', 'o', 'x', 'o', '.', 'o'): Counter({2: 9, 3: 1, 7: 4}),\n",
+       "  ('x', 'x', 'o', 'o', 'x', '.', 'x', '.', 'o'): Counter({5: 38, 7: 3}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 1, 6: 1, 7: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 1, 3: 1, 4: 1, 5: 1, 7: 1, 8: 1}),\n",
+       "  ('x', '.', 'x', '.', 'o', '.', 'o', 'x', 'o'): Counter({1: 9, 3: 6, 5: 7}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o'): Counter({1: 4, 3: 4, 4: 1, 5: 2, 7: 5}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x'): Counter({4: 9, 5: 1, 6: 1, 7: 2}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({4: 4, 5: 2, 6: 4, 7: 3, 8: 5}),\n",
+       "  ('x', 'o', 'o', '.', '.', 'x', '.', 'x', 'o'): Counter({3: 7, 4: 3, 6: 3}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 9, 4: 13, 7: 2, 8: 2}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({3: 1, 5: 1, 7: 1, 8: 19}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x'): Counter({2: 1, 3: 1, 4: 1, 6: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({5: 160, 7: 307, 8: 395}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 3, 4: 9, 5: 7, 7: 3, 8: 2}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({3: 3, 4: 2, 5: 3, 6: 5, 8: 5}),\n",
+       "  ('.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({0: 2373,\n",
+       "           2: 3710,\n",
+       "           3: 3193,\n",
+       "           5: 9975,\n",
+       "           6: 2080,\n",
+       "           7: 31,\n",
+       "           8: 1687}),\n",
+       "  ('x', 'x', 'o', 'o', '.', 'x', '.', 'o', 'x'): Counter({4: 3, 6: 3}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({1: 1, 3: 1, 6: 1, 8: 1}),\n",
+       "  ('x', 'o', 'x', 'o', 'x', '.', '.', 'x', 'o'): Counter({5: 1, 6: 3}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.'): Counter({2: 4, 3: 2, 4: 6, 5: 6, 8: 4}),\n",
+       "  ('x', 'o', 'x', 'o', '.', '.', 'o', 'x', '.'): Counter({4: 4, 5: 3, 8: 4}),\n",
+       "  ('o', 'x', 'o', 'x', '.', 'o', '.', 'x', '.'): Counter({4: 4, 6: 1, 8: 4}),\n",
+       "  ('x', 'o', '.', '.', 'x', 'o', 'o', 'x', '.'): Counter({2: 6, 3: 9, 8: 492}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 10, 3: 4, 7: 3, 8: 2}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 6, 3: 4, 4: 2, 6: 2, 8: 8}),\n",
+       "  ('x', 'x', '.', 'o', 'o', 'x', 'o', 'x', '.'): Counter({2: 10, 8: 2}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o'): Counter({1: 3, 3: 1, 5: 18, 6: 2}),\n",
+       "  ('x', 'o', 'x', 'o', '.', '.', 'x', '.', 'o'): Counter({4: 4, 5: 3, 7: 3}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 1, 3: 1, 6: 1, 7: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 2, 3: 2, 4: 14, 8: 1}),\n",
+       "  ('x', 'x', 'o', 'o', '.', 'o', '.', 'x', '.'): Counter({4: 3, 6: 3, 8: 1}),\n",
+       "  ('x', 'x', 'o', 'o', '.', '.', 'x', 'o', '.'): Counter({4: 5, 5: 3, 8: 3}),\n",
+       "  ('x', 'x', 'o', '.', 'o', '.', 'x', '.', 'o'): Counter({3: 14, 5: 4, 7: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({4: 3, 5: 4, 6: 3, 7: 2}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({3: 2, 4: 1, 5: 2, 6: 6, 8: 3}),\n",
+       "  ('x', 'x', 'o', 'x', 'o', 'x', '.', '.', 'o'): Counter({6: 10, 7: 1}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 1, 6: 20, 7: 3, 8: 1}),\n",
+       "  ('x', 'x', '.', 'o', '.', '.', 'o', 'o', 'x'): Counter({2: 3, 4: 3, 5: 5}),\n",
+       "  ('x', 'x', '.', 'o', '.', 'o', 'o', '.', 'x'): Counter({2: 6, 4: 3, 7: 3}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'o'): Counter({2: 10, 3: 1, 5: 1, 6: 17}),\n",
+       "  ('x', 'o', 'o', '.', 'o', '.', 'x', '.', 'x'): Counter({3: 8, 5: 1, 7: 5}),\n",
+       "  ('x', 'o', 'x', '.', 'x', '.', 'o', 'x', 'o'): Counter({3: 3, 5: 3}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({3: 1, 5: 3, 6: 1, 8: 1}),\n",
+       "  ('x', 'o', 'o', '.', 'x', 'x', 'x', 'o', '.'): Counter({3: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 8, 3: 4, 5: 3, 7: 1, 8: 7}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 1, 3: 1, 4: 4, 6: 1, 7: 1, 8: 1}),\n",
+       "  ('x', 'x', 'o', '.', 'o', '.', '.', 'o', 'x'): Counter({3: 1, 5: 1, 6: 8}),\n",
+       "  ('x', 'o', 'x', 'o', 'x', '.', 'o', 'x', 'o'): Counter({5: 3}),\n",
+       "  ('x', 'x', '.', 'o', 'x', '.', 'x', 'o', 'o'): Counter({2: 3, 5: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({3: 1, 4: 4, 6: 2, 8: 4}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 646, 3: 101, 6: 314, 7: 1527, 8: 56}),\n",
+       "  ('x', 'x', '.', 'x', 'o', 'x', '.', 'o', 'o'): Counter({2: 2, 6: 9}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.'): Counter({1: 4, 3: 2, 4: 4, 8: 3}),\n",
+       "  ('x', 'x', '.', 'o', 'o', 'x', 'o', '.', 'x'): Counter({2: 21, 7: 1}),\n",
+       "  ('.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({0: 2, 2: 3, 4: 4, 6: 2, 8: 4}),\n",
+       "  ('x', 'x', 'o', '.', '.', '.', 'o', 'x', 'o'): Counter({3: 1, 4: 4, 5: 4}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o'): Counter({1: 6, 3: 1, 5: 1, 7: 12}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({5: 3, 6: 31, 7: 2, 8: 2}),\n",
+       "  ('x', 'o', 'x', 'o', '.', '.', '.', 'x', 'o'): Counter({4: 4, 5: 3, 6: 4}),\n",
+       "  ('.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({0: 1, 2: 1, 3: 1, 5: 1, 6: 5, 8: 4}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 1, 5: 1, 7: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 1, 3: 1, 4: 1, 8: 1}),\n",
+       "  ('x', 'o', 'x', '.', 'o', '.', 'x', '.', 'o'): Counter({3: 9, 5: 1, 7: 3}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x'): Counter({2: 1, 3: 1, 4: 1, 7: 1}),\n",
+       "  ('o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({2: 18, 3: 1, 5: 1, 6: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({2: 1, 3: 4, 5: 3, 6: 6, 8: 12}),\n",
+       "  ('x', 'x', '.', 'o', '.', 'o', '.', 'x', 'o'): Counter({2: 5, 4: 4, 6: 2}),\n",
+       "  ('x', 'x', 'o', 'x', 'o', '.', '.', 'x', 'o'): Counter({5: 10, 6: 6}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({3: 95, 5: 26, 6: 46, 7: 206, 8: 35}),\n",
+       "  ('x', 'x', 'o', 'x', 'x', '.', '.', 'o', 'o'): Counter({5: 11, 6: 13}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 1, 3: 1, 6: 1, 8: 1}),\n",
+       "  ('x', 'x', '.', '.', 'o', 'o', '.', 'o', 'x'): Counter({2: 9, 3: 12, 6: 2}),\n",
+       "  ('x', 'x', '.', '.', 'o', '.', 'x', 'o', 'o'): Counter({2: 5, 3: 18, 5: 4}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 158, 3: 293, 6: 560, 7: 99, 8: 535}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({1: 1, 2: 1, 3: 1, 6: 1, 7: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x'): Counter({1: 3, 3: 3, 4: 3, 5: 3, 7: 3}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({2: 5, 3: 13, 6: 1, 8: 4}),\n",
+       "  ('x', 'x', 'o', '.', 'o', 'x', '.', 'o', '.'): Counter({3: 1, 6: 15, 8: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 263, 5: 1, 8: 384}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 11, 3: 2, 4: 3, 5: 2, 8: 7}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 4, 3: 1, 4: 1, 5: 3, 6: 1, 7: 3}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({1: 1, 3: 1, 4: 5, 5: 2, 6: 1, 8: 13}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({2: 4, 3: 4, 6: 5, 8: 10}),\n",
+       "  ('x', 'x', '.', 'x', '.', 'o', '.', 'o', 'o'): Counter({2: 8, 4: 3, 6: 4}),\n",
+       "  ('.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({0: 25,\n",
+       "           1: 13,\n",
+       "           2: 89,\n",
+       "           3: 1,\n",
+       "           4: 45379,\n",
+       "           5: 1,\n",
+       "           6: 5,\n",
+       "           7: 25,\n",
+       "           8: 65}),\n",
+       "  ('x', 'x', '.', 'o', 'x', 'x', '.', 'o', 'o'): Counter({2: 3, 6: 24}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 2, 4: 1, 6: 1, 7: 1}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({5: 141, 6: 10, 8: 8}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 1, 3: 11, 7: 3, 8: 3}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({3: 4, 4: 3, 6: 4, 7: 1, 8: 4}),\n",
+       "  ('x', 'o', 'x', 'o', 'o', '.', 'x', '.', 'x'): Counter({5: 5, 7: 22}),\n",
+       "  ('x', 'x', 'o', 'o', 'o', '.', 'x', '.', 'x'): Counter({5: 32, 7: 3}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({1: 1, 2: 622, 3: 1, 6: 1, 7: 1}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 1, 3: 1, 6: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x'): Counter({1: 1, 2: 1, 3: 1, 5: 1, 6: 1, 7: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x'): Counter({2: 1, 4: 1, 5: 1, 6: 1}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.'): Counter({1: 1, 3: 1, 5: 1, 8: 28}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'o'): Counter({2: 1, 3: 128, 6: 306}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 2, 3: 1, 4: 1, 5: 1, 6: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({3: 3, 4: 6, 5: 2, 7: 3, 8: 4}),\n",
+       "  ('x', 'o', 'x', 'o', '.', 'o', 'x', 'o', 'x'): Counter({4: 3}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 1, 3: 160, 5: 8, 6: 123, 8: 5}),\n",
+       "  ('x', 'o', '.', 'o', 'o', 'x', '.', 'x', '.'): Counter({2: 4, 6: 4, 8: 7}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 1, 3: 1, 4: 49, 5: 2, 6: 7, 7: 8, 8: 3}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.'): Counter({3: 32, 5: 1, 7: 21, 8: 1}),\n",
+       "  ('x', 'o', '.', '.', 'o', 'x', '.', 'x', 'o'): Counter({2: 3, 3: 5, 6: 5}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.'): Counter({2: 2, 3: 2, 4: 2, 8: 3}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({2: 2, 4: 1, 6: 1, 8: 3}),\n",
+       "  ('x', 'x', '.', 'o', 'o', 'x', '.', '.', 'o'): Counter({2: 4, 6: 3, 7: 5}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x'): Counter({2: 2, 4: 1, 5: 1, 7: 1}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({1: 1, 3: 1, 6: 32, 7: 1, 8: 1}),\n",
+       "  ('x', 'x', 'o', 'o', '.', 'x', '.', 'o', '.'): Counter({4: 3, 6: 3, 8: 3}),\n",
+       "  ('x', 'x', 'o', 'o', '.', '.', 'o', 'x', '.'): Counter({4: 9, 5: 2, 8: 1}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({1: 28, 2: 37, 3: 44, 6: 213, 8: 343}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 3, 4: 4, 5: 4, 6: 3, 8: 6}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o'): Counter({1: 1, 3: 1, 4: 2, 5: 4, 6: 2}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 2, 3: 291, 8: 543}),\n",
+       "  ('x', 'x', '.', 'o', '.', 'x', 'o', 'x', 'o'): Counter({2: 2, 4: 1}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'o'): Counter({1: 1, 3: 1196, 6: 8}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'o'): Counter({2: 6, 3: 6, 4: 1, 5: 1, 6: 8}),\n",
+       "  ('x', 'x', '.', 'o', '.', '.', 'o', 'x', 'o'): Counter({2: 4, 4: 5, 5: 4}),\n",
+       "  ('x', 'x', '.', 'o', 'o', 'x', '.', 'o', '.'): Counter({2: 13, 6: 5, 8: 6}),\n",
+       "  ('o', 'x', 'o', 'x', '.', 'x', 'o', 'x', 'o'): Counter({4: 3}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({5: 17, 7: 11, 8: 487}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({4: 1, 6: 7, 7: 2, 8: 4}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({3: 1, 5: 1, 6: 1, 7: 1, 8: 1}),\n",
+       "  ('x', 'x', '.', '.', 'o', 'o', 'x', 'o', 'x'): Counter({2: 1, 3: 24}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 7, 3: 6, 5: 1, 6: 3, 7: 5}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o'): Counter({2: 3, 4: 3, 5: 3, 6: 2}),\n",
+       "  ('x', 'x', 'o', 'x', 'x', 'o', 'o', '.', '.'): Counter({7: 1, 8: 20}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({4: 3, 6: 3, 7: 2, 8: 3}),\n",
+       "  ('x', 'x', '.', 'o', '.', 'x', 'o', '.', 'o'): Counter({2: 4, 4: 3, 7: 4}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 4, 3: 1, 4: 4, 7: 2, 8: 6}),\n",
+       "  ('x', 'o', 'x', 'o', 'o', '.', 'x', '.', '.'): Counter({5: 1, 7: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.'): Counter({3: 7, 4: 3, 7: 2, 8: 9}),\n",
+       "  ('x', 'x', '.', '.', 'o', '.', 'o', 'o', 'x'): Counter({2: 10, 3: 1, 5: 3}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o'): Counter({2: 7, 3: 4, 4: 1, 6: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.'): Counter({3: 151, 5: 103, 8: 306}),\n",
+       "  ('o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({1: 3, 2: 2, 3: 5, 4: 3, 6: 7, 8: 1}),\n",
+       "  ('x', 'x', 'o', '.', 'o', '.', 'x', 'o', 'x'): Counter({3: 3, 5: 1}),\n",
+       "  ('x', 'x', '.', 'o', 'x', 'o', 'x', '.', 'o'): Counter({2: 24, 7: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 6, 6: 1, 7: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o'): Counter({2: 1, 3: 1, 5: 5, 6: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o'): Counter({3: 1, 4: 1, 5: 1, 7: 1}),\n",
+       "  ('x', 'x', 'o', 'o', 'o', 'x', '.', '.', '.'): Counter({6: 3, 7: 2, 8: 2}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x'): Counter({2: 1, 3: 1, 5: 1, 6: 1, 7: 9}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 1, 3: 26, 7: 2, 8: 1}),\n",
+       "  ('x', 'x', 'o', 'x', 'x', '.', 'o', '.', 'o'): Counter({5: 11, 7: 3}),\n",
+       "  ('x', 'x', 'o', 'o', '.', 'x', '.', '.', 'o'): Counter({4: 3, 6: 3, 7: 4}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({3: 1, 4: 1, 6: 1, 8: 1}),\n",
+       "  ('x', 'x', 'o', '.', 'o', 'o', '.', 'x', '.'): Counter({3: 1, 6: 1, 8: 1}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.'): Counter({2: 2, 3: 4, 4: 11, 5: 1, 8: 1}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 2, 3: 4, 4: 12, 6: 3, 7: 2, 8: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({6: 69, 7: 176, 8: 75}),\n",
+       "  ('x', 'o', 'x', 'o', 'x', '.', 'o', 'x', '.'): Counter({5: 1, 8: 3}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x'): Counter({2: 22, 3: 1, 5: 1, 7: 1}),\n",
+       "  ('o', 'x', '.', 'x', 'x', 'o', '.', '.', 'o'): Counter({2: 63, 6: 2, 7: 63}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 8, 3: 1, 4: 2, 5: 1, 7: 2}),\n",
+       "  ('x', 'x', 'o', 'x', '.', 'o', 'o', '.', 'x'): Counter({4: 17, 7: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 1, 3: 1, 5: 1, 6: 1, 7: 1, 8: 1}),\n",
+       "  ('x', 'o', 'o', '.', 'x', 'x', 'o', 'x', 'o'): Counter({3: 1272}),\n",
+       "  ('x', 'x', 'o', 'x', 'o', 'o', '.', 'x', '.'): Counter({6: 8, 8: 7}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 2, 3: 4, 4: 4, 6: 4, 7: 5}),\n",
+       "  ('x', 'x', '.', 'o', 'o', 'x', '.', 'o', 'x'): Counter({2: 3, 6: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({5: 10, 6: 11, 8: 586}),\n",
+       "  ('o', 'o', '.', 'o', 'x', 'x', '.', 'x', '.'): Counter({2: 1, 6: 1, 8: 1}),\n",
+       "  ('x', 'x', 'o', 'o', '.', 'o', 'x', 'x', '.'): Counter({4: 6, 8: 13}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'o'): Counter({1: 1, 2: 2, 3: 4, 6: 19}),\n",
+       "  ('x', 'x', 'o', 'x', 'o', '.', '.', 'o', '.'): Counter({5: 1, 6: 7, 8: 2}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({1: 1, 3: 1, 5: 1, 6: 1, 7: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x'): Counter({4: 1, 5: 1, 6: 1, 7: 1}),\n",
+       "  ('x', 'x', 'o', 'x', 'o', 'o', '.', 'o', 'x'): Counter({6: 31}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x'): Counter({3: 10, 5: 8, 6: 30, 7: 7}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.'): Counter({2: 1, 3: 1, 4: 1, 8: 2}),\n",
+       "  ('x', 'x', 'o', 'o', 'x', '.', 'x', 'o', '.'): Counter({5: 1, 8: 3}),\n",
+       "  ('x', 'o', 'o', '.', '.', 'x', 'x', '.', 'o'): Counter({3: 3, 4: 5, 7: 4}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 11, 6: 6, 7: 4, 8: 4}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 174, 3: 455, 7: 1}),\n",
+       "  ('x', 'o', 'x', 'o', '.', 'o', 'x', '.', 'x'): Counter({4: 14, 7: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({3: 1, 5: 1, 6: 1, 8: 15}),\n",
+       "  ('x', 'o', 'o', '.', 'x', '.', 'x', '.', 'o'): Counter({3: 726, 5: 5, 7: 1}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 3, 4: 4, 6: 4, 8: 2}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.'): Counter({2: 1, 3: 1, 5: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x'): Counter({2: 3, 3: 2, 4: 8, 5: 4, 7: 4}),\n",
+       "  ('x', 'x', '.', '.', 'o', 'o', 'x', 'o', '.'): Counter({2: 7, 3: 6, 8: 2}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 5, 4: 1, 7: 1, 8: 1}),\n",
+       "  ('x', 'x', 'o', 'o', 'x', 'o', 'x', '.', '.'): Counter({7: 1, 8: 22}),\n",
+       "  ('x', 'x', 'o', 'x', '.', 'x', 'o', 'o', '.'): Counter({4: 3, 8: 10}),\n",
+       "  ('x', 'x', 'o', 'o', '.', '.', '.', 'o', 'x'): Counter({4: 5, 5: 4, 6: 3}),\n",
+       "  ('o', 'x', 'o', 'x', '.', 'x', 'o', 'x', '.'): Counter({4: 5, 8: 3}),\n",
+       "  ('x', 'x', '.', 'o', 'o', '.', '.', 'o', 'x'): Counter({2: 11, 5: 5, 6: 2}),\n",
+       "  ('x', 'x', 'o', 'o', '.', '.', 'x', 'o', 'x'): Counter({4: 3, 5: 1}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({2: 1, 3: 1, 4: 8, 5: 3, 6: 5, 8: 2}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 23, 3: 1, 6: 1, 7: 2}),\n",
+       "  ('o', 'x', '.', 'o', 'x', 'x', '.', '.', 'o'): Counter({2: 1, 6: 20, 7: 26}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({3: 1, 7: 182, 8: 177}),\n",
+       "  ('x', 'x', '.', 'o', '.', 'o', '.', 'o', 'x'): Counter({2: 6, 4: 6, 6: 3}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x'): Counter({2: 1, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 4, 4: 3, 6: 3, 7: 5, 8: 5}),\n",
+       "  ('x', 'x', 'o', 'x', 'o', 'o', '.', '.', 'x'): Counter({6: 18, 7: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x'): Counter({3: 1, 4: 13, 6: 1, 7: 1}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 2, 4: 3, 6: 4, 7: 2}),\n",
+       "  ('.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({0: 15, 2: 6, 5: 1, 6: 1, 7: 1, 8: 7}),\n",
+       "  ('o', 'x', '.', '.', 'x', 'x', 'o', 'o', '.'): Counter({2: 1, 3: 22, 8: 1}),\n",
+       "  ('x', 'x', 'o', 'x', 'o', '.', '.', 'o', 'x'): Counter({5: 1, 6: 25}),\n",
+       "  ('x', 'x', 'o', 'o', 'x', 'x', 'o', '.', '.'): Counter({7: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({1: 3, 3: 4, 4: 5, 6: 4, 7: 3}),\n",
+       "  ('x', 'o', '.', 'o', 'x', 'x', '.', 'x', 'o'): Counter({2: 3, 6: 3}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({4: 7, 5: 4, 6: 2, 8: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({3: 1, 6: 1, 7: 2, 8: 20}),\n",
+       "  ('x', 'o', 'x', 'o', '.', 'o', '.', 'x', '.'): Counter({4: 3, 6: 3, 8: 2}),\n",
+       "  ('x', 'o', 'o', '.', 'x', '.', '.', 'x', 'o'): Counter({3: 1, 5: 11, 6: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o'): Counter({2: 6, 3: 1, 5: 3, 6: 2}),\n",
+       "  ('x', 'o', 'x', '.', 'o', '.', 'o', 'x', '.'): Counter({3: 3, 5: 5, 8: 4}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({1: 3, 3: 3, 4: 4, 7: 5, 8: 3}),\n",
+       "  ('x', 'x', '.', 'o', 'o', '.', 'x', 'o', '.'): Counter({2: 9, 5: 3, 8: 1}),\n",
+       "  ('x', 'x', 'o', '.', 'x', 'o', 'x', 'o', '.'): Counter({3: 1, 8: 24}),\n",
+       "  ('x', 'x', '.', 'o', 'x', '.', '.', 'o', 'o'): Counter({2: 419, 5: 1, 6: 5}),\n",
+       "  ('o', 'x', 'o', 'x', 'x', '.', '.', '.', 'o'): Counter({5: 47, 6: 1, 7: 80}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 9, 4: 4, 6: 2, 7: 2, 8: 3}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 1, 3: 1, 7: 1, 8: 1}),\n",
+       "  ('x', 'x', 'o', '.', 'x', 'x', 'o', 'o', '.'): Counter({3: 1, 8: 24}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 4, 4: 3, 6: 3, 7: 3, 8: 3}),\n",
+       "  ('x', 'x', '.', 'o', 'o', '.', 'o', '.', 'x'): Counter({2: 9, 5: 2, 7: 1}),\n",
+       "  ('x', 'o', 'x', '.', '.', '.', 'x', 'o', 'o'): Counter({3: 5, 4: 5, 5: 3}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 8, 4: 4, 5: 3, 6: 4, 7: 2}),\n",
+       "  ('x', 'x', 'o', '.', '.', 'x', 'o', 'o', '.'): Counter({3: 1, 4: 2, 8: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 1, 3: 1, 7: 1, 8: 1}),\n",
+       "  ('x', 'x', '.', '.', 'o', 'x', '.', 'o', 'o'): Counter({2: 16, 3: 1, 6: 11}),\n",
+       "  ('x', 'x', 'o', 'o', '.', 'x', 'o', 'x', '.'): Counter({4: 9, 8: 1}),\n",
+       "  ('x', 'x', 'o', '.', 'x', '.', 'o', 'o', '.'): Counter({3: 1, 5: 1, 8: 125}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({2: 1, 3: 1, 5: 1, 6: 2, 8: 1}),\n",
+       "  ('x', 'x', '.', 'o', 'o', '.', 'o', 'x', '.'): Counter({2: 10, 5: 4, 8: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 18, 4: 1, 5: 2, 7: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({3: 5, 4: 6, 6: 4, 7: 4, 8: 2}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({3: 2, 4: 4, 5: 3, 6: 5, 7: 2, 8: 3}),\n",
+       "  ('x', 'x', '.', 'o', 'o', 'x', 'o', 'o', 'x'): Counter({2: 12}),\n",
+       "  ('x', 'x', 'o', 'o', '.', '.', '.', 'x', 'o'): Counter({4: 3, 5: 3, 6: 1}),\n",
+       "  ('x', 'o', 'o', '.', 'x', 'x', 'x', 'o', 'o'): Counter({3: 504}),\n",
+       "  ('x', 'x', 'o', 'o', 'o', '.', 'x', 'o', 'x'): Counter({5: 3}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({1: 1, 3: 1, 4: 1, 5: 1, 6: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({1: 12, 2: 11, 3: 2, 6: 1, 7: 33, 8: 2}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 2, 4: 1, 6: 1, 8: 2}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 1, 3: 452, 7: 12}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o'): Counter({1: 1, 3: 606, 7: 692}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({2: 3, 4: 3, 6: 3, 8: 3}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({4: 3, 5: 2, 6: 4, 8: 2}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 2, 3: 1, 4: 5, 6: 4, 7: 4}),\n",
+       "  ('x', 'x', 'o', 'o', 'o', '.', '.', 'x', 'x'): Counter({5: 10, 6: 14}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({1: 1, 2: 1, 3: 1, 5: 1, 6: 1, 7: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 4, 3: 1, 6: 4, 8: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x'): Counter({2: 1, 3: 1, 5: 1, 7: 36}),\n",
+       "  ('o', 'x', '.', 'x', 'x', 'o', '.', 'o', '.'): Counter({2: 14, 6: 8, 8: 3}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 1, 4: 1, 6: 2, 8: 2}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.'): Counter({1: 12, 3: 1, 4: 1, 5: 2, 8: 9}),\n",
+       "  ('x', 'x', 'o', 'o', '.', 'o', 'o', 'x', 'x'): Counter({4: 7}),\n",
+       "  ('x', 'x', 'o', 'x', 'o', '.', '.', '.', 'o'): Counter({5: 1, 6: 13, 7: 1}),\n",
+       "  ('x', 'x', 'o', 'x', 'o', 'x', '.', 'o', '.'): Counter({6: 9, 8: 1}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 3, 4: 1, 6: 4, 7: 4, 8: 3}),\n",
+       "  ('x', 'x', 'o', '.', 'o', 'o', 'x', 'x', '.'): Counter({3: 3, 8: 11}),\n",
+       "  ('x', 'x', 'o', 'x', 'o', 'x', '.', 'o', 'o'): Counter({6: 10}),\n",
+       "  ('x', 'x', '.', 'o', '.', 'o', 'x', 'o', '.'): Counter({2: 3, 4: 4, 8: 3}),\n",
+       "  ('x', 'x', '.', '.', 'o', 'o', 'o', 'x', '.'): Counter({2: 6, 3: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({3: 3, 4: 4, 6: 3, 8: 4}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({3: 1, 5: 1, 6: 1, 7: 2, 8: 1}),\n",
+       "  ('x', 'x', 'o', 'o', 'o', 'x', '.', '.', 'x'): Counter({6: 28, 7: 3}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.'): Counter({3: 1, 5: 1, 7: 1, 8: 1}),\n",
+       "  ('x', 'x', '.', 'o', 'o', '.', 'x', 'o', 'x'): Counter({2: 3, 5: 49}),\n",
+       "  ('x', 'x', 'o', 'o', '.', 'x', 'o', '.', '.'): Counter({4: 6, 7: 3, 8: 2}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x'): Counter({3: 1, 4: 1, 5: 1, 7: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({2: 1, 4: 10, 6: 1, 8: 1}),\n",
+       "  ('x', '.', 'o', '.', '.', 'x', 'o', 'x', 'o'): Counter({1: 4, 3: 4, 4: 3}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 10, 4: 3, 6: 7, 7: 1}),\n",
+       "  ('x', 'x', 'o', 'o', '.', '.', 'o', 'x', 'x'): Counter({4: 14, 5: 1}),\n",
+       "  ('x', 'x', 'o', '.', '.', 'x', '.', 'o', 'o'): Counter({3: 2, 4: 3, 6: 4}),\n",
+       "  ('x', 'x', 'o', 'o', 'o', 'x', 'x', 'x', 'o'): Counter(),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 163, 3: 1, 8: 254}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 371, 7: 385, 8: 140}),\n",
+       "  ('o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({1: 1, 2: 1, 3: 16, 6: 4, 7: 1, 8: 1}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({4: 7, 5: 3, 6: 3, 7: 2, 8: 3}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.'): Counter({3: 1, 4: 33, 5: 1, 8: 1}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 3, 4: 3, 5: 3, 6: 3, 7: 3}),\n",
+       "  ('x', 'x', 'o', '.', '.', 'o', 'o', 'x', '.'): Counter({3: 2, 4: 4, 8: 5}),\n",
+       "  ('.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({0: 3, 2: 2, 5: 1, 6: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x'): Counter({2: 1, 3: 1, 4: 1, 7: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.'): Counter({3: 230, 7: 1, 8: 300}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 3, 3: 2, 4: 1, 6: 2, 7: 1}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 1, 3: 155, 5: 1, 7: 244, 8: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.'): Counter({3: 8, 4: 8, 5: 4, 7: 3, 8: 4}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'o'): Counter({2: 1, 3: 1, 4: 1, 5: 1}),\n",
+       "  ('x', 'x', 'o', '.', 'o', '.', 'x', 'x', 'o'): Counter({3: 3, 5: 10}),\n",
+       "  ('x', 'x', 'o', '.', '.', 'x', 'x', 'o', 'o'): Counter({3: 3, 4: 1}),\n",
+       "  ('x', 'x', 'o', '.', 'x', '.', 'o', '.', 'o'): Counter({3: 1, 5: 1, 7: 112}),\n",
+       "  ('o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({2: 13, 3: 5, 6: 1, 8: 2}),\n",
+       "  ('x', 'x', '.', 'o', 'o', 'x', 'x', 'o', '.'): Counter({2: 3, 8: 1}),\n",
+       "  ('x', 'x', 'o', 'o', '.', '.', 'x', 'x', 'o'): Counter({4: 3, 5: 13}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({3: 427, 7: 696, 8: 139}),\n",
+       "  ('x', 'x', 'o', 'x', '.', 'o', '.', 'o', '.'): Counter({4: 3, 6: 3, 8: 6}),\n",
+       "  ('.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({0: 1, 2: 1, 3: 1, 5: 1, 6: 1, 7: 1, 8: 10}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 1, 3: 1, 7: 1, 8: 1}),\n",
+       "  ('x', 'x', 'o', 'o', 'x', 'x', '.', 'o', 'o'): Counter({6: 3}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 8, 3: 3, 4: 5, 7: 3, 8: 4}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 1, 3: 1, 4: 1, 5: 1, 7: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 213, 6: 423, 8: 58}),\n",
+       "  ('x', 'x', 'o', '.', '.', 'x', 'o', 'x', 'o'): Counter({3: 2, 4: 6}),\n",
+       "  ('x', 'x', 'o', 'x', '.', 'o', 'o', 'o', 'x'): Counter({4: 7}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.'): Counter({3: 1, 4: 1, 5: 1, 8: 3}),\n",
+       "  ('x', 'x', '.', 'x', 'o', 'o', '.', 'o', '.'): Counter({2: 6, 6: 3, 8: 4}),\n",
+       "  ('x', 'x', '.', '.', '.', 'o', 'o', 'o', 'x'): Counter({2: 4, 3: 3, 4: 8}),\n",
+       "  ('x', 'x', 'o', 'o', 'x', 'o', 'x', 'o', '.'): Counter({8: 218}),\n",
+       "  ('x', 'o', 'x', 'o', 'o', '.', '.', '.', 'x'): Counter({5: 14, 6: 1, 7: 1}),\n",
+       "  ('x', 'x', '.', '.', 'o', 'x', 'x', 'o', 'o'): Counter({2: 1, 3: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({3: 1, 5: 1, 6: 1, 8: 3}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x'): Counter({2: 7, 3: 11, 6: 2, 7: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({5: 5, 6: 21, 8: 574}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.'): Counter({3: 1, 4: 1, 5: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({1: 281, 3: 123, 5: 761, 7: 647, 8: 1751}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 2, 3: 4, 4: 3, 6: 1, 8: 5}),\n",
+       "  ('o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 277, 3: 1980, 6: 1, 7: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({1: 1, 3: 1, 4: 1, 5: 1, 7: 1, 8: 1}),\n",
+       "  ('.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({0: 7, 2: 9, 4: 22, 5: 1, 6: 13, 7: 6, 8: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.'): Counter({2: 9, 3: 3, 5: 1, 8: 4}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 1, 3: 426, 5: 70, 6: 482, 7: 6}),\n",
+       "  ('o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({1: 1, 2: 2, 3: 2, 6: 2, 8: 5}),\n",
+       "  ('o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({2: 2, 3: 1, 4: 1, 6: 1, 8: 1}),\n",
+       "  ('x', 'o', '.', '.', 'x', 'x', 'o', 'x', 'o'): Counter({2: 1, 3: 3}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 412, 5: 64, 6: 205, 7: 141, 8: 176}),\n",
+       "  ('x', '.', 'o', '.', 'x', 'x', 'o', 'x', 'o'): Counter({1: 1, 3: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 3, 5: 38, 7: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 1, 3: 3, 4: 3, 7: 1}),\n",
+       "  ('x', 'x', 'o', '.', 'o', 'x', 'x', 'o', '.'): Counter({3: 3, 8: 1}),\n",
+       "  ('x', 'x', 'o', 'o', '.', '.', 'x', '.', 'o'): Counter({4: 3, 5: 3, 7: 2}),\n",
+       "  ('x', 'x', 'o', 'o', 'o', 'x', 'x', '.', '.'): Counter({7: 3, 8: 3}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({1: 1, 3: 2, 5: 2811, 6: 2, 7: 1}),\n",
+       "  ('x', 'x', '.', '.', 'x', 'o', 'x', 'o', 'o'): Counter({2: 21, 3: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x'): Counter({3: 2, 4: 4, 5: 5, 6: 4, 7: 4}),\n",
+       "  ('x', 'x', 'o', '.', 'x', 'x', '.', 'o', 'o'): Counter({3: 3, 6: 16}),\n",
+       "  ('x', 'o', 'x', '.', '.', '.', 'o', 'x', 'o'): Counter({3: 3, 4: 3, 5: 3}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({1: 1, 2: 2, 3: 2, 4: 2, 6: 9, 7: 2}),\n",
+       "  ('x', 'o', 'o', 'o', 'x', 'x', '.', 'x', 'o'): Counter({6: 3}),\n",
+       "  ('x', 'x', 'o', '.', 'o', 'x', 'x', 'o', 'o'): Counter({3: 43}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x'): Counter({2: 6, 5: 16, 6: 1, 7: 2}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({1: 17, 3: 1, 5: 1, 6: 3, 8: 2}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.'): Counter({3: 460, 5: 110, 8: 403}),\n",
+       "  ('x', 'x', 'o', '.', 'o', 'o', 'x', '.', 'x'): Counter({3: 22, 7: 1}),\n",
+       "  ('x', 'x', '.', 'o', '.', 'o', 'x', '.', 'o'): Counter({2: 5, 4: 4, 7: 3}),\n",
+       "  ('o', 'x', '.', '.', 'o', 'x', 'o', 'x', '.'): Counter({2: 1, 3: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 1, 3: 1, 5: 1, 7: 1}),\n",
+       "  ('o', 'x', 'o', 'x', '.', 'x', '.', 'o', '.'): Counter({4: 6, 6: 3, 8: 3}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({3: 1, 4: 3, 5: 1, 6: 1, 7: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({4: 5, 5: 3, 7: 4, 8: 3}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.'): Counter({2: 2, 3: 5, 4: 4, 8: 3}),\n",
+       "  ('x', 'x', '.', 'o', 'o', 'x', 'o', '.', '.'): Counter({2: 9, 7: 3, 8: 2}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 46, 5: 1, 7: 501}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({1: 39, 3: 1, 5: 1, 6: 1, 7: 1, 8: 1}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({5: 1, 6: 1, 7: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 1, 6: 1, 7: 1, 8: 1}),\n",
+       "  ('x', 'x', 'o', 'o', 'o', '.', '.', 'x', '.'): Counter({5: 2, 6: 2, 8: 1}),\n",
+       "  ('x', 'x', '.', '.', '.', 'o', 'o', 'x', 'o'): Counter({2: 3, 3: 1, 4: 6}),\n",
+       "  ('x', 'x', 'o', '.', 'o', 'o', '.', '.', 'x'): Counter({3: 1, 6: 5, 7: 1}),\n",
+       "  ('x', 'x', 'o', 'x', '.', '.', '.', 'o', 'o'): Counter({4: 2, 5: 3, 6: 3}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 3, 3: 5, 4: 7, 7: 3, 8: 4}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({1: 1, 3: 1, 4: 3, 6: 5, 7: 4, 8: 2}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 6, 3: 5, 4: 2, 7: 1}),\n",
+       "  ('x', 'o', '.', '.', 'o', 'x', 'x', '.', 'o'): Counter({2: 1, 3: 14, 7: 4}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({2: 3, 3: 3, 4: 5, 6: 4, 8: 4}),\n",
+       "  ('x', 'x', 'o', '.', '.', 'o', 'x', 'o', '.'): Counter({3: 4, 4: 1, 8: 6})},\n",
+       " {('x', '.', 'o', '.', 'o', 'x', '.', 'x', 'o'): Counter({1: 1, 3: 1, 6: 4}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({3: 3, 4: 3, 5: 3, 6: 5, 8: 3}),\n",
+       "  ('x', 'x', '.', 'o', '.', 'x', 'o', 'o', 'x'): Counter({2: 1, 4: 3}),\n",
+       "  ('o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({1: 17, 2: 29, 3: 36, 6: 25, 8: 12}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 1, 3: 1, 6: 1, 7: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 20, 3: 532, 4: 78, 7: 130, 8: 261}),\n",
+       "  ('x', 'x', '.', '.', 'o', 'x', 'o', 'x', 'o'): Counter({2: 12, 3: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 2, 4: 4, 5: 3, 8: 3}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'o'): Counter({2: 2, 3: 2, 4: 2, 5: 4}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 23, 3: 165, 4: 4422, 5: 56, 6: 432, 7: 203, 8: 34}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({5: 1, 6: 1, 7: 1, 8: 1}),\n",
+       "  ('x', 'o', 'o', '.', 'x', 'x', '.', 'x', 'o'): Counter({3: 3, 6: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   'x'): Counter({2: 1, 3: 2, 4: 1, 5: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({3: 3, 6: 38, 7: 2, 8: 3}),\n",
+       "  ('x', 'o', 'o', '.', 'x', 'o', '.', 'x', '.'): Counter({3: 1, 6: 1, 8: 47}),\n",
+       "  ('x', 'x', '.', 'o', '.', 'x', 'x', 'o', 'o'): Counter({2: 3, 4: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({2: 1, 3: 1, 6: 4, 8: 1}),\n",
+       "  ('x', 'x', '.', '.', 'o', 'x', 'o', 'o', '.'): Counter({2: 9, 3: 1, 8: 1}),\n",
+       "  ('.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({0: 7, 2: 3, 6: 6, 7: 1, 8: 4}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 3, 4: 5, 5: 3, 6: 4, 7: 3, 8: 3}),\n",
+       "  ('x', 'x', '.', 'o', 'o', 'x', '.', 'x', 'o'): Counter({2: 3, 6: 1}),\n",
+       "  ('o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({1: 8, 3: 3, 5: 1, 6: 1, 8: 3}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({3: 1, 5: 9, 6: 1, 7: 15}),\n",
+       "  ('x', 'x', 'o', 'x', '.', 'x', 'o', '.', 'o'): Counter({4: 9, 7: 5}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({1: 4, 3: 1, 4: 1, 6: 4, 8: 2}),\n",
+       "  ('x', 'x', 'o', 'o', '.', '.', 'o', '.', 'x'): Counter({4: 21, 5: 1, 7: 1}),\n",
+       "  ('x', 'x', '.', '.', 'x', 'o', '.', 'o', 'o'): Counter({2: 69, 3: 1, 6: 1}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 1, 3: 1, 6: 1, 7: 1, 8: 7}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 333, 3: 489, 5: 380, 6: 1023, 8: 837}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({1: 3, 3: 3, 4: 5, 6: 3, 8: 2}),\n",
+       "  ('x', 'o', 'x', 'o', 'x', 'o', 'o', 'x', '.'): Counter({8: 785}),\n",
+       "  ('o', 'x', 'o', 'x', '.', '.', '.', 'x', 'o'): Counter({4: 5, 5: 2, 6: 3}),\n",
+       "  ('o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({1: 1, 2: 18, 3: 3, 4: 2, 6: 3, 7: 1, 8: 3}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({3: 2, 4: 2, 5: 4, 6: 3, 7: 3}),\n",
+       "  ('x', 'x', '.', 'o', '.', 'x', 'o', 'o', '.'): Counter({2: 4, 4: 2, 8: 8}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 14, 3: 13, 6: 2, 7: 1, 8: 2}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 103, 3: 56, 5: 276, 6: 90, 7: 784}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({4: 5, 6: 2, 7: 3, 8: 3}),\n",
+       "  ('o', 'x', 'o', 'x', 'o', 'x', '.', '.', '.'): Counter({6: 1, 7: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({2: 1, 3: 1, 6: 1, 8: 1}),\n",
+       "  ('x', 'x', 'o', '.', 'x', '.', 'x', 'o', 'o'): Counter({3: 3, 5: 29}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({1: 39, 2: 2317, 3: 58, 4: 1404, 6: 1572, 7: 7, 8: 22}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 1, 3: 1, 5: 1, 6: 1, 7: 1, 8: 1}),\n",
+       "  ('x', 'x', 'o', '.', 'o', 'x', '.', '.', 'o'): Counter({3: 1, 6: 5, 7: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 1, 5: 1, 6: 1, 7: 1}),\n",
+       "  ('x', 'o', '.', 'o', 'x', 'x', '.', '.', 'o'): Counter({2: 17, 6: 22, 7: 3}),\n",
+       "  ('x', 'x', '.', 'o', 'x', 'x', 'o', 'o', '.'): Counter({2: 1, 8: 22}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o'): Counter({2: 6, 3: 9, 4: 1, 5: 5, 6: 24}),\n",
+       "  ('x', 'x', '.', 'o', 'o', 'x', 'x', 'o', 'o'): Counter({2: 92}),\n",
+       "  ('x', 'x', '.', '.', 'o', 'o', '.', 'x', 'o'): Counter({2: 6, 3: 3, 6: 2}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 1, 6: 1, 7: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.'): Counter({2: 2, 4: 1, 5: 3, 8: 1}),\n",
+       "  ('x', 'o', 'x', '.', 'x', '.', 'o', 'o', '.'): Counter({3: 1, 5: 1, 8: 321}),\n",
+       "  ('x', 'x', 'o', 'o', '.', 'x', 'x', 'o', '.'): Counter({4: 3, 8: 3}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({3: 1, 6: 1, 7: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({2: 4, 5: 7, 6: 3, 8: 2}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x'): Counter({2: 1, 3: 1, 4: 21, 5: 1, 6: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x'): Counter({4: 272, 5: 75, 7: 140}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 4, 3: 1, 6: 1, 7: 3}),\n",
+       "  ('x', 'x', '.', '.', '.', 'o', 'x', 'o', 'o'): Counter({2: 29, 3: 53, 4: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x'): Counter({2: 3, 3: 1, 5: 1, 6: 2}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({4: 26, 5: 2, 6: 1, 7: 1, 8: 3}),\n",
+       "  ('x', 'x', 'o', 'x', '.', 'x', '.', 'o', 'o'): Counter({4: 2, 6: 10}),\n",
+       "  ('x', 'o', 'o', 'o', 'x', 'x', '.', 'x', '.'): Counter({6: 1, 8: 3}),\n",
+       "  ('x', 'x', 'o', '.', 'o', 'x', 'x', '.', 'o'): Counter({3: 3, 7: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.'): Counter({3: 3, 4: 5, 5: 2, 8: 3}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({1: 4, 2: 3, 3: 3, 6: 3, 7: 4}),\n",
+       "  ('x', 'o', 'x', 'o', 'x', '.', '.', '.', 'o'): Counter({5: 7, 6: 703, 7: 6}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 1, 5: 1, 6: 1, 7: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({5: 10, 6: 1, 7: 310}),\n",
+       "  ('x', 'x', '.', '.', 'o', '.', 'o', 'x', 'o'): Counter({2: 4, 3: 3, 5: 2}),\n",
+       "  ('x', 'x', 'o', 'o', 'o', 'x', '.', 'o', 'x'): Counter({6: 3}),\n",
+       "  ('.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({0: 28, 2: 18, 5: 1, 6: 26, 8: 19}),\n",
+       "  ('.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({0: 1, 1: 1, 2: 1, 3: 1, 5: 1, 6: 1, 7: 1, 8: 1}),\n",
+       "  ('x', 'x', 'o', '.', 'x', 'x', 'o', '.', 'o'): Counter({3: 1, 7: 20}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({6: 16, 7: 14, 8: 521}),\n",
+       "  ('.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({0: 6, 2: 9, 3: 3, 4: 3, 5: 4, 6: 4, 8: 15}),\n",
+       "  ('x', 'x', '.', 'o', '.', '.', 'x', 'o', 'o'): Counter({2: 88, 4: 4, 5: 5}),\n",
+       "  ('x', 'x', 'o', 'o', '.', 'x', 'x', 'o', 'o'): Counter({4: 3}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 1, 3: 367, 4: 125, 5: 1, 8: 1}),\n",
+       "  ('.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({0: 1, 2: 1, 5: 1, 6: 1, 7: 1, 8: 1}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({2: 5, 4: 5, 5: 3, 6: 3, 8: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({6: 1, 7: 219, 8: 115}),\n",
+       "  ('x', 'x', 'o', '.', 'x', 'o', '.', 'o', '.'): Counter({3: 1, 6: 1, 8: 63}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({3: 2, 4: 5, 7: 4, 8: 2}),\n",
+       "  'human?': False,\n",
+       "  ('x', 'x', 'o', '.', 'o', 'o', '.', 'x', 'x'): Counter({3: 10, 6: 10}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 1, 6: 1, 7: 1, 8: 1}),\n",
+       "  ('x', 'x', 'o', 'x', 'x', 'o', 'o', 'o', '.'): Counter({8: 6}),\n",
+       "  ('x', 'x', '.', 'x', 'o', 'o', '.', '.', 'o'): Counter({2: 11, 6: 5, 7: 2}),\n",
+       "  ('x', 'o', 'x', 'o', '.', '.', '.', 'o', 'x'): Counter({4: 88, 5: 49, 6: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({3: 859, 5: 437, 6: 368, 7: 16, 8: 706}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 4, 4: 3, 5: 1, 6: 1, 7: 2, 8: 1}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({1: 2, 2: 3, 3: 3, 4: 9, 6: 1, 8: 3}),\n",
+       "  ('x', 'x', 'o', '.', 'x', '.', '.', 'o', 'o'): Counter({3: 1, 5: 1, 6: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 1, 3: 2, 4: 18, 6: 1, 8: 1}),\n",
+       "  ('x', 'o', '.', 'o', '.', 'x', '.', 'x', 'o'): Counter({2: 3, 4: 3, 6: 3}),\n",
+       "  ('x', 'x', 'o', 'o', 'o', 'x', 'x', 'o', 'x'): Counter(),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.'): Counter({3: 25, 5: 1, 7: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 1, 3: 1, 5: 1, 8: 1}),\n",
+       "  ('x', 'x', 'o', 'o', 'x', '.', 'x', 'o', 'o'): Counter({5: 3}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x'): Counter({2: 2, 3: 4, 4: 4, 6: 4, 7: 8}),\n",
+       "  ('x', 'x', 'o', '.', '.', 'o', 'x', 'o', 'x'): Counter({3: 1, 4: 1}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x'): Counter({1: 2, 3: 2, 4: 5, 5: 3, 6: 3, 7: 4}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x'): Counter({1: 1, 3: 1, 5: 1, 6: 1029, 7: 1}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({1: 626, 3: 1, 5: 38, 7: 36, 8: 109}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 2, 3: 1, 5: 1, 7: 16}),\n",
+       "  ('x', 'o', 'x', '.', 'x', '.', 'o', '.', 'o'): Counter({3: 1, 5: 1, 7: 3}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o'): Counter({1: 1, 3: 3, 4: 5, 6: 2}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({1: 1, 3: 1435, 5: 279, 6: 358, 8: 516}),\n",
+       "  ('x', 'o', 'o', 'o', 'x', 'x', 'o', 'x', '.'): Counter({8: 189}),\n",
+       "  ('x', 'x', 'o', '.', 'o', '.', 'x', 'o', '.'): Counter({3: 60, 5: 3, 8: 7}),\n",
+       "  ('x', 'x', 'o', 'o', 'x', 'x', '.', '.', 'o'): Counter({6: 1, 7: 3}),\n",
+       "  ('x', 'x', 'o', '.', '.', '.', 'x', 'o', 'o'): Counter({3: 47, 4: 1, 5: 8}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.'): Counter({1: 1, 3: 1, 5: 1, 8: 1}),\n",
+       "  ('o', 'x', '.', 'x', 'o', 'x', '.', 'o', '.'): Counter({2: 3, 6: 1, 8: 3}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({1: 1, 2: 1, 3: 2, 6: 1, 8: 1}),\n",
+       "  ('x', 'x', 'o', 'o', 'x', 'x', 'o', 'o', '.'): Counter({8: 285}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({2: 1, 3: 1, 4: 3, 5: 1, 6: 1, 8: 1}),\n",
+       "  ('x', 'x', 'o', '.', 'o', '.', '.', 'x', 'o'): Counter({3: 1, 5: 1, 6: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o'): Counter({3: 4, 4: 5, 5: 5, 6: 4}),\n",
+       "  ('x', 'x', 'o', 'o', 'x', 'x', '.', 'o', '.'): Counter({6: 1, 8: 3}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({3: 1, 5: 1, 6: 1, 8: 1}),\n",
+       "  ('x', 'x', '.', '.', 'o', 'o', 'x', '.', 'o'): Counter({2: 23, 3: 5, 7: 1}),\n",
+       "  ('x', 'x', 'o', 'o', 'o', '.', 'x', 'x', '.'): Counter({5: 20, 8: 3}),\n",
+       "  ('x', 'x', 'o', 'o', 'o', 'x', 'x', 'o', '.'): Counter({8: 3}),\n",
+       "  ('o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({1: 3913, 2: 1396, 3: 3356, 5: 1, 6: 2434, 7: 12, 8: 188}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'o'): Counter({1: 2, 2: 1, 3: 7, 4: 1, 6: 9}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 103, 3: 1, 5: 1, 6: 1, 7: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 127, 3: 309, 4: 732, 5: 9, 7: 78}),\n",
+       "  ('x', 'x', 'o', 'o', 'o', 'x', '.', 'x', '.'): Counter({6: 8, 8: 3}),\n",
+       "  ('x', 'o', 'x', 'o', 'o', '.', '.', 'x', '.'): Counter({5: 24, 6: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({3: 730, 6: 22, 7: 4}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o'): Counter({1: 1, 2: 2, 3: 3, 6: 5}),\n",
+       "  ('.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({0: 1, 2: 2, 4: 7, 5: 3, 6: 2, 8: 1}),\n",
+       "  ('x', 'o', 'o', 'o', '.', 'x', '.', 'x', '.'): Counter({4: 6, 6: 4, 8: 10}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({4: 4, 5: 3, 6: 4, 8: 3}),\n",
+       "  ('x', 'x', '.', 'o', 'o', 'x', 'o', 'x', 'o'): Counter({2: 14}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 1, 3: 1, 5: 1, 7: 1}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({1: 3, 2: 1036, 3: 13, 4: 342, 5: 6, 6: 1250, 7: 1}),\n",
+       "  ('x', 'x', 'o', 'o', 'o', '.', 'x', '.', '.'): Counter({5: 3, 7: 1, 8: 1}),\n",
+       "  ('x', 'x', 'o', 'x', '.', 'o', 'o', '.', '.'): Counter({4: 1, 7: 1, 8: 1}),\n",
+       "  ('x', 'x', '.', 'o', '.', 'x', '.', 'o', 'o'): Counter({2: 8, 4: 1, 6: 5}),\n",
+       "  ('x', 'o', '.', '.', 'o', 'o', 'x', '.', 'x'): Counter({2: 1, 3: 50, 7: 29}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({3: 1, 5: 1, 7: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({4: 3, 5: 4, 6: 3, 8: 2}),\n",
+       "  ('x', 'x', 'o', '.', '.', '.', 'o', 'o', 'x'): Counter({3: 1, 4: 23, 5: 1}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({5: 54, 7: 52, 8: 137}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 7, 3: 25, 5: 183, 7: 112, 8: 1989}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x'): Counter({3: 215, 4: 38, 7: 56}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o'): Counter({1: 5, 3: 1, 5: 2, 7: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 228, 3: 248, 8: 194}),\n",
+       "  ('x', 'x', 'o', 'o', 'o', 'x', 'x', '.', 'o'): Counter({7: 3}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.'): Counter({4: 3, 5: 7, 7: 3, 8: 3}),\n",
+       "  ('x', 'x', 'o', '.', '.', 'o', 'o', '.', 'x'): Counter({3: 1, 4: 32, 7: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 48, 6: 163, 8: 84}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 1, 5: 1, 6: 1, 8: 1}),\n",
+       "  ('o', 'x', 'o', 'x', '.', 'x', 'o', '.', '.'): Counter({4: 4, 7: 2, 8: 3}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x'): Counter({2: 3, 4: 4, 6: 2, 7: 2}),\n",
+       "  ('x', 'x', 'o', 'x', '.', 'o', '.', 'o', 'x'): Counter({4: 1, 6: 1}),\n",
+       "  ('x', 'o', '.', '.', '.', 'x', 'o', 'x', 'o'): Counter({2: 3, 3: 3, 4: 5}),\n",
+       "  ('x', 'x', 'o', 'o', '.', 'o', '.', 'x', 'x'): Counter({4: 8, 6: 2}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 2, 3: 404, 5: 1, 7: 93, 8: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({5: 1, 6: 1, 7: 1, 8: 1}),\n",
+       "  ('x', 'x', 'o', 'o', '.', 'o', 'x', '.', 'x'): Counter({4: 9, 7: 1}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'o'): Counter({1: 3, 3: 2, 4: 2, 5: 2}),\n",
+       "  ('x', 'x', '.', 'o', 'o', 'x', 'x', '.', 'o'): Counter({2: 3, 7: 1}),\n",
+       "  ('x', 'o', 'o', '.', 'o', 'x', 'x', '.', '.'): Counter({3: 61, 7: 35, 8: 1}),\n",
+       "  ('x', 'x', 'o', 'o', '.', 'x', '.', 'x', 'o'): Counter({4: 3, 6: 1}),\n",
+       "  ('x', 'x', 'o', '.', '.', 'x', 'o', '.', 'o'): Counter({3: 1, 4: 2, 7: 1}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o'): Counter({2: 3, 3: 3, 4: 4, 5: 3, 6: 3}),\n",
+       "  ('x', 'x', 'o', 'o', '.', 'x', 'x', '.', 'o'): Counter({4: 3, 7: 3}),\n",
+       "  ('x', 'x', 'o', 'o', 'o', 'x', '.', 'x', 'o'): Counter({6: 3}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 1, 3: 1, 6: 1, 8: 1}),\n",
+       "  ('x', 'x', 'o', 'o', '.', 'o', 'x', 'o', 'x'): Counter({4: 173}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 22, 3: 4, 5: 8, 6: 6, 8: 5}),\n",
+       "  ('x', 'x', '.', 'o', 'o', '.', '.', 'x', 'o'): Counter({2: 5, 5: 4, 6: 2}),\n",
+       "  ('x', 'x', '.', 'o', 'x', 'o', 'x', 'o', '.'): Counter({2: 1, 8: 1}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 2, 5: 1, 6: 821, 7: 559, 8: 1}),\n",
+       "  ('x', 'x', 'o', 'o', '.', 'x', 'o', '.', 'x'): Counter({4: 7, 7: 2}),\n",
+       "  ('x', 'x', '.', 'o', 'x', 'x', 'o', '.', 'o'): Counter({2: 1, 7: 23}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 40, 5: 6, 6: 2, 7: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({1: 1, 3: 2, 5: 1, 6: 8, 8: 3}),\n",
+       "  ('x', 'x', '.', '.', 'o', 'o', 'o', '.', 'x'): Counter({2: 31, 3: 1, 7: 1}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 1, 5: 1, 6: 1, 7: 2, 8: 3}),\n",
+       "  ('.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({0: 2, 2: 5, 4: 2, 6: 4, 7: 3, 8: 9}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x'): Counter({3: 3, 4: 3, 5: 2, 7: 3}),\n",
+       "  ('.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({0: 1, 2: 1, 3: 1, 4: 109, 5: 1, 6: 1, 7: 1, 8: 1}),\n",
+       "  ('o', 'x', '.', '.', 'x', 'x', 'o', '.', 'o'): Counter({2: 1, 3: 43, 7: 38}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({1: 1, 3: 1, 7: 1, 8: 1}),\n",
+       "  ('x', 'x', 'o', 'x', 'o', 'o', '.', '.', '.'): Counter({6: 13, 7: 1, 8: 3}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({3: 1, 4: 249, 5: 1, 6: 1, 8: 1}),\n",
+       "  ('x', 'o', '.', '.', 'x', 'o', '.', 'x', 'o'): Counter({2: 16, 3: 1, 6: 1}),\n",
+       "  ('x', 'x', '.', 'x', 'o', 'o', '.', 'o', 'x'): Counter({2: 1, 6: 1}),\n",
+       "  ('x', 'x', '.', 'o', '.', 'o', 'x', 'o', 'x'): Counter({2: 3, 4: 6}),\n",
+       "  ('.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({0: 4, 2: 3, 6: 4, 8: 6}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({1: 1, 2: 1, 3: 1, 5: 1, 6: 12, 7: 1, 8: 2418}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({1: 2, 3: 2, 6: 17, 8: 8}),\n",
+       "  ('x', 'x', 'o', 'o', '.', 'x', 'o', 'x', 'o'): Counter({4: 11}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({3: 3, 4: 3, 6: 3, 7: 3}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({3: 145, 6: 240, 8: 200}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({3: 1, 4: 4, 5: 8, 7: 14, 8: 736}),\n",
+       "  ('x', 'x', '.', 'o', 'x', 'o', 'x', 'o', 'o'): Counter({2: 287}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 1, 3: 1, 6: 1, 7: 8, 8: 1}),\n",
+       "  ('o', 'x', 'o', 'x', 'o', '.', '.', 'x', '.'): Counter({5: 1, 6: 3, 8: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o'): Counter({3: 3, 4: 3, 5: 6, 7: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 1, 3: 1, 5: 1, 8: 23}),\n",
+       "  ('o', 'x', '.', 'x', '.', 'x', '.', 'o', 'o'): Counter({2: 3, 4: 3, 6: 5}),\n",
+       "  ('o', 'x', '.', 'o', 'o', 'x', '.', 'x', '.'): Counter({2: 2, 6: 3, 8: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.'): Counter({3: 2, 4: 1, 7: 2, 8: 2}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'o'): Counter({2: 3, 3: 3, 4: 3, 6: 5}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({3: 5, 5: 16, 6: 26, 8: 8}),\n",
+       "  ('x', 'o', 'o', '.', 'o', 'x', '.', 'x', '.'): Counter({3: 1, 6: 10, 8: 1}),\n",
+       "  ('.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({0: 2, 2: 5, 6: 3, 8: 5}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 178, 3: 1, 7: 198}),\n",
+       "  ('x', 'x', 'o', 'o', '.', 'x', 'o', 'o', 'x'): Counter({4: 8}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 215, 6: 1, 7: 112}),\n",
+       "  ('x', 'x', 'o', 'x', 'x', 'o', '.', 'o', '.'): Counter({6: 1, 8: 16}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x'): Counter({3: 2, 4: 1, 5: 1, 6: 6}),\n",
+       "  ('x', 'o', 'o', '.', '.', 'x', 'o', 'x', '.'): Counter({3: 1, 4: 9, 8: 3}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({1: 2, 3: 30, 4: 2244, 5: 3, 6: 2399, 7: 1, 8: 542}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({1: 1, 3: 1, 6: 1, 7: 1, 8: 2655}),\n",
+       "  ('x', 'o', 'x', 'o', 'x', 'o', '.', 'x', '.'): Counter({6: 1, 8: 1}),\n",
+       "  ('.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({0: 3, 2: 4, 4: 3, 6: 3, 8: 3}),\n",
+       "  ('x', 'x', '.', 'x', 'x', 'o', '.', 'o', 'o'): Counter({2: 10, 6: 6}),\n",
+       "  ('x', 'x', 'o', '.', 'o', 'o', 'x', '.', '.'): Counter({3: 19, 7: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 7, 3: 2, 4: 2, 7: 6}),\n",
+       "  ('o', 'x', 'o', 'x', 'o', 'x', '.', 'x', '.'): Counter({6: 4, 8: 11}),\n",
+       "  ('x', 'o', 'o', '.', 'x', 'x', 'x', '.', 'o'): Counter({3: 3, 7: 1}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({1: 3, 3: 1, 6: 1, 8: 21}),\n",
+       "  ('o', 'x', 'o', 'x', 'x', 'o', '.', '.', '.'): Counter({6: 1, 7: 321, 8: 9}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.'): Counter({1: 1, 3: 107, 8: 162}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 1, 3: 2, 7: 19, 8: 4}),\n",
+       "  ('x', 'o', '.', '.', 'o', 'x', 'o', 'x', '.'): Counter({2: 8, 3: 1, 8: 1}),\n",
+       "  ('x', 'x', '.', 'o', 'o', '.', 'x', '.', 'o'): Counter({2: 21, 5: 4, 7: 2}),\n",
+       "  ('x', 'x', '.', 'o', '.', 'o', 'o', 'x', '.'): Counter({2: 5, 4: 6, 8: 3}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({5: 257, 6: 278, 8: 317}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 1, 3: 1, 5: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 2, 3: 1, 4: 1, 6: 1, 7: 1, 8: 8}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({1: 1, 2: 1, 3: 1, 4: 44, 5: 1, 6: 1, 7: 1, 8: 1}),\n",
+       "  ('o', 'x', '.', 'o', 'x', 'x', '.', 'o', '.'): Counter({2: 1, 6: 24, 8: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'o'): Counter({2: 3, 3: 22, 5: 140}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({1: 1, 3: 1, 6: 1, 7: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.'): Counter({4: 4, 5: 2, 7: 3, 8: 2}),\n",
+       "  ('x', 'x', 'o', 'x', '.', '.', 'o', '.', 'o'): Counter({4: 3, 5: 3, 7: 3}),\n",
+       "  ('x', 'x', 'o', '.', '.', 'o', '.', 'o', 'x'): Counter({3: 8, 4: 6, 6: 11}),\n",
+       "  ('x', 'o', 'x', 'o', '.', 'o', 'x', '.', '.'): Counter({4: 27, 7: 1, 8: 2}),\n",
+       "  ('x', 'o', 'o', '.', '.', 'x', 'x', 'o', '.'): Counter({3: 42, 4: 51, 8: 1}),\n",
+       "  ('x', 'x', 'o', 'o', '.', 'o', 'x', '.', '.'): Counter({4: 1, 7: 1, 8: 1}),\n",
+       "  ('x', 'x', 'o', 'o', '.', 'o', '.', '.', 'x'): Counter({4: 12, 6: 1, 7: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 3, 5: 2, 6: 1, 7: 1}),\n",
+       "  ('x', 'x', 'o', 'o', 'x', 'x', 'o', '.', 'o'): Counter({7: 268}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 5, 3: 3, 4: 4, 8: 3}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x'): Counter({2: 3, 4: 6, 5: 5, 6: 5, 7: 6}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({2: 3, 3: 3, 4: 3, 6: 3, 8: 3}),\n",
+       "  ('.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({0: 12, 2: 27, 6: 33, 7: 18, 8: 17}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o'): Counter({2: 3, 3: 3, 4: 3, 6: 1}),\n",
+       "  ('x', 'x', 'o', 'o', 'o', '.', '.', '.', 'x'): Counter({5: 1, 6: 1, 7: 1}),\n",
+       "  ('x', 'x', 'o', 'o', 'o', '.', 'x', 'x', 'o'): Counter({5: 3}),\n",
+       "  ('.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({0: 9, 2: 10, 3: 8, 5: 4, 6: 5, 8: 2}),\n",
+       "  ('x', 'x', 'o', 'o', 'x', 'x', 'x', 'o', 'o'): Counter(),\n",
+       "  ('x', 'x', 'o', '.', 'o', 'x', '.', 'x', 'o'): Counter({3: 3, 6: 20}),\n",
+       "  ('x', 'x', 'o', '.', 'o', 'o', 'x', 'o', 'x'): Counter({3: 344}),\n",
+       "  ('x', 'o', 'o', '.', 'x', 'x', 'o', 'x', '.'): Counter({3: 1, 8: 1}),\n",
+       "  ('x', 'x', '.', '.', 'o', 'x', 'o', '.', 'o'): Counter({2: 6, 3: 1, 7: 2}),\n",
+       "  ('x', 'x', 'o', 'o', 'x', '.', 'x', '.', 'o'): Counter({5: 25, 7: 3}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 1, 6: 1, 7: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 2, 3: 1, 4: 1, 5: 1, 7: 1, 8: 1}),\n",
+       "  ('x', '.', 'x', '.', 'o', '.', 'o', 'x', 'o'): Counter({1: 17, 3: 3, 5: 5}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o'): Counter({1: 802, 3: 1, 4: 1, 5: 1, 7: 6}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x'): Counter({4: 5, 5: 7, 6: 2, 7: 3}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({4: 223, 5: 180, 6: 2, 7: 22, 8: 14}),\n",
+       "  ('x', 'o', 'o', '.', '.', 'x', '.', 'x', 'o'): Counter({3: 4, 4: 5, 6: 3}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 4, 4: 3, 7: 2, 8: 2}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({3: 1, 5: 1, 7: 2, 8: 10}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x'): Counter({2: 1, 3: 1, 4: 1, 6: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({5: 270, 7: 87, 8: 141}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 10, 4: 17, 5: 6, 7: 6, 8: 20}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({3: 5, 4: 6, 5: 7, 6: 27, 8: 17}),\n",
+       "  ('.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({0: 2137, 2: 1316, 3: 221, 5: 292, 6: 2347, 7: 12, 8: 5714}),\n",
+       "  ('x', 'x', 'o', 'o', '.', 'x', '.', 'o', 'x'): Counter({4: 3, 6: 2}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({1: 1, 3: 1, 6: 1, 8: 1}),\n",
+       "  ('x', 'o', 'x', 'o', 'x', '.', '.', 'x', 'o'): Counter({5: 1, 6: 3}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.'): Counter({2: 6, 3: 10, 4: 6, 5: 6, 8: 9}),\n",
+       "  ('x', 'o', 'x', 'o', '.', '.', 'o', 'x', '.'): Counter({4: 9, 5: 11, 8: 90}),\n",
+       "  ('o', 'x', 'o', 'x', '.', 'o', '.', 'x', '.'): Counter({4: 5, 6: 1, 8: 3}),\n",
+       "  ('x', 'o', '.', '.', 'x', 'o', 'o', 'x', '.'): Counter({2: 8, 3: 9, 8: 334}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 15, 3: 2, 7: 2, 8: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 5, 3: 10, 4: 6, 6: 7, 8: 5}),\n",
+       "  ('x', 'x', '.', 'o', 'o', 'x', 'o', 'x', '.'): Counter({2: 8, 8: 1}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o'): Counter({1: 4, 3: 1, 5: 20, 6: 1}),\n",
+       "  ('x', 'o', 'x', 'o', '.', '.', 'x', '.', 'o'): Counter({4: 222, 5: 8, 7: 8}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 1, 3: 1, 6: 1, 7: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 2, 3: 3, 4: 3, 8: 2}),\n",
+       "  ('x', 'x', 'o', 'o', '.', 'o', '.', 'x', '.'): Counter({4: 9, 6: 1, 8: 3}),\n",
+       "  ('x', 'x', 'o', 'o', '.', '.', 'x', 'o', '.'): Counter({4: 18, 5: 3, 8: 17}),\n",
+       "  ('x', 'x', 'o', '.', 'o', '.', 'x', '.', 'o'): Counter({3: 9, 5: 7, 7: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({4: 4, 5: 4, 6: 5, 7: 4}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({3: 3, 4: 2, 5: 1, 6: 10, 8: 8}),\n",
+       "  ('x', 'x', 'o', 'x', 'o', 'x', '.', '.', 'o'): Counter({6: 18, 7: 1}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 1, 6: 14, 7: 5, 8: 1}),\n",
+       "  ('x', 'x', '.', 'o', '.', '.', 'o', 'o', 'x'): Counter({2: 9, 4: 26, 5: 4}),\n",
+       "  ('x', 'x', '.', 'o', '.', 'o', 'o', '.', 'x'): Counter({2: 13, 4: 19, 7: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'o'): Counter({2: 10, 3: 1, 5: 3, 6: 14}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x'): Counter({3: 383, 5: 1, 7: 451}),\n",
+       "  ('x', 'o', 'x', '.', 'x', '.', 'o', 'x', 'o'): Counter({3: 3, 5: 3}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({3: 12, 5: 2, 6: 3, 8: 2}),\n",
+       "  ('x', 'o', 'o', '.', 'x', 'x', 'x', 'o', '.'): Counter({3: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 19, 3: 2, 5: 2, 7: 2, 8: 2}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 1, 3: 1, 4: 1, 6: 2, 7: 1, 8: 1}),\n",
+       "  ('x', 'x', 'o', '.', 'o', '.', '.', 'o', 'x'): Counter({3: 1, 5: 1, 6: 158}),\n",
+       "  ('x', 'o', 'x', 'o', 'x', '.', 'o', 'x', 'o'): Counter({5: 3}),\n",
+       "  ('x', 'x', '.', 'o', 'x', '.', 'x', 'o', 'o'): Counter({2: 3, 5: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({3: 3, 4: 5, 6: 3, 8: 4}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 576, 3: 241, 6: 222, 7: 171, 8: 94}),\n",
+       "  ('x', 'x', '.', 'x', 'o', 'x', '.', 'o', 'o'): Counter({2: 1, 6: 18}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.'): Counter({1: 1, 3: 3, 4: 3, 8: 2}),\n",
+       "  ('x', 'x', '.', 'o', 'o', 'x', 'o', '.', 'x'): Counter({2: 11, 7: 1}),\n",
+       "  ('.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({0: 4, 2: 3, 4: 3, 6: 3, 8: 4}),\n",
+       "  ('x', 'x', 'o', '.', '.', '.', 'o', 'x', 'o'): Counter({3: 2, 4: 3, 5: 3}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o'): Counter({1: 6, 3: 1, 5: 1, 7: 13}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({5: 1, 6: 28, 7: 1, 8: 1}),\n",
+       "  ('x', 'o', 'x', 'o', '.', '.', '.', 'x', 'o'): Counter({4: 5, 5: 3, 6: 8}),\n",
+       "  ('.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({0: 1, 2: 1, 3: 1, 5: 1, 6: 3, 8: 2}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 1, 5: 1, 7: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 3, 3: 3, 4: 3, 8: 3}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o'): Counter({3: 717, 5: 1, 7: 30}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x'): Counter({2: 2, 3: 4, 4: 3, 7: 2}),\n",
+       "  ('o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({2: 10, 3: 2, 5: 1, 6: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({2: 6, 3: 4, 5: 2, 6: 23, 8: 20}),\n",
+       "  ('x', 'x', '.', 'o', '.', 'o', '.', 'x', 'o'): Counter({2: 3, 4: 5, 6: 2}),\n",
+       "  ('x', 'x', 'o', 'x', 'o', '.', '.', 'x', 'o'): Counter({5: 14, 6: 6}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({3: 177, 5: 188, 6: 103, 7: 553, 8: 263}),\n",
+       "  ('x', 'x', 'o', 'x', 'x', '.', '.', 'o', 'o'): Counter({5: 11, 6: 11}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 1, 3: 1, 6: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x'): Counter({2: 339, 3: 164, 6: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'o'): Counter({2: 31, 3: 39, 5: 29}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 341, 3: 147, 6: 703, 7: 96, 8: 1591}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({1: 1, 2: 1, 3: 1, 6: 1, 7: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x'): Counter({1: 1, 3: 2, 4: 90, 5: 1, 7: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({2: 19, 3: 8, 6: 5, 8: 2}),\n",
+       "  ('x', 'x', 'o', '.', 'o', 'x', '.', 'o', '.'): Counter({3: 1, 6: 6, 8: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 272, 5: 1, 8: 52}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 14, 3: 1, 4: 1, 5: 1, 8: 12}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 6, 3: 1, 4: 1, 5: 5, 6: 8, 7: 1}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({1: 2, 3: 2, 4: 7, 5: 3, 6: 1, 8: 5}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({2: 4, 3: 11, 6: 9, 8: 9}),\n",
+       "  ('x', 'x', '.', 'x', '.', 'o', '.', 'o', 'o'): Counter({2: 4, 4: 3, 6: 5}),\n",
+       "  ('.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({0: 3072,\n",
+       "           1: 6,\n",
+       "           2: 5368,\n",
+       "           3: 4,\n",
+       "           4: 23299,\n",
+       "           5: 5,\n",
+       "           6: 2362,\n",
+       "           7: 2,\n",
+       "           8: 10107}),\n",
+       "  ('x', 'x', '.', 'o', 'x', 'x', '.', 'o', 'o'): Counter({2: 3, 6: 17}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 2, 4: 3, 6: 3, 7: 1}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({5: 311, 6: 10, 8: 6}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 2, 3: 4, 7: 2, 8: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({3: 5, 4: 2, 6: 1, 7: 1, 8: 6}),\n",
+       "  ('x', 'o', 'x', 'o', 'o', '.', 'x', '.', 'x'): Counter({5: 11, 7: 8}),\n",
+       "  ('x', 'x', 'o', 'o', 'o', '.', 'x', '.', 'x'): Counter({5: 30, 7: 3}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({1: 2, 2: 1801, 3: 1, 6: 1, 7: 1}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 1, 3: 4, 6: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x'): Counter({1: 4, 2: 2, 3: 11, 5: 4, 6: 12, 7: 4}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x'): Counter({2: 1, 4: 2, 5: 1, 6: 2}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.'): Counter({1: 1, 3: 3, 5: 2, 8: 17}),\n",
+       "  ('x', 'o', '.', '.', 'x', 'x', '.', 'o', 'o'): Counter({2: 1, 3: 96, 6: 61}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 5, 3: 1, 4: 1, 5: 1, 6: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({3: 1, 4: 21, 5: 1, 7: 1, 8: 1}),\n",
+       "  ('x', 'o', 'x', 'o', '.', 'o', 'x', 'o', 'x'): Counter({4: 6}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 1, 3: 323, 5: 104, 6: 509, 8: 12}),\n",
+       "  ('x', 'o', '.', 'o', 'o', 'x', '.', 'x', '.'): Counter({2: 3, 6: 5, 8: 4}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 4, 3: 3, 4: 20, 5: 2, 6: 6, 7: 4, 8: 2}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.'): Counter({3: 18, 5: 1, 7: 32, 8: 1}),\n",
+       "  ('x', 'o', '.', '.', 'o', 'x', '.', 'x', 'o'): Counter({2: 3, 3: 6, 6: 5}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.'): Counter({2: 2, 3: 1, 4: 4, 8: 3}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({2: 2, 4: 2, 6: 3, 8: 3}),\n",
+       "  ('x', 'x', '.', 'o', 'o', 'x', '.', '.', 'o'): Counter({2: 9, 6: 3, 7: 5}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x'): Counter({2: 4, 4: 2, 5: 3, 7: 3}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({1: 1, 3: 1, 6: 6, 7: 1, 8: 3}),\n",
+       "  ('x', 'x', 'o', 'o', '.', 'x', '.', 'o', '.'): Counter({4: 7, 6: 3, 8: 3}),\n",
+       "  ('x', 'x', 'o', 'o', '.', '.', 'o', 'x', '.'): Counter({4: 5, 5: 1, 8: 3}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({1: 168, 2: 364, 3: 68, 6: 288, 8: 666}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 11, 4: 14, 5: 7, 6: 8, 8: 20}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o'): Counter({1: 1, 3: 1, 4: 1, 5: 1, 6: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 1, 3: 105, 8: 77}),\n",
+       "  ('x', 'x', '.', 'o', '.', 'x', 'o', 'x', 'o'): Counter({2: 1, 4: 1}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'o'): Counter({1: 1, 3: 542, 6: 13}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'o'): Counter({2: 21, 3: 1, 4: 1, 5: 3, 6: 5}),\n",
+       "  ('x', 'x', '.', 'o', '.', '.', 'o', 'x', 'o'): Counter({2: 5, 4: 5, 5: 4}),\n",
+       "  ('x', 'x', '.', 'o', 'o', 'x', '.', 'o', '.'): Counter({2: 10, 6: 3, 8: 5}),\n",
+       "  ('o', 'x', 'o', 'x', '.', 'x', 'o', 'x', 'o'): Counter({4: 3}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({5: 11, 7: 7, 8: 767}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({4: 3, 6: 4, 7: 1, 8: 4}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({3: 1, 5: 1, 6: 1, 7: 1, 8: 1}),\n",
+       "  ('x', 'x', '.', '.', 'o', 'o', 'x', 'o', 'x'): Counter({2: 2, 3: 15}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 11, 3: 6, 5: 5, 6: 5, 7: 4}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o'): Counter({2: 3, 4: 4, 5: 3, 6: 2}),\n",
+       "  ('x', 'x', 'o', 'x', 'x', 'o', 'o', '.', '.'): Counter({7: 1, 8: 17}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({4: 4, 6: 3, 7: 2, 8: 2}),\n",
+       "  ('x', 'x', '.', 'o', '.', 'x', 'o', '.', 'o'): Counter({2: 9, 4: 2, 7: 4}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 4, 3: 4, 4: 6, 7: 7, 8: 10}),\n",
+       "  ('x', 'o', 'x', 'o', 'o', '.', 'x', '.', '.'): Counter({5: 1, 7: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.'): Counter({3: 4, 4: 3, 7: 2, 8: 8}),\n",
+       "  ('x', 'x', '.', '.', 'o', '.', 'o', 'o', 'x'): Counter({2: 503, 3: 1, 5: 2}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o'): Counter({2: 8, 3: 2, 4: 1, 6: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.'): Counter({3: 124, 5: 77, 8: 145}),\n",
+       "  ('o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({1: 4, 2: 1, 3: 7, 4: 2, 6: 2, 8: 3}),\n",
+       "  ('x', 'x', 'o', '.', 'o', '.', 'x', 'o', 'x'): Counter({3: 3, 5: 1}),\n",
+       "  ('x', 'x', '.', 'o', 'x', 'o', 'x', '.', 'o'): Counter({2: 19, 7: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 3, 6: 1, 7: 3, 8: 2}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o'): Counter({2: 5, 3: 1, 5: 1, 6: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o'): Counter({3: 3, 4: 2, 5: 3, 7: 1}),\n",
+       "  ('x', 'x', 'o', 'o', 'o', 'x', '.', '.', '.'): Counter({6: 3, 7: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x'): Counter({2: 1, 3: 1, 5: 1, 6: 1, 7: 1551}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 1, 3: 23, 7: 2, 8: 1}),\n",
+       "  ('x', 'x', 'o', 'x', 'x', '.', 'o', '.', 'o'): Counter({5: 4, 7: 13}),\n",
+       "  ('x', 'x', 'o', 'o', '.', 'x', '.', '.', 'o'): Counter({4: 3, 6: 3, 7: 5}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({3: 3, 4: 3, 6: 3, 8: 1}),\n",
+       "  ('x', 'x', 'o', '.', 'o', 'o', '.', 'x', '.'): Counter({3: 1, 6: 1, 8: 1}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.'): Counter({2: 4, 3: 4, 4: 3, 5: 1, 8: 1}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 1, 3: 1, 4: 12, 6: 1, 7: 2, 8: 2}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({6: 139, 7: 104, 8: 282}),\n",
+       "  ('x', 'o', 'x', 'o', 'x', '.', 'o', 'x', '.'): Counter({5: 1, 8: 3}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x'): Counter({2: 13, 3: 1, 5: 1, 7: 4}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 53, 6: 1, 7: 179}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 10, 3: 4, 4: 1, 5: 1, 7: 6}),\n",
+       "  ('x', 'x', 'o', 'x', '.', 'o', 'o', '.', 'x'): Counter({4: 6, 7: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 1, 3: 1, 5: 1, 6: 1, 7: 1, 8: 1}),\n",
+       "  ('x', 'o', 'o', '.', 'x', 'x', 'o', 'x', 'o'): Counter({3: 736}),\n",
+       "  ('x', 'x', 'o', 'x', 'o', 'o', '.', 'x', '.'): Counter({6: 14, 8: 13}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 1, 3: 3, 4: 13, 6: 4, 7: 4}),\n",
+       "  ('x', 'x', '.', 'o', 'o', 'x', '.', 'o', 'x'): Counter({2: 3, 6: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({5: 14, 6: 6, 8: 162}),\n",
+       "  ('o', 'o', '.', 'o', 'x', 'x', '.', 'x', '.'): Counter({2: 3, 6: 2, 8: 1}),\n",
+       "  ('x', 'x', 'o', 'o', '.', 'o', 'x', 'x', '.'): Counter({4: 4, 8: 6}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'o'): Counter({1: 1, 2: 3, 3: 2, 6: 16}),\n",
+       "  ('x', 'x', 'o', 'x', 'o', '.', '.', 'o', '.'): Counter({5: 5, 6: 6, 8: 3}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({1: 1, 3: 1, 5: 1, 6: 1, 7: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x'): Counter({4: 3, 5: 3, 6: 1, 7: 1}),\n",
+       "  ('x', 'x', 'o', 'x', 'o', 'o', '.', 'o', 'x'): Counter({6: 185}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x'): Counter({3: 14, 5: 6, 6: 28, 7: 4}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.'): Counter({2: 5, 3: 1, 4: 4, 8: 2}),\n",
+       "  ('x', 'x', 'o', 'o', 'x', '.', 'x', 'o', '.'): Counter({5: 1, 8: 3}),\n",
+       "  ('x', 'o', 'o', '.', '.', 'x', 'x', '.', 'o'): Counter({3: 92, 4: 4, 7: 3}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 8, 6: 4, 7: 4, 8: 16}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 534, 3: 331, 7: 1}),\n",
+       "  ('x', 'o', 'x', 'o', '.', 'o', 'x', '.', 'x'): Counter({4: 6, 7: 3}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({3: 2, 5: 1, 6: 1, 8: 17}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o'): Counter({3: 1087, 5: 8, 7: 1}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 1, 4: 4, 6: 2, 8: 3}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.'): Counter({2: 1, 3: 1, 5: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x'): Counter({2: 63, 3: 5, 4: 61, 5: 62, 7: 9}),\n",
+       "  ('x', 'x', '.', '.', 'o', 'o', 'x', 'o', '.'): Counter({2: 45, 3: 36, 8: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 3, 4: 1, 7: 3, 8: 2}),\n",
+       "  ('x', 'x', 'o', 'o', 'x', 'o', 'x', '.', '.'): Counter({7: 1, 8: 18}),\n",
+       "  ('x', 'x', 'o', 'x', '.', 'x', 'o', 'o', '.'): Counter({4: 7, 8: 4}),\n",
+       "  ('x', 'x', 'o', 'o', '.', '.', '.', 'o', 'x'): Counter({4: 11, 5: 3, 6: 6}),\n",
+       "  ('o', 'x', 'o', 'x', '.', 'x', 'o', 'x', '.'): Counter({4: 5, 8: 3}),\n",
+       "  ('x', 'x', '.', 'o', 'o', '.', '.', 'o', 'x'): Counter({2: 505, 5: 4, 6: 1}),\n",
+       "  ('x', 'x', 'o', 'o', '.', '.', 'x', 'o', 'x'): Counter({4: 3, 5: 2}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({2: 2, 3: 1, 4: 11, 5: 1, 6: 1, 8: 2}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 25, 3: 1, 6: 1, 7: 2}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 1, 6: 92, 7: 100}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({3: 1, 7: 205, 8: 232}),\n",
+       "  ('x', 'x', '.', 'o', '.', 'o', '.', 'o', 'x'): Counter({2: 11, 4: 18, 6: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x'): Counter({2: 1, 3: 1, 4: 2, 5: 1, 6: 1, 7: 2}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 12, 4: 12, 6: 7, 7: 9, 8: 25}),\n",
+       "  ('x', 'x', 'o', 'x', 'o', 'o', '.', '.', 'x'): Counter({6: 15, 7: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x'): Counter({3: 3, 4: 3, 6: 3, 7: 1}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 2, 4: 5, 6: 3, 7: 3}),\n",
+       "  ('.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({0: 21, 2: 15, 5: 1, 6: 5, 7: 1, 8: 8}),\n",
+       "  ('o', 'x', '.', '.', 'x', 'x', 'o', 'o', '.'): Counter({2: 1, 3: 40, 8: 1}),\n",
+       "  ('x', 'x', 'o', 'x', 'o', '.', '.', 'o', 'x'): Counter({5: 1, 6: 13}),\n",
+       "  ('x', 'x', 'o', 'o', 'x', 'x', 'o', '.', '.'): Counter({7: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({1: 3, 3: 3, 4: 5, 6: 4, 7: 2}),\n",
+       "  ('x', 'o', '.', 'o', 'x', 'x', '.', 'x', 'o'): Counter({2: 3, 6: 3}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({4: 4, 5: 4, 6: 1, 8: 4}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({3: 1, 6: 1, 7: 1, 8: 24}),\n",
+       "  ('x', 'o', 'x', 'o', '.', 'o', '.', 'x', '.'): Counter({4: 15, 6: 2, 8: 1}),\n",
+       "  ('x', 'o', 'o', '.', 'x', '.', '.', 'x', 'o'): Counter({3: 1, 5: 19, 6: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o'): Counter({2: 12, 3: 1, 5: 1, 6: 3}),\n",
+       "  ('x', 'o', 'x', '.', 'o', '.', 'o', 'x', '.'): Counter({3: 3, 5: 14, 8: 6}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({1: 4, 3: 2, 4: 4, 7: 2, 8: 3}),\n",
+       "  ('x', 'x', '.', 'o', 'o', '.', 'x', 'o', '.'): Counter({2: 88, 5: 7, 8: 1}),\n",
+       "  ('x', 'x', 'o', '.', 'x', 'o', 'x', 'o', '.'): Counter({3: 1, 8: 23}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'o'): Counter({2: 188, 5: 1, 6: 14}),\n",
+       "  ('o', 'x', 'o', 'x', 'x', '.', '.', '.', 'o'): Counter({5: 93, 6: 1, 7: 86}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 12, 4: 39, 6: 4, 7: 3, 8: 2}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 1, 3: 1, 7: 1, 8: 1}),\n",
+       "  ('x', 'x', 'o', '.', 'x', 'x', 'o', 'o', '.'): Counter({3: 1, 8: 17}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 3, 4: 3, 6: 3, 7: 3, 8: 3}),\n",
+       "  ('x', 'x', '.', 'o', 'o', '.', 'o', '.', 'x'): Counter({2: 22, 5: 1, 7: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'o'): Counter({3: 191, 4: 263, 5: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 22, 4: 11, 5: 6, 6: 2, 7: 4}),\n",
+       "  ('x', 'x', 'o', '.', '.', 'x', 'o', 'o', '.'): Counter({3: 2, 4: 4, 8: 3}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 1, 3: 1, 7: 1, 8: 1}),\n",
+       "  ('x', 'x', '.', '.', 'o', 'x', '.', 'o', 'o'): Counter({2: 9, 3: 1, 6: 6}),\n",
+       "  ('x', 'x', 'o', 'o', '.', 'x', 'o', 'x', '.'): Counter({4: 6, 8: 2}),\n",
+       "  ('x', 'x', 'o', '.', 'x', '.', 'o', 'o', '.'): Counter({3: 1, 5: 1, 8: 104}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({2: 1, 3: 1, 5: 1, 6: 2, 8: 2}),\n",
+       "  ('x', 'x', '.', 'o', 'o', '.', 'o', 'x', '.'): Counter({2: 7, 5: 1, 8: 2}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 4, 4: 3, 5: 1, 7: 3}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({3: 4, 4: 8, 6: 7, 7: 9, 8: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({3: 6, 4: 3, 5: 4, 6: 2, 7: 2, 8: 3}),\n",
+       "  ('x', 'x', '.', 'o', 'o', 'x', 'o', 'o', 'x'): Counter({2: 12}),\n",
+       "  ('x', 'x', 'o', 'o', '.', '.', '.', 'x', 'o'): Counter({4: 6, 5: 4, 6: 3}),\n",
+       "  ('x', 'o', 'o', '.', 'x', 'x', 'x', 'o', 'o'): Counter({3: 529}),\n",
+       "  ('x', 'x', 'o', 'o', 'o', '.', 'x', 'o', 'x'): Counter({5: 3}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({1: 1, 3: 1, 4: 1, 5: 1, 6: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({1: 1, 2: 1, 3: 1, 6: 1, 7: 6, 8: 3}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 3, 4: 3, 6: 2, 8: 3}),\n",
+       "  ('x', 'o', '.', '.', 'x', 'x', 'o', '.', 'o'): Counter({2: 1, 3: 89, 7: 7}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o'): Counter({1: 1, 3: 270, 7: 279}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({2: 4, 4: 3, 6: 5, 8: 3}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({4: 4, 5: 4, 6: 1, 8: 4}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 3, 3: 4, 4: 4, 6: 3, 7: 3}),\n",
+       "  ('x', 'x', 'o', 'o', 'o', '.', '.', 'x', 'x'): Counter({5: 5, 6: 15}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({1: 1, 2: 1, 3: 1, 5: 6, 6: 1, 7: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 6, 3: 1, 6: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x'): Counter({2: 1, 3: 1, 5: 3, 7: 15}),\n",
+       "  ('o', 'x', '.', 'x', 'x', 'o', '.', 'o', '.'): Counter({2: 30, 6: 11, 8: 3}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 2, 4: 3, 6: 3, 8: 2}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.'): Counter({1: 879, 3: 1, 4: 1, 5: 4, 8: 438}),\n",
+       "  ('x', 'x', 'o', 'o', '.', 'o', 'o', 'x', 'x'): Counter({4: 5}),\n",
+       "  ('x', 'x', 'o', 'x', 'o', '.', '.', '.', 'o'): Counter({5: 3, 6: 10, 7: 1}),\n",
+       "  ('x', 'x', 'o', 'x', 'o', 'x', '.', 'o', '.'): Counter({6: 17, 8: 2}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 2, 4: 4, 6: 3, 7: 3, 8: 2}),\n",
+       "  ('x', 'x', 'o', '.', 'o', 'o', 'x', 'x', '.'): Counter({3: 12, 8: 8}),\n",
+       "  ('x', 'x', 'o', 'x', 'o', 'x', '.', 'o', 'o'): Counter({6: 15}),\n",
+       "  ('x', 'x', '.', 'o', '.', 'o', 'x', 'o', '.'): Counter({2: 38, 4: 67, 8: 3}),\n",
+       "  ('x', 'x', '.', '.', 'o', 'o', 'o', 'x', '.'): Counter({2: 11, 3: 1, 8: 3}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({3: 3, 4: 2, 6: 5, 8: 3}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({3: 2, 5: 1, 6: 1, 7: 15, 8: 1}),\n",
+       "  ('x', 'x', 'o', 'o', 'o', 'x', '.', '.', 'x'): Counter({6: 19, 7: 3}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.'): Counter({3: 1, 5: 1, 7: 1, 8: 1}),\n",
+       "  ('x', 'x', '.', 'o', 'o', '.', 'x', 'o', 'x'): Counter({2: 3, 5: 18}),\n",
+       "  ('x', 'x', 'o', 'o', '.', 'x', 'o', '.', '.'): Counter({4: 7, 7: 2, 8: 2}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x'): Counter({3: 1, 4: 3, 5: 1, 7: 2}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({2: 4, 4: 5, 6: 2, 8: 2}),\n",
+       "  ('x', '.', 'o', '.', '.', 'x', 'o', 'x', 'o'): Counter({1: 3, 3: 3, 4: 3}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 9, 4: 2, 6: 3, 7: 1}),\n",
+       "  ('x', 'x', 'o', 'o', '.', '.', 'o', 'x', 'x'): Counter({4: 7, 5: 1}),\n",
+       "  ('x', 'x', 'o', '.', '.', 'x', '.', 'o', 'o'): Counter({3: 1, 4: 3, 6: 3}),\n",
+       "  ('x', 'x', 'o', 'o', 'o', 'x', 'x', 'x', 'o'): Counter(),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 287, 3: 1, 8: 170}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 106, 7: 397, 8: 246}),\n",
+       "  ('o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({1: 1, 2: 1, 3: 18, 6: 1, 7: 1, 8: 1}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({4: 4, 5: 3, 6: 3, 7: 4, 8: 3}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.'): Counter({3: 2, 4: 5, 5: 3, 8: 2}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 2, 4: 4, 5: 2, 6: 3, 7: 4}),\n",
+       "  ('x', 'x', 'o', '.', '.', 'o', 'o', 'x', '.'): Counter({3: 2, 4: 6, 8: 3}),\n",
+       "  ('.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({0: 1, 2: 1, 5: 3, 6: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x'): Counter({2: 2, 3: 1, 4: 2, 7: 2}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.'): Counter({3: 474, 7: 1, 8: 480}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 22, 3: 1, 4: 1, 6: 1, 7: 1}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 1, 3: 216, 5: 1, 7: 1116, 8: 2}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.'): Counter({3: 376, 4: 181, 5: 313, 7: 85, 8: 341}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'o'): Counter({2: 1, 3: 2, 4: 1, 5: 1}),\n",
+       "  ('x', 'x', 'o', '.', 'o', '.', 'x', 'x', 'o'): Counter({3: 3, 5: 10}),\n",
+       "  ('x', 'x', 'o', '.', '.', 'x', 'x', 'o', 'o'): Counter({3: 3, 4: 1}),\n",
+       "  ('x', 'x', 'o', '.', 'x', '.', 'o', '.', 'o'): Counter({3: 1, 5: 1, 7: 112}),\n",
+       "  ('o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({2: 12, 3: 11, 6: 5, 8: 1}),\n",
+       "  ('x', 'x', '.', 'o', 'o', 'x', 'x', 'o', '.'): Counter({2: 3, 8: 1}),\n",
+       "  ('x', 'x', 'o', 'o', '.', '.', 'x', 'x', 'o'): Counter({4: 3, 5: 6}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({3: 239, 7: 136, 8: 146}),\n",
+       "  ('x', 'x', 'o', 'x', '.', 'o', '.', 'o', '.'): Counter({4: 1, 6: 8, 8: 8}),\n",
+       "  ('.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({0: 1, 2: 1, 3: 1, 5: 3, 6: 1, 7: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 1, 3: 1, 7: 1, 8: 1}),\n",
+       "  ('x', 'x', 'o', 'o', 'x', 'x', '.', 'o', 'o'): Counter({6: 3}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 9, 3: 3, 4: 8, 7: 6, 8: 6}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 1, 3: 1, 4: 1, 5: 1, 7: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 33, 6: 137, 8: 97}),\n",
+       "  ('x', 'x', 'o', '.', '.', 'x', 'o', 'x', 'o'): Counter({3: 1, 4: 5}),\n",
+       "  ('x', 'x', 'o', 'x', '.', 'o', 'o', 'o', 'x'): Counter({4: 23}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.'): Counter({3: 2, 4: 3, 5: 2, 8: 3}),\n",
+       "  ('x', 'x', '.', 'x', 'o', 'o', '.', 'o', '.'): Counter({2: 4, 6: 5, 8: 5}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   'x'): Counter({2: 16, 3: 14, 4: 15}),\n",
+       "  ('x', 'x', 'o', 'o', 'x', 'o', 'x', 'o', '.'): Counter({8: 304}),\n",
+       "  ('x', 'o', 'x', 'o', 'o', '.', '.', '.', 'x'): Counter({5: 20, 6: 1, 7: 1}),\n",
+       "  ('x', 'x', '.', '.', 'o', 'x', 'x', 'o', 'o'): Counter({2: 1, 3: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({3: 1, 5: 1, 6: 1, 8: 9}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x'): Counter({2: 3, 3: 6, 6: 3, 7: 1}),\n",
+       "  ('x', 'o', 'o', 'o', 'x', '.', '.', 'x', '.'): Counter({5: 4, 6: 9, 8: 128}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.'): Counter({3: 2, 4: 2, 5: 2, 8: 2}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({1: 119, 3: 142, 5: 312, 7: 117, 8: 379}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({2: 3, 3: 2, 4: 3, 6: 4, 8: 4}),\n",
+       "  ('o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 73, 3: 32, 6: 1, 7: 1, 8: 2}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({1: 1, 3: 1, 4: 1, 5: 1, 7: 6, 8: 2}),\n",
+       "  ('.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({0: 9, 2: 3, 4: 13, 5: 2, 6: 7, 7: 5, 8: 5}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.'): Counter({2: 15, 3: 1, 5: 3, 8: 4}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 2, 3: 648, 5: 11, 6: 823, 7: 1}),\n",
+       "  ('o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({1: 1, 2: 1, 3: 1, 6: 2, 8: 10}),\n",
+       "  ('o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({2: 2, 3: 3, 4: 4, 6: 2, 8: 2}),\n",
+       "  ('x', 'o', '.', '.', 'x', 'x', 'o', 'x', 'o'): Counter({2: 1, 3: 3}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 253, 5: 24, 6: 126, 7: 246, 8: 693}),\n",
+       "  ('x', '.', 'o', '.', 'x', 'x', 'o', 'x', 'o'): Counter({1: 1, 3: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 7, 5: 35, 7: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 3, 3: 3, 4: 3, 7: 2}),\n",
+       "  ('x', 'x', 'o', '.', 'o', 'x', 'x', 'o', '.'): Counter({3: 3, 8: 1}),\n",
+       "  ('x', 'x', 'o', 'o', '.', '.', 'x', '.', 'o'): Counter({4: 1, 5: 3, 7: 1}),\n",
+       "  ('x', 'x', 'o', 'o', 'o', 'x', 'x', '.', '.'): Counter({7: 3, 8: 3}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({1: 1, 3: 1, 5: 973, 6: 1, 7: 1}),\n",
+       "  ('x', 'x', '.', '.', 'x', 'o', 'x', 'o', 'o'): Counter({2: 21, 3: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x'): Counter({3: 12, 4: 84, 5: 1, 6: 93, 7: 25}),\n",
+       "  ('x', 'x', 'o', '.', 'x', 'x', '.', 'o', 'o'): Counter({3: 3, 6: 26}),\n",
+       "  ('x', 'o', 'x', '.', '.', '.', 'o', 'x', 'o'): Counter({3: 3, 4: 3, 5: 3}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o'): Counter({1: 2, 2: 1, 3: 2, 4: 3, 6: 9, 7: 1}),\n",
+       "  ('x', 'o', 'o', 'o', 'x', 'x', '.', 'x', 'o'): Counter({6: 3}),\n",
+       "  ('x', 'x', 'o', '.', 'o', 'x', 'x', 'o', 'o'): Counter({3: 59}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x'): Counter({2: 12, 5: 13, 6: 4, 7: 1}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.'): Counter({1: 298, 3: 1, 5: 1, 6: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.'): Counter({3: 405, 5: 621, 8: 640}),\n",
+       "  ('x', 'x', 'o', '.', 'o', 'o', 'x', '.', 'x'): Counter({3: 11, 7: 1}),\n",
+       "  ('x', 'x', '.', 'o', '.', 'o', 'x', '.', 'o'): Counter({2: 12, 4: 1, 7: 1}),\n",
+       "  ('o', 'x', '.', '.', 'o', 'x', 'o', 'x', '.'): Counter({2: 3, 3: 1, 8: 2}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 1, 3: 1, 5: 1, 7: 1}),\n",
+       "  ('o', 'x', 'o', 'x', '.', 'x', '.', 'o', '.'): Counter({4: 4, 6: 3, 8: 3}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({3: 2, 4: 3, 5: 4, 6: 4, 7: 2, 8: 3}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({4: 4, 5: 4, 7: 2, 8: 3}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.'): Counter({2: 3, 3: 3, 4: 5, 8: 3}),\n",
+       "  ('x', 'x', '.', 'o', 'o', 'x', 'o', '.', '.'): Counter({2: 13, 7: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 342, 5: 1, 7: 72}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({1: 70, 3: 2, 5: 1, 6: 1, 7: 1, 8: 1}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({5: 1, 6: 1, 7: 1, 8: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 1, 6: 3, 7: 1, 8: 1}),\n",
+       "  ('x', 'x', 'o', 'o', 'o', '.', '.', 'x', '.'): Counter({5: 1, 6: 1, 8: 1}),\n",
+       "  ('x', 'x', '.', '.', '.', 'o', 'o', 'x', 'o'): Counter({2: 4, 3: 3, 4: 7}),\n",
+       "  ('x', 'x', 'o', '.', 'o', 'o', '.', '.', 'x'): Counter({3: 1, 6: 1, 7: 1}),\n",
+       "  ('x', 'x', 'o', 'x', '.', '.', '.', 'o', 'o'): Counter({4: 1, 5: 3, 6: 5}),\n",
+       "  ('o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.'): Counter({2: 3, 3: 3, 4: 2, 7: 3, 8: 1}),\n",
+       "  ('x',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.'): Counter({1: 1, 3: 2, 4: 4, 6: 2, 7: 2, 8: 1}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   '.',\n",
+       "   'o'): Counter({2: 7, 3: 3, 4: 2, 7: 1}),\n",
+       "  ('x', 'o', '.', '.', 'o', 'x', 'x', '.', 'o'): Counter({2: 1, 3: 24, 7: 4}),\n",
+       "  ('x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   'x',\n",
+       "   '.'): Counter({2: 5, 3: 4, 4: 12, 6: 23, 8: 19}),\n",
+       "  ('x',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.',\n",
+       "   '.',\n",
+       "   'o',\n",
+       "   'x',\n",
+       "   'o',\n",
+       "   '.'): Counter({3: 43, 4: 1, 8: 43})})"
+      ]
+     },
+     "execution_count": 221,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "p1 = new_menace()\n",
+    "p2 = new_menace()\n",
+    "for i in range(100000):\n",
+    "    if random.choice([True, False]):\n",
+    "        g = new_game(p1, p2)\n",
+    "    else:\n",
+    "        g = new_game(p2, p1)\n",
+    "    play_game(g)\n",
+    "    update_players(g)\n",
+    "p1, p2"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 223,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "You play first.\n",
+      "The board is:\n",
+      "...\n",
+      "...\n",
+      "...\n",
+      "Your move (0, 1, 2, 3, 4, 5, 6, 7, 8)? 4\n",
+      "Opponent moved to 1\n",
+      "The board is:\n",
+      ".o.\n",
+      ".x.\n",
+      "...\n",
+      "Your move (0, 2, 3, 5, 6, 7, 8)? 0\n",
+      "Opponent moved to 5\n",
+      "The board is:\n",
+      "xo.\n",
+      ".xo\n",
+      "...\n",
+      "Your move (2, 3, 6, 7, 8)? 8\n",
+      "\n",
+      "Final position\n",
+      "xo.\n",
+      ".xo\n",
+      "..x\n",
+      "You won\n"
+     ]
+    }
+   ],
+   "source": [
+    "# p1 = new_menace()\n",
+    "ph = new_human()\n",
+    "if random.choice([True, False]):\n",
+    "    g = new_game(p1, ph)\n",
+    "else:\n",
+    "    g = new_game(ph, p1)\n",
+    "play_game(g)\n",
+    "\n",
+    "print('\\nFinal position')\n",
+    "print(show_board(g['board']))\n",
+    "if winner(g['board']) is None:\n",
+    "    print('A draw')\n",
+    "elif winning_player(g) == ph:\n",
+    "    print('You won')\n",
+    "else:\n",
+    "    print('You lost')"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# Training and testing"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 224,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Wins 9656 games out of 10000 , or  96.56 %\n",
+      "Draws 307 games out of 10000 , or  3.07 %\n"
+     ]
+    }
+   ],
+   "source": [
+    "p1 = new_menace()\n",
+    "p2 = new_menace()\n",
+    "for i in range(10**5):\n",
+    "    if random.choice([True, False]):\n",
+    "        g = new_game(p1, p2)\n",
+    "    else:\n",
+    "        g = new_game(p2, p1)\n",
+    "    play_game(g)\n",
+    "    update_players(g)\n",
+    "p1, p2\n",
+    "\n",
+    "wins = 0\n",
+    "draws = 0\n",
+    "plays = 10000\n",
+    "for _ in range(plays):\n",
+    "    g = new_game(p1, p2)\n",
+    "    play_game(g)\n",
+    "    if winner(g['board']) is None:\n",
+    "        draws += 1\n",
+    "    elif winning_player(g) == p1: \n",
+    "        wins += 1\n",
+    "print(\"Wins\", wins, \"games out of\", plays, \", or \", (100.0 * wins) / plays, \"%\")\n",
+    "print(\"Draws\", draws, \"games out of\", plays, \", or \", (100.0 * draws) / plays, \"%\")\n",
+    "\n",
+    "p_floor1 = p1"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 225,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Wins 9783 games out of 10000 , or  97.83 %\n",
+      "Draws 212 games out of 10000 , or  2.12 %\n"
+     ]
+    }
+   ],
+   "source": [
+    "p1 = new_menace()\n",
+    "p2 = new_menace()\n",
+    "for i in range(10**6):\n",
+    "    if random.choice([True, False]):\n",
+    "        g = new_game(p1, p2)\n",
+    "    else:\n",
+    "        g = new_game(p2, p1)\n",
+    "    play_game(g)\n",
+    "    update_players(g)\n",
+    "p1, p2\n",
+    "\n",
+    "wins = 0\n",
+    "draws = 0\n",
+    "plays = 10000\n",
+    "for _ in range(plays):\n",
+    "    g = new_game(p1, p2)\n",
+    "    play_game(g)\n",
+    "    if winner(g['board']) is None:\n",
+    "        draws += 1\n",
+    "    elif winning_player(g) == p1: \n",
+    "        wins += 1\n",
+    "print(\"Wins\", wins, \"games out of\", plays, \", or \", (100.0 * wins) / plays, \"%\")\n",
+    "print(\"Draws\", draws, \"games out of\", plays, \", or \", (100.0 * draws) / plays, \"%\")\n",
+    "\n",
+    "p_floor1m = p1"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 226,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Wins 9981 games out of 10000 , or  99.81 %\n",
+      "Draws 19 games out of 10000 , or  0.19 %\n"
+     ]
+    }
+   ],
+   "source": [
+    "p1 = new_menace()\n",
+    "p2 = new_menace()\n",
+    "for i in range(100000):\n",
+    "    if random.choice([True, False]):\n",
+    "        g = new_game(p1, p2)\n",
+    "    else:\n",
+    "        g = new_game(p2, p1)\n",
+    "    play_game(g)\n",
+    "    update_players(g, allow_drop_move=True)\n",
+    "p1, p2\n",
+    "\n",
+    "wins = 0\n",
+    "draws = 0\n",
+    "plays = 10000\n",
+    "for _ in range(plays):\n",
+    "    g = new_game(p1, p2)\n",
+    "    play_game(g)\n",
+    "    if winner(g['board']) is None:\n",
+    "        draws += 1\n",
+    "    elif winning_player(g) == p1: \n",
+    "        wins += 1\n",
+    "print(\"Wins\", wins, \"games out of\", plays, \", or \", (100.0 * wins) / plays, \"%\")\n",
+    "print(\"Draws\", draws, \"games out of\", plays, \", or \", (100.0 * draws) / plays, \"%\")\n",
+    "\n",
+    "p_floor0 = p1"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 227,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Wins 5627 games out of 10000 , or  56.27 %\n",
+      "Draws 1316 games out of 10000 , or  13.16 %\n"
+     ]
+    }
+   ],
+   "source": [
+    "p1 = new_menace()\n",
+    "p2 = new_menace()\n",
+    "for _ in range(100):\n",
+    "    if random.choice([True, False]):\n",
+    "        g = new_game(p1, p2)\n",
+    "    else:\n",
+    "        g = new_game(p2, p1)\n",
+    "    play_game(g)\n",
+    "    update_players(g)\n",
+    "  \n",
+    "wins = 0\n",
+    "draws = 0\n",
+    "plays = 10000\n",
+    "for _ in range(plays):\n",
+    "    g = new_game(p1, p2)\n",
+    "    play_game(g)\n",
+    "    if winner(g['board']) is None:\n",
+    "        draws += 1\n",
+    "    elif winning_player(g) == p1: \n",
+    "        wins += 1\n",
+    "\n",
+    "print(\"Wins\", wins, \"games out of\", plays, \", or \", (100.0 * wins) / plays, \"%\")\n",
+    "print(\"Draws\", draws, \"games out of\", plays, \", or \", (100.0 * draws) / plays, \"%\")\n",
+    "    \n",
+    "p_parttrained = p1"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 228,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "newbie = new_menace()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 229,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "players = [p_floor1, p_floor0, newbie, p_parttrained, p_floor1m]\n",
+    "player_names = ['Floor 1', 'Floor 0', 'Newbie', 'Part trained', 'Floor 1, million train']"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 230,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def count_wins(p1, p2, plays=1000):\n",
+    "    wins = 0\n",
+    "    draws = 0\n",
+    "    for _ in range(plays):\n",
+    "        g = new_game(p1, p2)\n",
+    "        play_game(g)\n",
+    "        if winner(g['board']) is None:\n",
+    "            draws += 1\n",
+    "        elif winning_player(g) == p1: \n",
+    "            wins += 1\n",
+    "    return wins, draws"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 231,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "{(0, 0): (983, 17),\n",
+       " (0, 1): (21, 977),\n",
+       " (0, 2): (978, 18),\n",
+       " (0, 3): (978, 20),\n",
+       " (0, 4): (973, 26),\n",
+       " (1, 0): (376, 137),\n",
+       " (1, 1): (725, 275),\n",
+       " (1, 2): (680, 115),\n",
+       " (1, 3): (654, 129),\n",
+       " (1, 4): (390, 131),\n",
+       " (2, 0): (360, 105),\n",
+       " (2, 1): (243, 161),\n",
+       " (2, 2): (880, 120),\n",
+       " (2, 3): (573, 148),\n",
+       " (2, 4): (271, 135),\n",
+       " (3, 0): (331, 110),\n",
+       " (3, 1): (232, 186),\n",
+       " (3, 2): (586, 131),\n",
+       " (3, 3): (875, 125),\n",
+       " (3, 4): (264, 122),\n",
+       " (4, 0): (924, 75),\n",
+       " (4, 1): (503, 496),\n",
+       " (4, 2): (983, 17),\n",
+       " (4, 3): (992, 8),\n",
+       " (4, 4): (903, 97)}"
+      ]
+     },
+     "execution_count": 231,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "results = {}\n",
+    "\n",
+    "for i, p1 in enumerate(players):\n",
+    "    for j, p2 in enumerate(players):\n",
+    "        results[i, j] = count_wins(p1, p2)\n",
+    "results"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 232,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<table border=1>\n",
+       "<tr><td>&nbsp;</td><td>&nbsp;</td><th colspan=5>Player 1</th></tr>\n",
+       "<tr><td>&nbsp;</td><td>&nbsp;</td><td>Floor 1</td><td>Floor 0</td><td>Newbie</td><td>Part trained</td><td>Floor 1, million train</td></tr>\n",
+       "<tr>\n",
+       "<th rowspan=5>Player 2</th>\n",
+       "<td>Floor 1</td>  <td>983 / 17</td>\n",
+       "  <td>376 / 137</td>\n",
+       "  <td>360 / 105</td>\n",
+       "  <td>331 / 110</td>\n",
+       "  <td>924 / 75</td>\n",
+       "</tr>\n",
+       "<tr>\n",
+       "<td>Floor 0</td>  <td>21 / 977</td>\n",
+       "  <td>725 / 275</td>\n",
+       "  <td>243 / 161</td>\n",
+       "  <td>232 / 186</td>\n",
+       "  <td>503 / 496</td>\n",
+       "</tr>\n",
+       "<tr>\n",
+       "<td>Newbie</td>  <td>978 / 18</td>\n",
+       "  <td>680 / 115</td>\n",
+       "  <td>880 / 120</td>\n",
+       "  <td>586 / 131</td>\n",
+       "  <td>983 / 17</td>\n",
+       "</tr>\n",
+       "<tr>\n",
+       "<td>Part trained</td>  <td>978 / 20</td>\n",
+       "  <td>654 / 129</td>\n",
+       "  <td>573 / 148</td>\n",
+       "  <td>875 / 125</td>\n",
+       "  <td>992 / 8</td>\n",
+       "</tr>\n",
+       "<tr>\n",
+       "<td>Floor 1, million train</td>  <td>973 / 26</td>\n",
+       "  <td>390 / 131</td>\n",
+       "  <td>271 / 135</td>\n",
+       "  <td>264 / 122</td>\n",
+       "  <td>903 / 97</td>\n",
+       "</tr>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "<IPython.core.display.HTML object>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "result_table = '<table border=1>\\n'\n",
+    "result_table += '<tr><td>&nbsp;</td><td>&nbsp;</td><th colspan={}>Player 1</th></tr>\\n'.format(len(players))\n",
+    "result_table += '<tr><td>&nbsp;</td><td>&nbsp;</td>'\n",
+    "for i in range(len(players)):\n",
+    "    result_table += '<td>{}</td>'.format(player_names[i])\n",
+    "result_table += '</tr>\\n'\n",
+    "\n",
+    "for i in range(len(players)):\n",
+    "    result_table += '<tr>\\n'\n",
+    "    if i == 0:\n",
+    "        result_table += '<th rowspan={}>Player 2</th>\\n'.format(len(players))\n",
+    "    result_table += '<td>{}</td>'.format(player_names[i])\n",
+    "    for j in range(len(players)):\n",
+    "        result_table += '  <td>{} / {}</td>\\n'.format(results[j, i][0], results[j, i][1])\n",
+    "    result_table += '</tr>\\n'\n",
+    "result_table += \"</table>\"\n",
+    "# print(result_table)\n",
+    "display(HTML(result_table))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 233,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "...  ...  ...  ...  ...  ...  ..o  .xo  .xo  xxo\n",
+      "...  .x.  .x.  .xx  oxx  oxx  oxx  oxx  oxx  oxx\n",
+      "...  ...  ..o  ..o  ..o  x.o  x.o  x.o  xoo  xoo\n"
+     ]
+    }
+   ],
+   "source": [
+    "g = new_game(p_floor1m, p_floor0)\n",
+    "play_game(g)\n",
+    "print(show_boards([m['board'] for m in g['history']] + [g['board']]))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 234,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "...  x..  x..  x..  x.o  x.o  xoo  xoo  xoo\n",
+      "...  ...  ...  ..x  ..x  ..x  ..x  ..x  .ox\n",
+      "...  ...  o..  o..  o..  ox.  ox.  oxx  oxx\n"
+     ]
+    }
+   ],
+   "source": [
+    "g = new_game(p_floor0, p_floor0)\n",
+    "play_game(g)\n",
+    "print(show_boards([m['board'] for m in g['history']] + [g['board']]))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 235,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "x.o\n",
+      ".ox\n",
+      ".xo Counter({3: 4, 6: 3, 1: 2}) \n",
+      "\n",
+      "oxo\n",
+      "...\n",
+      ".x. Counter({4: 5, 8: 3, 3: 3, 5: 3, 6: 3}) \n",
+      "\n",
+      "xx.\n",
+      "o.x\n",
+      "oox Counter({2: 3, 4: 3}) \n",
+      "\n",
+      "o..\n",
+      ".xx\n",
+      ".o. Counter({2: 6, 1: 4, 8: 3, 3: 3, 6: 3}) \n",
+      "\n",
+      "xo.\n",
+      ".xx\n",
+      "..o Counter({2: 3, 3: 3, 6: 3, 7: 2}) \n",
+      "\n",
+      "xo.\n",
+      "..o\n",
+      "x.. Counter({8: 3, 3: 3, 4: 3, 7: 3, 2: 2}) \n",
+      "\n",
+      "xx.\n",
+      ".ox\n",
+      "oxo Counter({2: 7, 3: 1}) \n",
+      "\n",
+      "xx.\n",
+      "o..\n",
+      "xo. Counter({8: 3, 2: 3, 4: 3, 5: 3}) \n",
+      "\n",
+      "xx.\n",
+      "...\n",
+      "oxo Counter({2: 5, 4: 4, 3: 1, 5: 1}) \n",
+      "\n",
+      "xo.\n",
+      "...\n",
+      "... Counter({8: 6, 7: 5, 3: 4, 5: 4, 2: 3, 4: 3, 6: 2}) \n",
+      "\n",
+      "xox\n",
+      "ox.\n",
+      "... Counter({5: 3, 8: 2, 6: 2, 7: 2}) \n",
+      "\n",
+      "xoo\n",
+      ".xx\n",
+      ".xo Counter({3: 3, 6: 0}) \n",
+      "\n",
+      "xx.\n",
+      "...\n",
+      "oox Counter({5: 3, 2: 2, 3: 2, 4: 2}) \n",
+      "\n",
+      "xxo\n",
+      ".ox\n",
+      "... Counter({6: 7, 8: 5, 3: 3, 7: 3}) \n",
+      "\n",
+      "xoo\n",
+      ".xo\n",
+      ".x. Counter({8: 7, 6: 4, 3: 3}) \n",
+      "\n",
+      "xx.\n",
+      "o.x\n",
+      "xoo Counter({2: 3, 4: 1}) \n",
+      "\n",
+      "xo.\n",
+      ".ox\n",
+      ".x. Counter({8: 3, 2: 3, 3: 2, 6: 2}) \n",
+      "\n",
+      "xx.\n",
+      ".ox\n",
+      "oo. Counter({2: 5, 8: 3, 3: 3}) \n",
+      "\n",
+      ".x.\n",
+      "xoo\n",
+      "... Counter({0: 3, 8: 3, 2: 3, 6: 3, 7: 1}) \n",
+      "\n",
+      "ox.\n",
+      "x..\n",
+      "... Counter({4: 4, 8: 4, 6: 3, 7: 3, 2: 2, 5: 2}) \n",
+      "\n",
+      "xx.\n",
+      "oox\n",
+      ".xo Counter({2: 3, 6: 2}) \n",
+      "\n",
+      "o.o\n",
+      ".x.\n",
+      ".x. Counter({1: 4, 3: 4, 6: 4, 8: 3, 5: 3}) \n",
+      "\n",
+      "xxo\n",
+      ".x.\n",
+      "..o Counter({5: 7, 7: 5, 6: 4, 3: 3}) \n",
+      "\n",
+      "xxo\n",
+      "x.x\n",
+      "o.o Counter({7: 8, 4: 7}) \n",
+      "\n",
+      "x.o\n",
+      "..o\n",
+      ".x. Counter({8: 4, 6: 4, 4: 3, 1: 2, 3: 2}) \n",
+      "\n",
+      "xxo\n",
+      "o..\n",
+      "o.x Counter({4: 3, 5: 3, 7: 3}) \n",
+      "\n",
+      "xx.\n",
+      ".xo\n",
+      ".oo Counter({2: 3, 6: 3, 3: 1}) \n",
+      "\n",
+      "ox.\n",
+      ".ox\n",
+      "... Counter({8: 3, 7: 3, 6: 2, 2: 1, 3: 1}) \n",
+      "\n",
+      "xo.\n",
+      ".x.\n",
+      ".o. Counter({8: 5, 2: 3, 3: 3, 5: 3, 6: 3}) \n",
+      "\n",
+      "x.o\n",
+      "..x\n",
+      ".o. Counter({3: 4, 8: 3, 1: 3, 4: 3, 6: 3}) \n",
+      "\n",
+      "xox\n",
+      "oxo\n",
+      "ox. Counter({8: 8}) \n",
+      "\n",
+      "oxo\n",
+      "x..\n",
+      ".xo Counter({4: 4, 5: 3, 6: 3}) \n",
+      "\n",
+      "o..\n",
+      "..x\n",
+      "... Counter({4: 7, 1: 0, 2: 0, 3: 0, 6: 0, 7: 0, 8: 0}) \n",
+      "\n",
+      "xxo\n",
+      "...\n",
+      "..o Counter({3: 3, 5: 3, 6: 3, 7: 3, 4: 2}) \n",
+      "\n",
+      "xx.\n",
+      "o.x\n",
+      "oo. Counter({2: 4, 8: 3, 4: 3}) \n",
+      "\n",
+      "xx.\n",
+      ".oo\n",
+      "... Counter({2: 5, 3: 5, 8: 4, 6: 4, 7: 1}) \n",
+      "\n",
+      "ox.\n",
+      ".x.\n",
+      "..o Counter({6: 6, 7: 5, 2: 4, 3: 3, 5: 3}) \n",
+      "\n",
+      "xxo\n",
+      "o.x\n",
+      "... Counter({6: 4, 8: 3, 4: 3, 7: 3}) \n",
+      "\n",
+      "oxo\n",
+      "xox\n",
+      "... Counter({8: 3, 6: 3, 7: 2}) \n",
+      "\n",
+      "xo.\n",
+      ".xo\n",
+      ".x. Counter({2: 4, 8: 3, 3: 3, 6: 3}) \n",
+      "\n",
+      "xxo\n",
+      ".x.\n",
+      "xoo Counter({5: 12, 3: 3}) \n",
+      "\n",
+      "x..\n",
+      "..o\n",
+      "... Counter({4: 7, 7: 4, 8: 4, 1: 3, 2: 3, 3: 3, 6: 3}) \n",
+      "\n",
+      "ox.\n",
+      ".x.\n",
+      "... Counter({7: 5, 2: 0, 3: 0, 5: 0, 6: 0, 8: 0}) \n",
+      "\n",
+      "xxo\n",
+      ".ox\n",
+      "..o Counter({6: 3, 3: 2, 7: 2}) \n",
+      "\n",
+      "xx.\n",
+      "ox.\n",
+      "..o Counter({6: 4, 2: 3, 5: 3, 7: 2}) \n",
+      "\n",
+      "xo.\n",
+      "oxx\n",
+      "..o Counter({2: 5, 6: 4, 7: 3}) \n",
+      "\n",
+      "xx.\n",
+      "oxx\n",
+      "oo. Counter({8: 7, 2: 2}) \n",
+      "\n",
+      "xo.\n",
+      "...\n",
+      ".xo Counter({2: 3, 3: 3, 4: 3, 5: 3, 6: 3}) \n",
+      "\n",
+      "xx.\n",
+      "oox\n",
+      "xoo Counter({2: 12}) \n",
+      "\n",
+      "xx.\n",
+      ".oo\n",
+      ".xo Counter({3: 5, 2: 3, 6: 1}) \n",
+      "\n",
+      "xo.\n",
+      "oxx\n",
+      "... Counter({8: 3, 2: 3, 6: 3, 7: 2}) \n",
+      "\n",
+      "xx.\n",
+      "o..\n",
+      "ox. Counter({8: 3, 2: 3, 4: 3, 5: 3}) \n",
+      "\n",
+      "xox\n",
+      ".x.\n",
+      "oo. Counter({8: 5, 5: 2, 3: 1}) \n",
+      "\n",
+      "xxo\n",
+      "o.x\n",
+      "xo. Counter({8: 3, 4: 3}) \n",
+      "\n",
+      "xoo\n",
+      ".xx\n",
+      "... Counter({8: 3, 3: 3, 7: 3, 6: 2}) \n",
+      "\n",
+      "xx.\n",
+      "oo.\n",
+      ".x. Counter({2: 4, 5: 4, 6: 4, 8: 3}) \n",
+      "\n",
+      "xo.\n",
+      "...\n",
+      ".ox Counter({2: 3, 3: 3, 4: 3, 5: 3, 6: 3}) \n",
+      "\n",
+      "xox\n",
+      "o..\n",
+      "o.x Counter({4: 4, 5: 3, 7: 3}) \n",
+      "\n",
+      "xx.\n",
+      ".ox\n",
+      "..o Counter({2: 3, 6: 3, 3: 2, 7: 1}) \n",
+      "\n",
+      "xx.\n",
+      "..o\n",
+      "xoo Counter({2: 5, 3: 3, 4: 3}) \n",
+      "\n",
+      "xx.\n",
+      ".o.\n",
+      ".ox Counter({3: 3, 5: 3, 6: 3, 2: 2}) \n",
+      "\n",
+      "xxo\n",
+      "o..\n",
+      "... Counter({4: 4, 8: 3, 5: 3, 6: 3, 7: 3}) \n",
+      "\n",
+      "xxo\n",
+      "x.x\n",
+      ".oo Counter({6: 5, 4: 1}) \n",
+      "\n",
+      "xoo\n",
+      "oxx\n",
+      ".x. Counter({8: 3, 6: 0}) \n",
+      "\n",
+      "xxo\n",
+      ".ox\n",
+      "x.o Counter({3: 3, 7: 1}) \n",
+      "\n",
+      "xxo\n",
+      "...\n",
+      "ox. Counter({4: 4, 8: 3, 3: 3, 5: 3}) \n",
+      "\n",
+      "x..\n",
+      ".ox\n",
+      "..o Counter({6: 5, 1: 3, 7: 3, 2: 2, 3: 2}) \n",
+      "\n",
+      "xox\n",
+      "ox.\n",
+      "..o Counter({6: 4, 5: 3, 7: 3}) \n",
+      "\n",
+      "ox.\n",
+      "xx.\n",
+      "..o Counter({2: 3, 5: 3, 6: 3, 7: 3}) \n",
+      "\n",
+      "xxo\n",
+      "ox.\n",
+      "..o Counter({5: 3, 7: 3, 6: 2}) \n",
+      "\n",
+      "xx.\n",
+      ".o.\n",
+      "oxo Counter({2: 4, 5: 3, 3: 2}) \n",
+      "\n",
+      "xxo\n",
+      "oox\n",
+      ".ox Counter({6: 3}) \n",
+      "\n",
+      ".x.\n",
+      "ox.\n",
+      ".o. Counter({8: 3, 2: 3, 5: 3, 6: 3, 0: 2}) \n",
+      "\n",
+      "...\n",
+      ".x.\n",
+      "... Counter({8: 15, 0: 0, 1: 0, 2: 0, 3: 0, 5: 0, 6: 0, 7: 0}) \n",
+      "\n",
+      "xxo\n",
+      ".xx\n",
+      "o.o Counter({7: 8, 3: 0}) \n",
+      "\n",
+      "xoo\n",
+      "oxx\n",
+      "... Counter({7: 5, 8: 4, 6: 3}) \n",
+      "\n",
+      ".x.\n",
+      "...\n",
+      ".o. Counter({3: 6, 6: 6, 0: 3, 2: 3, 5: 3, 8: 2, 4: 1}) \n",
+      "\n",
+      "xx.\n",
+      "o..\n",
+      "xoo Counter({2: 3, 4: 3, 5: 3}) \n",
+      "\n",
+      "xxo\n",
+      "o.x\n",
+      "xoo Counter({4: 3}) \n",
+      "\n",
+      "xo.\n",
+      "...\n",
+      "xo. Counter({8: 3, 2: 3, 3: 3, 4: 3, 5: 3}) \n",
+      "\n",
+      ".x.\n",
+      "ox.\n",
+      "... Counter({0: 3, 2: 3, 8: 3, 5: 2, 6: 2, 7: 2}) \n",
+      "\n",
+      "ox.\n",
+      "o..\n",
+      ".x. Counter({4: 4, 5: 3, 6: 3, 2: 2, 8: 1}) \n",
+      "\n",
+      "xxo\n",
+      "oxo\n",
+      "... Counter({8: 5, 6: 3, 7: 3}) \n",
+      "\n",
+      "xxo\n",
+      ".xo\n",
+      ".o. Counter({3: 4, 8: 3, 6: 3}) \n",
+      "\n",
+      "xxo\n",
+      "..x\n",
+      "o.. Counter({4: 7, 8: 4, 7: 3, 3: 2}) \n",
+      "\n",
+      "xxo\n",
+      ".oo\n",
+      ".xx Counter({3: 5, 6: 3}) \n",
+      "\n",
+      "xx.\n",
+      "oxo\n",
+      "... Counter({8: 3, 2: 3, 6: 3, 7: 3}) \n",
+      "\n",
+      "xxo\n",
+      "xxo\n",
+      "oo. Counter({8: 9}) \n",
+      "\n",
+      "xx.\n",
+      "xoo\n",
+      "..o Counter({6: 5, 2: 3, 7: 2}) \n",
+      "\n",
+      "xox\n",
+      "o..\n",
+      ".ox Counter({4: 3, 5: 3, 6: 3}) \n",
+      "\n",
+      "xoo\n",
+      ".x.\n",
+      "... Counter({8: 6, 5: 4, 7: 4, 3: 3, 6: 3}) \n",
+      "\n",
+      "xx.\n",
+      "o..\n",
+      "... Counter({4: 4, 5: 3, 7: 3, 8: 3, 2: 2, 6: 2}) \n",
+      "\n",
+      "x..\n",
+      "..x\n",
+      ".o. Counter({6: 5, 2: 4, 3: 3, 4: 3, 8: 3, 1: 2}) \n",
+      "\n",
+      "xxo\n",
+      ".x.\n",
+      ".oo Counter({3: 1, 5: 0, 6: 0}) \n",
+      "\n",
+      "xo.\n",
+      "..x\n",
+      ".o. Counter({8: 3, 4: 3, 6: 3, 3: 2, 2: 1}) \n",
+      "\n",
+      "xo.\n",
+      "o.x\n",
+      ".xo Counter({2: 3, 4: 3, 6: 3}) \n",
+      "\n",
+      "xxo\n",
+      "oox\n",
+      "xox Counter() \n",
+      "\n",
+      "xxo\n",
+      ".o.\n",
+      "x.. Counter({3: 3, 5: 3, 7: 1, 8: 0}) \n",
+      "\n",
+      "xx.\n",
+      ".o.\n",
+      "xo. Counter({3: 3, 5: 3, 2: 2, 8: 0}) \n",
+      "\n",
+      "xxo\n",
+      "ox.\n",
+      "xoo Counter({5: 3}) \n",
+      "\n",
+      "xo.\n",
+      "..o\n",
+      "..x Counter({2: 3, 3: 3, 4: 3, 6: 3, 7: 3}) \n",
+      "\n",
+      "xxo\n",
+      "..o\n",
+      "xox Counter({3: 1, 4: 0}) \n",
+      "\n",
+      "x.o\n",
+      "...\n",
+      "..x Counter({7: 1, 1: 0, 3: 0, 4: 0, 5: 0, 6: 0}) \n",
+      "\n",
+      "x.o\n",
+      ".o.\n",
+      "..x Counter({1: 3, 3: 3, 5: 3, 6: 3, 7: 3}) \n",
+      "\n",
+      "x.x\n",
+      ".o.\n",
+      "o.. Counter({7: 6, 3: 5, 8: 4, 1: 4, 5: 3}) \n",
+      "\n",
+      "xx.\n",
+      ".x.\n",
+      "o.o Counter({7: 12, 5: 4, 2: 2, 3: 2}) \n",
+      "\n",
+      "xox\n",
+      ".x.\n",
+      "o.o Counter({3: 3, 5: 3, 7: 3}) \n",
+      "\n",
+      "x.o\n",
+      "..x\n",
+      ".xo Counter({3: 2, 4: 2, 6: 2, 1: 1}) \n",
+      "\n",
+      "x.o\n",
+      ".x.\n",
+      ".o. Counter({5: 6, 3: 5, 6: 4, 8: 3, 1: 2}) \n",
+      "\n",
+      "xoo\n",
+      "oxx\n",
+      "ox. Counter({8: 8}) \n",
+      "\n",
+      "xxo\n",
+      ".o.\n",
+      "xo. Counter({5: 4, 8: 3, 3: 3}) \n",
+      "\n",
+      "xxo\n",
+      "oxx\n",
+      "..o Counter({7: 3, 6: 0}) \n",
+      "\n",
+      "xxo\n",
+      "...\n",
+      "xoo Counter({3: 3, 4: 3, 5: 3}) \n",
+      "\n",
+      "x.x\n",
+      ".o.\n",
+      "ox. Counter({1: 2, 5: 1, 8: 0, 3: 0}) \n",
+      "\n",
+      "ox.\n",
+      "xox\n",
+      ".o. Counter({8: 3, 2: 3, 6: 3}) \n",
+      "\n",
+      "x..\n",
+      ".ox\n",
+      ".o. Counter({1: 3, 6: 3, 8: 2, 3: 2, 2: 1}) \n",
+      "\n",
+      "xxo\n",
+      "oxx\n",
+      "oo. Counter({8: 12}) \n",
+      "\n",
+      "xo.\n",
+      "...\n",
+      ".x. Counter({2: 4, 4: 3, 5: 3, 8: 3, 3: 2, 6: 2}) \n",
+      "\n",
+      "xxo\n",
+      ".o.\n",
+      ".xo Counter({5: 3, 6: 2, 3: 1}) \n",
+      "\n",
+      "xxo\n",
+      "...\n",
+      ".xo Counter({5: 7, 4: 5, 3: 2, 6: 2}) \n",
+      "\n",
+      "xxo\n",
+      "oxx\n",
+      ".o. Counter({8: 3, 6: 0}) \n",
+      "\n",
+      "xox\n",
+      ".x.\n",
+      ".o. Counter({8: 3, 3: 3, 5: 3, 6: 3}) \n",
+      "\n",
+      "xx.\n",
+      ".oo\n",
+      "x.o Counter({3: 6, 2: 5, 7: 1}) \n",
+      "\n",
+      "xxo\n",
+      "oo.\n",
+      "xx. Counter({5: 6, 8: 3}) \n",
+      "\n",
+      "xxo\n",
+      "oox\n",
+      "xo. Counter({8: 3}) \n",
+      "\n",
+      "o..\n",
+      ".x.\n",
+      "... Counter({1: 39, 2: 18, 8: 10, 7: 6, 5: 4, 6: 2, 3: 0}) \n",
+      "\n",
+      "x..\n",
+      "..x\n",
+      ".oo Counter({2: 4, 3: 3, 4: 3, 6: 3, 1: 2}) \n",
+      "\n",
+      "xx.\n",
+      ".o.\n",
+      "... Counter({2: 7, 3: 2, 5: 1, 6: 1, 8: 1, 7: 0}) \n",
+      "\n",
+      "xo.\n",
+      "...\n",
+      "x.o Counter({2: 3, 3: 3, 4: 3, 5: 3, 7: 3}) \n",
+      "\n",
+      "xxo\n",
+      "oox\n",
+      ".x. Counter({6: 4, 8: 3}) \n",
+      "\n",
+      "xox\n",
+      "oo.\n",
+      ".x. Counter({5: 4, 8: 0, 6: 0}) \n",
+      "\n",
+      "xoo\n",
+      ".xx\n",
+      "..o Counter({3: 6, 6: 4, 7: 3}) \n",
+      "\n",
+      "x..\n",
+      ".ox\n",
+      ".xo Counter({2: 4, 1: 3, 3: 3, 6: 3}) \n",
+      "\n",
+      ".x.\n",
+      "o..\n",
+      ".x. Counter({0: 3, 2: 3, 4: 3, 6: 3, 8: 3, 5: 2}) \n",
+      "\n",
+      "xoo\n",
+      "o.x\n",
+      ".x. Counter({4: 4, 8: 3, 6: 3}) \n",
+      "\n",
+      "xxo\n",
+      "x..\n",
+      ".o. Counter({6: 4, 8: 3, 4: 3, 5: 3}) \n",
+      "\n",
+      "xx.\n",
+      "oox\n",
+      "oxo Counter({2: 10}) \n",
+      "\n",
+      "xo.\n",
+      ".x.\n",
+      "x.o Counter({2: 3, 3: 3, 7: 3, 5: 2}) \n",
+      "\n",
+      "x..\n",
+      "...\n",
+      "..o Counter({2: 4, 3: 4, 5: 4, 6: 4, 7: 4, 1: 2, 4: 2}) \n",
+      "\n",
+      "xxo\n",
+      "oo.\n",
+      "x.. Counter({5: 3, 7: 3, 8: 2}) \n",
+      "\n",
+      "xxo\n",
+      "x.o\n",
+      "o.. Counter({8: 4, 4: 3, 7: 3}) \n",
+      "\n",
+      "xx.\n",
+      "o.x\n",
+      ".oo Counter({2: 3, 4: 3, 6: 3}) \n",
+      "\n",
+      "xo.\n",
+      ".oo\n",
+      "x.x Counter({3: 4, 7: 4, 2: 2}) \n",
+      "\n",
+      "xxo\n",
+      ".x.\n",
+      "o.. Counter({8: 3, 5: 3, 7: 2, 3: 1}) \n",
+      "\n",
+      "xox\n",
+      "o..\n",
+      ".x. Counter({8: 3, 4: 3, 5: 3, 6: 3}) \n",
+      "\n",
+      "xxo\n",
+      "...\n",
+      "oox Counter({3: 3, 4: 3, 5: 3}) \n",
+      "\n",
+      "oxo\n",
+      "xx.\n",
+      "o.. Counter({7: 6, 8: 4, 5: 3}) \n",
+      "\n",
+      "xo.\n",
+      ".x.\n",
+      "o.. Counter({5: 6, 8: 4, 2: 3, 3: 3, 7: 3}) \n",
+      "\n",
+      "xoo\n",
+      "..o\n",
+      "x.x Counter({3: 3, 4: 3, 7: 3}) \n",
+      "\n",
+      "x.x\n",
+      ".o.\n",
+      "x.o Counter({5: 3, 1: 2, 3: 2, 7: 2}) \n",
+      "\n",
+      "xo.\n",
+      ".xo\n",
+      "xo. Counter({8: 3, 2: 3, 3: 3}) \n",
+      "\n",
+      "xxo\n",
+      "oox\n",
+      "x.o Counter({7: 3}) \n",
+      "\n",
+      "xxo\n",
+      "o..\n",
+      "x.. Counter({8: 4, 5: 4, 4: 3, 7: 2}) \n",
+      "\n",
+      "xxo\n",
+      "..o\n",
+      "o.x Counter({3: 3, 4: 3, 7: 2}) \n",
+      "\n",
+      "xx.\n",
+      "oxo\n",
+      ".o. Counter({8: 3, 2: 3, 6: 3}) \n",
+      "\n",
+      "xx.\n",
+      "ox.\n",
+      ".o. Counter({6: 4, 8: 3, 2: 3, 5: 2}) \n",
+      "\n",
+      "oxo\n",
+      "x.x\n",
+      "o.. Counter({8: 4, 4: 3, 7: 3}) \n",
+      "\n",
+      "xx.\n",
+      "o.o\n",
+      "..x Counter({2: 3, 4: 3, 7: 3, 6: 2}) \n",
+      "\n",
+      "xxo\n",
+      "x.o\n",
+      ".ox Counter({4: 2, 6: 2}) \n",
+      "\n",
+      "xo.\n",
+      "..x\n",
+      "oxo Counter({2: 3, 3: 3, 4: 3}) \n",
+      "\n",
+      "xxo\n",
+      "o.o\n",
+      ".xx Counter({4: 5, 6: 2}) \n",
+      "\n",
+      "xo.\n",
+      ".o.\n",
+      "x.. Counter({3: 9, 5: 4, 7: 4, 8: 2, 2: 2}) \n",
+      "\n",
+      "xxo\n",
+      "ox.\n",
+      "... Counter({5: 4, 6: 3, 7: 3, 8: 2}) \n",
+      "\n",
+      "xxo\n",
+      "o.o\n",
+      "x.x Counter({4: 4, 7: 2}) \n",
+      "\n",
+      "x.x\n",
+      "...\n",
+      "oxo Counter({1: 3, 3: 0, 4: 0, 5: 0}) \n",
+      "\n",
+      "xx.\n",
+      "oox\n",
+      "x.o Counter({2: 3, 7: 0}) \n",
+      "\n",
+      "xoo\n",
+      ".ox\n",
+      "x.. Counter({7: 7, 3: 4, 8: 3}) \n",
+      "\n",
+      "xxo\n",
+      "o.x\n",
+      ".xo Counter({4: 3, 6: 1}) \n",
+      "\n",
+      "xxo\n",
+      "..x\n",
+      "o.o Counter({4: 3, 7: 3, 3: 2}) \n",
+      "\n",
+      "ox.\n",
+      "...\n",
+      ".xo Counter({3: 3, 4: 3, 5: 3, 6: 3, 2: 2}) \n",
+      "\n",
+      "xxo\n",
+      "o.x\n",
+      "x.o Counter({4: 3, 7: 3}) \n",
+      "\n",
+      "xxo\n",
+      "oox\n",
+      ".xo Counter({6: 3}) \n",
+      "\n",
+      "xx.\n",
+      ".xo\n",
+      ".o. Counter({8: 3, 2: 3, 6: 3, 3: 2}) \n",
+      "\n",
+      "xxo\n",
+      "o.o\n",
+      "xox Counter({4: 5}) \n",
+      "\n",
+      "xx.\n",
+      ".o.\n",
+      ".o. Counter({2: 5, 3: 5, 5: 4, 8: 3, 6: 2}) \n",
+      "\n",
+      "xx.\n",
+      "oo.\n",
+      ".xo Counter({5: 4, 2: 3, 6: 3}) \n",
+      "\n",
+      "xx.\n",
+      "oxo\n",
+      "xo. Counter({2: 3, 8: 2}) \n",
+      "\n",
+      "ox.\n",
+      "ox.\n",
+      "... Counter({7: 6, 8: 4, 6: 4, 2: 3, 5: 2}) \n",
+      "\n",
+      "xxo\n",
+      "o.x\n",
+      "o.x Counter({4: 7, 7: 0}) \n",
+      "\n",
+      "xx.\n",
+      "oxx\n",
+      "o.o Counter({7: 12, 2: 1}) \n",
+      "\n",
+      "xx.\n",
+      "oo.\n",
+      "... Counter({2: 48625, 5: 1, 8: 0, 6: 0, 7: 0}) \n",
+      "\n",
+      "x.o\n",
+      ".o.\n",
+      ".x. Counter({6: 6, 3: 3, 8: 2, 5: 2, 1: 1}) \n",
+      "\n",
+      "xx.\n",
+      ".oo\n",
+      "o.x Counter({2: 3, 3: 3, 7: 3}) \n",
+      "\n",
+      "ox.\n",
+      "xo.\n",
+      "... Counter({8: 3, 2: 3, 5: 3, 7: 3, 6: 2}) \n",
+      "\n",
+      ".x.\n",
+      "x.o\n",
+      "... Counter({6: 4, 0: 3, 7: 3, 8: 3, 4: 2, 2: 1}) \n",
+      "\n",
+      "xxo\n",
+      "...\n",
+      "o.x Counter({4: 7, 5: 3, 7: 3, 3: 2}) \n",
+      "\n",
+      ".x.\n",
+      "...\n",
+      "... Counter({6: 14, 0: 0, 2: 0, 3: 0, 4: 0, 5: 0, 7: 0, 8: 0}) \n",
+      "\n",
+      "ox.\n",
+      ".xx\n",
+      "o.o Counter({3: 3, 7: 3, 2: 2}) \n",
+      "\n",
+      "x.o\n",
+      ".xx\n",
+      "o.. Counter({3: 2, 8: 1, 7: 1, 1: 0}) \n",
+      "\n",
+      "xxo\n",
+      "xoo\n",
+      "... Counter({8: 5, 6: 5, 7: 3}) \n",
+      "\n",
+      "xox\n",
+      "...\n",
+      ".o. Counter({8: 3, 3: 3, 4: 3, 5: 3, 6: 3}) \n",
+      "\n",
+      "xo.\n",
+      ".xo\n",
+      ".xo Counter({2: 4, 6: 2, 3: 1}) \n",
+      "\n",
+      "xx.\n",
+      "xoo\n",
+      ".ox Counter({6: 3, 2: 0}) \n",
+      "\n",
+      "xx.\n",
+      "o.o\n",
+      "xox Counter({2: 3, 4: 3}) \n",
+      "\n",
+      ".x.\n",
+      "xox\n",
+      ".o. Counter({0: 3, 8: 3, 2: 3, 6: 3}) \n",
+      "\n",
+      "x..\n",
+      ".o.\n",
+      "... Counter({1: 46163, 3: 2460, 2: 8, 5: 0, 6: 0, 7: 0, 8: 0}) \n",
+      "\n",
+      "x.o\n",
+      ".ox\n",
+      ".x. Counter({6: 7, 8: 3, 1: 3, 3: 3}) \n",
+      "\n",
+      "xxo\n",
+      "o.x\n",
+      "oxo Counter({4: 4}) \n",
+      "\n",
+      "xxo\n",
+      "..x\n",
+      "..o Counter({6: 6, 4: 4, 3: 3, 7: 3}) \n",
+      "\n",
+      "xoo\n",
+      ".xx\n",
+      ".o. Counter({8: 4, 6: 4, 3: 3}) \n",
+      "\n",
+      "xox\n",
+      "...\n",
+      "o.. Counter({8: 4, 4: 4, 5: 3, 7: 3, 3: 2}) \n",
+      "\n",
+      "xx.\n",
+      "oxo\n",
+      "xoo Counter({2: 11}) \n",
+      "\n",
+      "xo.\n",
+      ".ox\n",
+      "... Counter({6: 4, 7: 4, 2: 3, 3: 3, 8: 2}) \n",
+      "\n",
+      "oxo\n",
+      "xo.\n",
+      ".x. Counter({8: 3, 5: 3, 6: 2}) \n",
+      "\n",
+      "xxo\n",
+      "...\n",
+      "x.o Counter({5: 7, 3: 6, 7: 4, 4: 3}) \n",
+      "\n",
+      "xx.\n",
+      ".x.\n",
+      "oo. Counter({8: 12, 5: 3, 2: 2, 3: 0}) \n",
+      "\n",
+      "ox.\n",
+      "x.x\n",
+      ".oo Counter({2: 3, 4: 3, 6: 2}) \n",
+      "\n",
+      "ox.\n",
+      "oox\n",
+      ".x. Counter({6: 3, 8: 2, 2: 1}) \n",
+      "\n",
+      "xoo\n",
+      "..x\n",
+      "x.. Counter({8: 3, 3: 3, 4: 3, 7: 3}) \n",
+      "\n",
+      "xx.\n",
+      "..x\n",
+      ".oo Counter({2: 3, 6: 3, 3: 2, 4: 2}) \n",
+      "\n",
+      "xxo\n",
+      ".o.\n",
+      ".x. Counter({3: 5, 6: 5, 8: 4, 5: 4}) \n",
+      "\n",
+      "xoo\n",
+      ".ox\n",
+      ".x. Counter({6: 7, 8: 3, 3: 2}) \n",
+      "\n",
+      ".x.\n",
+      "xxo\n",
+      ".o. Counter({0: 3, 8: 3, 2: 3, 6: 3}) \n",
+      "\n",
+      "xx.\n",
+      ".xo\n",
+      "o.o Counter({7: 7, 2: 6, 3: 0}) \n",
+      "\n",
+      "xxo\n",
+      "o.x\n",
+      "oox Counter({4: 4}) \n",
+      "\n",
+      "xx.\n",
+      "oxo\n",
+      "..o Counter({6: 5, 2: 4, 7: 4}) \n",
+      "\n",
+      "xxo\n",
+      "xxo\n",
+      ".o. Counter({8: 7, 6: 2}) \n",
+      "\n",
+      "xxo\n",
+      "...\n",
+      ".ox Counter({4: 8, 6: 1, 3: 0, 5: 0}) \n",
+      "\n",
+      "xoo\n",
+      "..x\n",
+      "ox. Counter({8: 3, 3: 3, 4: 3}) \n",
+      "\n",
+      "x.o\n",
+      "...\n",
+      "... Counter({3: 6, 6: 5, 7: 4, 1: 3, 4: 3, 5: 3, 8: 3}) \n",
+      "\n",
+      "x.o\n",
+      ".xo\n",
+      "... Counter({7: 5, 6: 4, 8: 3, 1: 3, 3: 3}) \n",
+      "\n",
+      "xox\n",
+      "oxo\n",
+      ".x. Counter({6: 3, 8: 1}) \n",
+      "\n",
+      ".x.\n",
+      "x.o\n",
+      ".o. Counter({0: 3, 8: 3, 2: 3, 4: 3, 6: 3}) \n",
+      "\n",
+      "xx.\n",
+      "xxo\n",
+      ".oo Counter({2: 3, 6: 3}) \n",
+      "\n",
+      "xxo\n",
+      ".oo\n",
+      "x.. Counter({3: 8, 8: 3, 7: 1}) \n",
+      "\n",
+      "xx.\n",
+      "..x\n",
+      "o.o Counter({2: 6, 7: 6, 4: 4, 3: 3}) \n",
+      "\n",
+      "oxo\n",
+      "xox\n",
+      ".x. Counter({6: 4, 8: 3}) \n",
+      "\n",
+      "xoo\n",
+      ".xx\n",
+      "x.o Counter({3: 3, 7: 2}) \n",
+      "\n",
+      "x.o\n",
+      ".xo\n",
+      ".x. Counter({8: 4, 1: 3, 3: 3, 6: 2}) \n",
+      "\n",
+      "oxo\n",
+      "xxo\n",
+      "... Counter({7: 6, 8: 4, 6: 2}) \n",
+      "\n",
+      "x.o\n",
+      ".xx\n",
+      "oo. Counter({3: 5, 8: 3, 1: 3}) \n",
+      "\n",
+      "xo.\n",
+      ".ox\n",
+      "x.. Counter({7: 5, 3: 3, 8: 2, 2: 0}) \n",
+      "\n",
+      "xo.\n",
+      ".ox\n",
+      "ox. Counter({8: 3, 2: 3, 3: 2}) \n",
+      "\n",
+      "xx.\n",
+      "oo.\n",
+      "x.o Counter({2: 5, 5: 3, 7: 3}) \n",
+      "\n",
+      "xx.\n",
+      "o.o\n",
+      "ox. Counter({4: 4, 2: 3, 8: 2}) \n",
+      "\n",
+      "xox\n",
+      "ox.\n",
+      ".o. Counter({8: 3, 5: 3, 6: 3}) \n",
+      "\n",
+      "xo.\n",
+      ".x.\n",
+      "xo. Counter({2: 3, 5: 3, 3: 2, 8: 1}) \n",
+      "\n",
+      "xx.\n",
+      "..o\n",
+      "... Counter({4: 3, 8: 3, 2: 2, 3: 2, 7: 2, 6: 1}) \n",
+      "\n",
+      "x..\n",
+      "...\n",
+      "... Counter({6: 1, 1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 7: 0, 8: 0}) \n",
+      "\n",
+      "ox.\n",
+      "oxx\n",
+      ".o. Counter({6: 3, 8: 0, 2: 0}) \n",
+      "\n",
+      "xo.\n",
+      ".x.\n",
+      "oxo Counter({3: 6, 2: 3, 5: 3}) \n",
+      "\n",
+      "x.o\n",
+      ".xx\n",
+      "..o Counter({3: 2, 1: 0, 6: 0, 7: 0}) \n",
+      "\n",
+      "xox\n",
+      "o..\n",
+      "x.. Counter({8: 3, 4: 3, 5: 3, 7: 3}) \n",
+      "\n",
+      "xxo\n",
+      "x..\n",
+      "o.o Counter({5: 3, 4: 1, 7: 1}) \n",
+      "\n",
+      "xxo\n",
+      "..o\n",
+      ".ox Counter({3: 4, 4: 3, 6: 3}) \n",
+      "\n",
+      "xox\n",
+      "o.o\n",
+      "x.. Counter({8: 3, 4: 3, 7: 3}) \n",
+      "\n",
+      "xoo\n",
+      "..x\n",
+      "xo. Counter({8: 3, 3: 3, 4: 3}) \n",
+      "\n",
+      "xxo\n",
+      "o.o\n",
+      "x.. Counter({8: 3, 4: 3, 7: 2}) \n",
+      "\n",
+      "xxo\n",
+      "o.o\n",
+      "..x Counter({6: 4, 4: 3, 7: 3}) \n",
+      "\n",
+      "xx.\n",
+      "xo.\n",
+      "..o Counter({2: 3, 5: 3, 6: 2, 7: 2}) \n",
+      "\n",
+      "xxo\n",
+      "oxx\n",
+      "o.o Counter({7: 12}) \n",
+      "\n",
+      "xx.\n",
+      "..x\n",
+      "oo. Counter({8: 4, 2: 3, 3: 3, 4: 3}) \n",
+      "\n",
+      "xo.\n",
+      "o..\n",
+      "..x Counter({4: 4, 5: 4, 2: 3, 6: 3, 7: 3}) \n",
+      "\n",
+      "ox.\n",
+      "..o\n",
+      ".x. Counter({8: 4, 2: 3, 3: 3, 4: 3, 6: 3}) \n",
+      "\n",
+      ".x.\n",
+      "oxo\n",
+      "... Counter({0: 4, 8: 4, 2: 3, 6: 3, 7: 3}) \n",
+      "\n",
+      "xo.\n",
+      "..x\n",
+      ".xo Counter({2: 3, 3: 3, 4: 3, 6: 3}) \n",
+      "\n",
+      "xxo\n",
+      "oo.\n",
+      "..x Counter({5: 3, 7: 3, 6: 1}) \n",
+      "\n",
+      "xxo\n",
+      "oo.\n",
+      "xxo Counter({5: 3}) \n",
+      "\n",
+      ".x.\n",
+      ".o.\n",
+      ".x. Counter({3: 4, 6: 4, 8: 4, 0: 3, 2: 3, 5: 3}) \n",
+      "\n",
+      "xxo\n",
+      "oxx\n",
+      "xoo Counter() \n",
+      "\n",
+      "xxo\n",
+      ".ox\n",
+      ".xo Counter({6: 6, 3: 3}) \n",
+      "\n",
+      "xxo\n",
+      ".oo\n",
+      "xox Counter({3: 9}) \n",
+      "\n",
+      "xoo\n",
+      ".xx\n",
+      "ox. Counter({3: 1, 8: 0}) \n",
+      "\n",
+      "xx.\n",
+      ".ox\n",
+      "o.o Counter({2: 4, 3: 3, 7: 3}) \n",
+      "\n",
+      "xxo\n",
+      "ox.\n",
+      "x.o Counter({5: 10, 7: 3}) \n",
+      "\n",
+      "ox.\n",
+      "xxo\n",
+      "... Counter({7: 2, 8: 0, 2: 0, 6: 0}) \n",
+      "\n",
+      "xx.\n",
+      "...\n",
+      "o.. Counter({2: 9, 8: 5, 5: 2, 7: 2, 4: 1, 3: 0}) \n",
+      "\n",
+      "x.x\n",
+      ".o.\n",
+      "oxo Counter({5: 5, 1: 3, 3: 3}) \n",
+      "\n",
+      "x.x\n",
+      "...\n",
+      "o.o Counter({1: 3, 3: 3, 4: 3, 5: 3, 7: 3}) \n",
+      "\n",
+      "xxo\n",
+      "o..\n",
+      "..x Counter({4: 6, 6: 4, 5: 2, 7: 2}) \n",
+      "\n",
+      "xox\n",
+      "o..\n",
+      "... Counter({8: 3, 4: 3, 5: 3, 6: 3, 7: 3}) \n",
+      "\n",
+      "xoo\n",
+      "..x\n",
+      ".xo Counter({4: 4, 3: 3, 6: 3}) \n",
+      "\n",
+      "xx.\n",
+      "o.o\n",
+      "x.. Counter({2: 4, 8: 3, 4: 3, 7: 2}) \n",
+      "\n",
+      "xox\n",
+      ".x.\n",
+      "o.. Counter({8: 3, 7: 3, 3: 2, 5: 2}) \n",
+      "\n",
+      "xx.\n",
+      "..o\n",
+      ".ox Counter({2: 3, 3: 3, 4: 3, 6: 3}) \n",
+      "\n",
+      "xxo\n",
+      "ox.\n",
+      "o.. Counter({8: 4, 5: 3, 7: 3}) \n",
+      "\n",
+      "xx.\n",
+      "o..\n",
+      "o.. Counter({2: 4, 8: 3, 4: 3, 5: 3, 7: 3}) \n",
+      "\n",
+      "xoo\n",
+      "...\n",
+      ".x. Counter({3: 5, 8: 3, 5: 3, 6: 3, 4: 2}) \n",
+      "\n",
+      ".o.\n",
+      ".x.\n",
+      "... Counter({2: 7, 7: 6, 0: 4, 3: 4, 5: 4, 6: 4, 8: 4}) \n",
+      "\n",
+      "xxo\n",
+      "o.x\n",
+      ".ox Counter({4: 3, 6: 2}) \n",
+      "\n",
+      "x.o\n",
+      ".xx\n",
+      ".o. Counter({8: 3, 6: 3, 1: 2, 3: 2}) \n",
+      "\n",
+      "xox\n",
+      "ox.\n",
+      ".xo Counter({6: 3, 5: 0}) \n",
+      "\n",
+      "xo.\n",
+      "...\n",
+      "ox. Counter({2: 3, 3: 3, 4: 3, 5: 3, 8: 2}) \n",
+      "\n",
+      "xox\n",
+      "o..\n",
+      "ox. Counter({8: 3, 4: 3, 5: 3}) \n",
+      "\n",
+      "oxo\n",
+      "x.o\n",
+      ".x. Counter({8: 4, 4: 4, 6: 3}) \n",
+      "\n",
+      "xo.\n",
+      ".xo\n",
+      "ox. Counter({8: 5, 3: 4, 2: 3}) \n",
+      "\n",
+      "xx.\n",
+      ".ox\n",
+      "o.. Counter({2: 9, 8: 2, 7: 1, 3: 0}) \n",
+      "\n",
+      "xx.\n",
+      "..o\n",
+      ".o. Counter({6: 4, 8: 3, 2: 3, 3: 3, 4: 3}) \n",
+      "\n",
+      "xx.\n",
+      "oox\n",
+      "ox. Counter({2: 8, 8: 3}) \n",
+      "\n",
+      "x.o\n",
+      ".x.\n",
+      ".xo Counter({5: 6, 1: 4, 6: 3, 3: 2}) \n",
+      "\n",
+      "xox\n",
+      "o..\n",
+      "x.o Counter({4: 4, 5: 3, 7: 3}) \n",
+      "\n",
+      "ox.\n",
+      ".xx\n",
+      "..o Counter({3: 3, 6: 3, 7: 3, 2: 0}) \n",
+      "\n",
+      "xo.\n",
+      "..x\n",
+      "xo. Counter({8: 3, 2: 3, 3: 3, 4: 3}) \n",
+      "\n",
+      "xxo\n",
+      "o.o\n",
+      ".x. Counter({8: 3, 4: 3, 6: 3}) \n",
+      "\n",
+      "xxo\n",
+      "o..\n",
+      "xo. Counter({8: 3, 4: 3, 5: 3}) \n",
+      "\n",
+      "xxo\n",
+      ".o.\n",
+      "x.o Counter({5: 4, 3: 3, 7: 3}) \n",
+      "\n",
+      "xxo\n",
+      "x..\n",
+      "..o Counter({6: 5, 7: 4, 4: 3, 5: 3}) \n",
+      "\n",
+      "xxo\n",
+      "...\n",
+      ".o. Counter({8: 3, 3: 3, 4: 3, 5: 3, 6: 3}) \n",
+      "\n",
+      "xxo\n",
+      "xox\n",
+      "..o Counter({6: 7, 7: 2}) \n",
+      "\n",
+      "ox.\n",
+      "oxx\n",
+      "... Counter({6: 10, 7: 3, 2: 2, 8: 0}) \n",
+      "\n",
+      "xx.\n",
+      "o..\n",
+      "oox Counter({5: 6, 2: 3, 4: 3}) \n",
+      "\n",
+      "xx.\n",
+      "o.o\n",
+      "o.x Counter({2: 4, 4: 3, 7: 3}) \n",
+      "\n",
+      "xx.\n",
+      ".x.\n",
+      ".oo Counter({6: 6, 2: 5, 5: 4, 3: 2}) \n",
+      "\n",
+      "xoo\n",
+      ".o.\n",
+      "x.x Counter({7: 4, 3: 3, 5: 1}) \n",
+      "\n",
+      "xox\n",
+      ".x.\n",
+      "oxo Counter({3: 3, 5: 3}) \n",
+      "\n",
+      "xox\n",
+      ".o.\n",
+      ".x. Counter({8: 3, 3: 3, 5: 3, 6: 3}) \n",
+      "\n",
+      "xoo\n",
+      ".xx\n",
+      "xo. Counter({8: 2, 3: 2}) \n",
+      "\n",
+      "xx.\n",
+      ".o.\n",
+      "o.. Counter({2: 6, 5: 6, 3: 4, 8: 2, 7: 2}) \n",
+      "\n",
+      "xo.\n",
+      "..x\n",
+      "... Counter({2: 4, 7: 4, 3: 3, 8: 3, 4: 2, 6: 2}) \n",
+      "\n",
+      "xxo\n",
+      ".o.\n",
+      ".ox Counter({6: 3, 3: 2, 5: 1}) \n",
+      "\n",
+      "xox\n",
+      "ox.\n",
+      "oxo Counter({5: 3}) \n",
+      "\n",
+      "xx.\n",
+      "ox.\n",
+      "xoo Counter({2: 3, 5: 2}) \n",
+      "\n",
+      "xxo\n",
+      "..o\n",
+      ".x. Counter({8: 4, 6: 4, 4: 3, 3: 0}) \n",
+      "\n",
+      "ox.\n",
+      ".xo\n",
+      "... Counter({8: 5, 3: 4, 7: 4, 2: 3, 6: 2}) \n",
+      "\n",
+      "xx.\n",
+      "xox\n",
+      ".oo Counter({6: 5, 2: 2}) \n",
+      "\n",
+      "x.o\n",
+      "..x\n",
+      "ox. Counter({4: 5, 8: 3, 1: 3, 3: 2}) \n",
+      "\n",
+      "xx.\n",
+      "oox\n",
+      "o.x Counter({2: 4, 7: 2}) \n",
+      "\n",
+      ".x.\n",
+      "o.o\n",
+      ".x. Counter({8: 4, 0: 3, 4: 3, 6: 3, 2: 2}) \n",
+      "\n",
+      "xxo\n",
+      "...\n",
+      "oxo Counter({3: 3, 4: 3, 5: 3}) \n",
+      "\n",
+      "x.x\n",
+      ".x.\n",
+      "o.o Counter({1: 8, 7: 5, 3: 2, 5: 2}) \n",
+      "\n",
+      "xxo\n",
+      "xo.\n",
+      "... Counter({5: 6, 6: 5, 8: 3, 7: 3}) \n",
+      "\n",
+      "xox\n",
+      "o..\n",
+      ".xo Counter({6: 4, 4: 3, 5: 3}) \n",
+      "\n",
+      ".x.\n",
+      ".x.\n",
+      ".o. Counter({8: 4, 0: 3, 2: 3, 3: 3, 5: 3, 6: 2}) \n",
+      "\n",
+      "xx.\n",
+      "ox.\n",
+      "o.. Counter({8: 3, 2: 3, 5: 1, 7: 1}) \n",
+      "\n",
+      "xx.\n",
+      "..o\n",
+      "xo. Counter({8: 3, 3: 3, 4: 3, 2: 2}) \n",
+      "\n",
+      "xox\n",
+      ".o.\n",
+      "x.o Counter({3: 6, 7: 4, 5: 2}) \n",
+      "\n",
+      "xo.\n",
+      "..o\n",
+      "x.x Counter({2: 3, 3: 3, 4: 3, 7: 3}) \n",
+      "\n",
+      "oo.\n",
+      ".x.\n",
+      ".x. Counter({2: 8, 8: 0, 3: 0, 5: 0, 6: 0}) \n",
+      "\n",
+      "xo.\n",
+      ".o.\n",
+      ".x. Counter({6: 6, 3: 5, 8: 3, 5: 3, 2: 2}) \n",
+      "\n",
+      "xx.\n",
+      "o.o\n",
+      ".xo Counter({4: 4, 2: 3, 6: 1}) \n",
+      "\n",
+      "xxo\n",
+      "xo.\n",
+      ".xo Counter({5: 6, 6: 5}) \n",
+      "\n",
+      "oxo\n",
+      ".x.\n",
+      "... Counter({3: 5, 6: 4, 8: 3, 5: 3, 7: 3}) \n",
+      "\n",
+      "xxo\n",
+      "xx.\n",
+      ".oo Counter({5: 10, 6: 3}) \n",
+      "\n",
+      "xo.\n",
+      ".xx\n",
+      ".o. Counter({8: 3, 2: 3, 6: 3, 3: 2}) \n",
+      "\n",
+      "xx.\n",
+      ".oo\n",
+      ".ox Counter({3: 5, 2: 4, 6: 2}) \n",
+      "\n",
+      "xx.\n",
+      ".o.\n",
+      "xoo Counter({2: 4, 5: 4, 3: 3}) \n",
+      "\n",
+      "xo.\n",
+      ".xo\n",
+      "... Counter({8: 4, 2: 3, 3: 3, 6: 3, 7: 3}) \n",
+      "\n",
+      "x..\n",
+      ".xo\n",
+      "... Counter({1: 3, 3: 3, 6: 3, 2: 2, 7: 2, 8: 1}) \n",
+      "\n",
+      "x.o\n",
+      "...\n",
+      "o.x Counter({1: 3, 4: 3, 7: 3, 3: 2, 5: 2}) \n",
+      "\n",
+      "xx.\n",
+      ".oo\n",
+      ".x. Counter({2: 5, 3: 4, 8: 3, 6: 3}) \n",
+      "\n",
+      "xxo\n",
+      ".ox\n",
+      ".o. Counter({8: 3, 3: 3, 6: 3}) \n",
+      "\n",
+      "xx.\n",
+      "ox.\n",
+      "oo. Counter({8: 3, 2: 3, 5: 3}) \n",
+      "\n",
+      "xx.\n",
+      "...\n",
+      "oo. Counter({8: 4, 2: 3, 3: 3, 5: 3, 4: 2}) \n",
+      "\n",
+      "xx.\n",
+      "...\n",
+      "..o Counter({2: 10, 6: 4, 7: 2, 3: 0, 4: 0, 5: 0}) \n",
+      "\n",
+      "x.o\n",
+      "...\n",
+      ".x. Counter({8: 7, 6: 6, 4: 5, 5: 2, 1: 1, 3: 1}) \n",
+      "\n",
+      "ox.\n",
+      ".ox\n",
+      ".x. Counter({3: 8, 8: 5, 6: 4, 2: 3}) \n",
+      "\n",
+      "xx.\n",
+      "x.o\n",
+      ".oo Counter({2: 4, 4: 3, 6: 3}) \n",
+      "\n",
+      "...\n",
+      "...\n",
+      "... Counter({8: 21203, 0: 14869, 6: 7569, 2: 5002, 4: 73, 3: 9, 1: 3, 5: 2, 7: 0}) \n",
+      "\n",
+      "xx.\n",
+      "oxx\n",
+      ".oo Counter({6: 9, 2: 3}) \n",
+      "\n",
+      "xx.\n",
+      "o.x\n",
+      "..o Counter({6: 3, 7: 3, 2: 2, 4: 2}) \n",
+      "\n",
+      "oxo\n",
+      "xx.\n",
+      ".o. Counter({5: 9, 8: 5, 6: 3}) \n",
+      "\n",
+      "ox.\n",
+      ".xx\n",
+      "o.. Counter({3: 4, 8: 2, 2: 2, 7: 1}) \n",
+      "\n",
+      "xxo\n",
+      "..o\n",
+      "... Counter({6: 4, 3: 3, 4: 3, 7: 3, 8: 2}) \n",
+      "\n",
+      "xox\n",
+      "oo.\n",
+      "x.x Counter({7: 4, 5: 3}) \n",
+      "\n",
+      "xxo\n",
+      "oo.\n",
+      "x.x Counter({5: 11, 7: 3}) \n",
+      "\n",
+      "x..\n",
+      ".xo\n",
+      "..o Counter({2: 10, 7: 5, 1: 3, 6: 1, 3: 0}) \n",
+      "\n",
+      "ox.\n",
+      ".xx\n",
+      ".o. Counter({3: 7, 8: 0, 2: 0, 6: 0}) \n",
+      "\n",
+      "x..\n",
+      ".o.\n",
+      "..x Counter({5: 4, 1: 3, 2: 3, 3: 3, 6: 3, 7: 3}) \n",
+      "\n",
+      "xx.\n",
+      "o..\n",
+      ".ox Counter({2: 3, 4: 3, 5: 3, 6: 3}) \n",
+      "\n",
+      "x.x\n",
+      ".x.\n",
+      "oo. Counter({8: 9, 3: 2, 5: 2, 1: 1}) \n",
+      "\n",
+      "xo.\n",
+      ".xx\n",
+      ".oo Counter({3: 7, 6: 4, 2: 3}) \n",
+      "\n",
+      "xx.\n",
+      "...\n",
+      ".o. Counter({3: 4, 6: 3, 8: 3, 2: 2, 4: 2, 5: 2}) \n",
+      "\n",
+      "xxo\n",
+      "...\n",
+      "o.. Counter({8: 3, 4: 3, 3: 2, 5: 2, 7: 2}) \n",
+      "\n",
+      "xox\n",
+      "o.o\n",
+      "xox Counter({4: 3}) \n",
+      "\n",
+      "ox.\n",
+      ".x.\n",
+      ".o. Counter({6: 13, 3: 11, 5: 6, 8: 4, 2: 1}) \n",
+      "\n",
+      "xo.\n",
+      "oox\n",
+      ".x. Counter({8: 3, 2: 3, 6: 3}) \n",
+      "\n",
+      "ox.\n",
+      "...\n",
+      "... Counter({3: 6, 5: 6, 7: 5, 2: 3, 4: 3, 6: 2, 8: 2}) \n",
+      "\n",
+      "xox\n",
+      ".o.\n",
+      "x.. Counter({3: 5, 5: 3, 7: 3, 8: 2}) \n",
+      "\n",
+      "xo.\n",
+      ".ox\n",
+      ".xo Counter({2: 3, 3: 3, 6: 3}) \n",
+      "\n",
+      "xx.\n",
+      "..o\n",
+      "ox. Counter({8: 4, 4: 4, 3: 3, 2: 2}) \n",
+      "\n",
+      "xo.\n",
+      "o.x\n",
+      ".x. Counter({8: 3, 2: 3, 4: 3, 6: 3}) \n",
+      "\n",
+      "xx.\n",
+      "oox\n",
+      "..o Counter({6: 4, 2: 3, 7: 3}) \n",
+      "\n",
+      "xx.\n",
+      "o..\n",
+      "o.x Counter({4: 3, 5: 3, 7: 3, 2: 2}) \n",
+      "\n",
+      "x.o\n",
+      ".ox\n",
+      "... Counter({6: 4, 7: 4, 3: 2, 1: 1, 8: 0}) \n",
+      "\n",
+      "xxo\n",
+      "o.x\n",
+      ".o. Counter({8: 3, 4: 3, 6: 3}) \n",
+      "\n",
+      "xxo\n",
+      "o..\n",
+      "ox. Counter({8: 3, 4: 3, 5: 3}) \n",
+      "\n",
+      "x..\n",
+      ".xo\n",
+      ".o. Counter({8: 4, 1: 3, 2: 3, 3: 3, 6: 3}) \n",
+      "\n",
+      "xx.\n",
+      "o..\n",
+      ".o. Counter({8: 3, 2: 3, 4: 3, 5: 3, 6: 3}) \n",
+      "\n",
+      "x.o\n",
+      "...\n",
+      ".xo Counter({1: 3, 3: 3, 4: 3, 5: 3, 6: 3}) \n",
+      "\n",
+      "xo.\n",
+      ".xx\n",
+      "oo. Counter({8: 5, 2: 3, 3: 3}) \n",
+      "\n",
+      "xx.\n",
+      "o.x\n",
+      "oxo Counter({2: 1, 4: 1}) \n",
+      "\n",
+      "x.o\n",
+      ".xx\n",
+      ".oo Counter({3: 7, 6: 4, 1: 3}) \n",
+      "\n",
+      "xx.\n",
+      "...\n",
+      ".oo Counter({2: 3, 5: 3, 6: 3, 3: 1, 4: 1}) \n",
+      "\n",
+      "xx.\n",
+      "o..\n",
+      "oxo Counter({4: 4, 2: 3, 5: 3}) \n",
+      "\n",
+      "xx.\n",
+      "oox\n",
+      ".o. Counter({8: 4, 2: 4, 6: 3}) \n",
+      "\n",
+      "oxo\n",
+      "x.x\n",
+      "oxo Counter({4: 3}) \n",
+      "\n",
+      "xox\n",
+      "ox.\n",
+      "o.. Counter({7: 4, 8: 3, 5: 3}) \n",
+      "\n",
+      "xxo\n",
+      "x.o\n",
+      "... Counter({8: 6, 4: 4, 6: 4, 7: 3}) \n",
+      "\n",
+      "xxo\n",
+      ".o.\n",
+      "... Counter({3: 6, 8: 3, 5: 3, 6: 3, 7: 3}) \n",
+      "\n",
+      "xx.\n",
+      ".oo\n",
+      "xox Counter({3: 4, 2: 1}) \n",
+      "\n",
+      "xx.\n",
+      ".o.\n",
+      "..o Counter({6: 7, 3: 4, 2: 3, 5: 3, 7: 3}) \n",
+      "\n",
+      "xx.\n",
+      "o..\n",
+      ".xo Counter({5: 3, 6: 3, 2: 2, 4: 2}) \n",
+      "\n",
+      "xxo\n",
+      "xxo\n",
+      "o.. Counter({8: 5, 7: 2}) \n",
+      "\n",
+      "oxo\n",
+      "x.x\n",
+      "... Counter({4: 4, 8: 3, 6: 3, 7: 3}) \n",
+      "\n",
+      "xx.\n",
+      "o.x\n",
+      "o.o Counter({7: 4, 2: 3, 4: 3}) \n",
+      "\n",
+      "xo.\n",
+      "..x\n",
+      "o.. Counter({8: 3, 3: 3, 4: 3, 7: 3, 2: 2}) \n",
+      "\n",
+      "xox\n",
+      "oo.\n",
+      "x.. Counter({5: 2, 8: 1, 7: 1}) \n",
+      "\n",
+      "xxo\n",
+      "..o\n",
+      "x.. Counter({8: 4, 3: 3, 4: 3, 7: 3}) \n",
+      "\n",
+      "xx.\n",
+      ".o.\n",
+      "oox Counter({5: 4, 2: 3, 3: 3}) \n",
+      "\n",
+      "xx.\n",
+      "..o\n",
+      ".xo Counter({2: 4, 4: 3, 3: 2, 6: 2}) \n",
+      "\n",
+      "xoo\n",
+      ".x.\n",
+      "ox. Counter({3: 7, 8: 4, 5: 4}) \n",
+      "\n",
+      "o..\n",
+      "..x\n",
+      ".x. Counter({3: 5, 1: 4, 4: 4, 2: 3, 6: 3, 8: 2}) \n",
+      "\n",
+      "xxo\n",
+      ".o.\n",
+      "xox Counter({3: 3, 5: 0}) \n",
+      "\n",
+      "xx.\n",
+      "oxo\n",
+      "x.o Counter({2: 3, 7: 2}) \n",
+      "\n",
+      "xx.\n",
+      "oox\n",
+      "... Counter({2: 4, 8: 3, 7: 3, 6: 2}) \n",
+      "\n",
+      "xo.\n",
+      ".x.\n",
+      ".xo Counter({5: 9, 2: 4, 6: 2, 3: 1}) \n",
+      "\n",
+      "xox\n",
+      "...\n",
+      "x.o Counter({4: 1, 3: 0, 5: 0, 7: 0}) \n",
+      "\n",
+      "xxo\n",
+      "oox\n",
+      "... Counter({6: 3, 7: 2, 8: 0}) \n",
+      "\n",
+      "xo.\n",
+      ".o.\n",
+      "..x Counter({7: 4, 3: 3, 2: 2, 6: 2, 5: 1}) \n",
+      "\n",
+      "xx.\n",
+      ".oo\n",
+      "x.. Counter({3: 3, 8: 2, 2: 2, 7: 1}) \n",
+      "\n",
+      "xxo\n",
+      "xx.\n",
+      "o.o Counter({5: 5, 7: 4}) \n",
+      "\n",
+      "xxo\n",
+      "o.x\n",
+      "..o Counter({4: 3, 6: 3, 7: 3}) \n",
+      "\n",
+      "xoo\n",
+      "..x\n",
+      ".x. Counter({8: 3, 3: 3, 4: 3, 6: 2}) \n",
+      "\n",
+      "xxo\n",
+      ".oo\n",
+      ".x. Counter({8: 2, 6: 2, 3: 1}) \n",
+      "\n",
+      "ox.\n",
+      "...\n",
+      "ox. Counter({4: 4, 8: 3, 2: 3, 3: 3, 5: 3}) \n",
+      "\n",
+      "ox.\n",
+      "..x\n",
+      "... Counter({3: 5, 4: 5, 6: 4, 8: 1, 2: 0, 7: 0}) \n",
+      "\n",
+      "xox\n",
+      "oxo\n",
+      "... Counter({6: 4, 8: 3, 7: 3}) \n",
+      "\n",
+      "xox\n",
+      "ox.\n",
+      "ox. Counter({8: 3, 5: 0}) \n",
+      "\n",
+      "xx.\n",
+      ".o.\n",
+      "o.x Counter({2: 5, 5: 4, 3: 1, 7: 1}) \n",
+      "\n",
+      "ox.\n",
+      "xxo\n",
+      "..o Counter({2: 6, 7: 5, 6: 0}) \n",
+      "\n",
+      "xx.\n",
+      "...\n",
+      "o.o Counter({2: 3, 5: 3, 7: 3, 3: 2, 4: 1}) \n",
+      "\n",
+      "xxo\n",
+      "x.o\n",
+      "o.x Counter({4: 8, 7: 2}) \n",
+      "\n",
+      "xo.\n",
+      ".x.\n",
+      "... Counter({5: 2, 6: 2, 8: 2, 2: 1, 3: 1, 7: 0}) \n",
+      "\n",
+      "xoo\n",
+      ".xx\n",
+      "oxo Counter({3: 12}) \n",
+      "\n",
+      "xxo\n",
+      "xoo\n",
+      ".x. Counter({8: 8, 6: 4}) \n",
+      "\n",
+      "xo.\n",
+      "..x\n",
+      "..o Counter({3: 4, 2: 3, 4: 3, 6: 3, 7: 3}) \n",
+      "\n",
+      "xx.\n",
+      "oox\n",
+      ".ox Counter({2: 3, 6: 3}) \n",
+      "\n",
+      "xxo\n",
+      "ox.\n",
+      ".o. Counter({8: 5, 5: 3, 6: 3}) \n",
+      "\n",
+      "oo.\n",
+      "oxx\n",
+      ".x. Counter({8: 3, 2: 3, 6: 1}) \n",
+      "\n",
+      "xxo\n",
+      "o.o\n",
+      "xx. Counter({8: 4, 4: 4}) \n",
+      "\n",
+      "x..\n",
+      ".xx\n",
+      ".oo Counter({1: 3, 2: 3, 6: 3, 3: 2}) \n",
+      "\n",
+      "xxo\n",
+      "xo.\n",
+      ".o. Counter({6: 5, 8: 2, 5: 2}) \n",
+      "\n",
+      "x.o\n",
+      ".x.\n",
+      "... Counter({8: 7, 1: 0, 3: 0, 5: 0, 6: 0, 7: 0}) \n",
+      "\n",
+      "xox\n",
+      "o..\n",
+      "..x Counter({4: 3, 5: 3, 6: 3, 7: 2}) \n",
+      "\n",
+      "xxo\n",
+      "xoo\n",
+      ".ox Counter({6: 9}) \n",
+      "\n",
+      "xxo\n",
+      ".o.\n",
+      "..x Counter({6: 6, 3: 5, 7: 4, 5: 2}) \n",
+      "\n",
+      "xo.\n",
+      "..x\n",
+      "ox. Counter({8: 3, 3: 3, 4: 3, 2: 2}) \n",
+      "\n",
+      "xxo\n",
+      "ox.\n",
+      "xo. Counter({8: 3, 5: 0}) \n",
+      "\n",
+      "xoo\n",
+      "..x\n",
+      "x.o Counter({4: 4, 3: 3, 7: 3}) \n",
+      "\n",
+      "ox.\n",
+      "xox\n",
+      "... Counter({8: 7, 2: 4, 6: 3, 7: 3}) \n",
+      "\n",
+      "xo.\n",
+      ".xo\n",
+      "x.o Counter({3: 5, 2: 4, 7: 3}) \n",
+      "\n",
+      "xox\n",
+      "o.o\n",
+      "x.x Counter({4: 4, 7: 2}) \n",
+      "\n",
+      "xxo\n",
+      ".x.\n",
+      ".o. Counter({8: 12, 3: 2, 6: 1, 5: 0}) \n",
+      "\n",
+      "xoo\n",
+      ".x.\n",
+      "x.o Counter({3: 8, 5: 3, 7: 1}) \n",
+      "\n",
+      "ox.\n",
+      "x.x\n",
+      ".o. Counter({8: 3, 2: 3, 4: 3, 6: 2}) \n",
+      "\n",
+      "xo.\n",
+      ".x.\n",
+      "ox. Counter({8: 2, 2: 0, 3: 0, 5: 0}) \n",
+      "\n",
+      "xo.\n",
+      "...\n",
+      "o.x Counter({2: 5, 4: 4, 3: 3, 5: 3, 7: 3}) \n",
+      "\n",
+      "xx.\n",
+      ".oo\n",
+      "xo. Counter({2: 5, 3: 5, 8: 3}) \n",
+      "\n",
+      "xx.\n",
+      "o.x\n",
+      "o.. Counter({2: 3, 4: 3, 7: 3, 8: 2}) \n",
+      "\n",
+      "xxo\n",
+      "oxo\n",
+      "x.. Counter({8: 6, 7: 2}) \n",
+      "\n",
+      "xxo\n",
+      "x.x\n",
+      "oo. Counter({4: 5, 8: 4}) \n",
+      "\n",
+      "xxo\n",
+      "o..\n",
+      ".ox Counter({4: 3, 5: 3, 6: 3}) \n",
+      "\n",
+      "oxo\n",
+      "x.x\n",
+      "ox. Counter({8: 3, 4: 3}) \n",
+      "\n",
+      "xx.\n",
+      "oo.\n",
+      ".ox Counter({5: 4, 2: 3, 6: 2}) \n",
+      "\n",
+      "xxo\n",
+      "o..\n",
+      "xox Counter({4: 3, 5: 1}) \n",
+      "\n",
+      "ox.\n",
+      "...\n",
+      ".x. Counter({4: 10, 2: 3, 3: 3, 6: 3, 8: 1, 5: 0}) \n",
+      "\n",
+      "xx.\n",
+      ".xo\n",
+      "..o Counter({2: 3, 3: 3, 6: 3, 7: 2}) \n",
+      "\n",
+      "ox.\n",
+      "oxx\n",
+      "..o Counter({7: 6, 6: 4, 2: 2}) \n",
+      "\n",
+      "xxo\n",
+      ".xo\n",
+      "o.. Counter({3: 5, 8: 4, 7: 3}) \n",
+      "\n",
+      "xx.\n",
+      "o.o\n",
+      ".ox Counter({2: 3, 4: 3, 6: 3}) \n",
+      "\n",
+      "xo.\n",
+      "...\n",
+      "..x Counter({4: 4, 5: 3, 7: 3, 3: 2, 6: 2, 2: 1}) \n",
+      "\n",
+      "xo.\n",
+      "o.x\n",
+      "... Counter({6: 5, 7: 4, 2: 3, 4: 3, 8: 2}) \n",
+      "\n",
+      "xxo\n",
+      "xoo\n",
+      "..x Counter({6: 7, 7: 2}) \n",
+      "\n",
+      "xxo\n",
+      "..o\n",
+      "..x Counter({4: 4, 3: 3, 6: 3, 7: 2}) \n",
+      "\n",
+      "ox.\n",
+      "x.x\n",
+      "..o Counter({6: 4, 2: 3, 4: 3, 7: 3}) \n",
+      "\n",
+      ".x.\n",
+      "xo.\n",
+      "... Counter({8: 6, 2: 4, 6: 4, 7: 4, 0: 3, 5: 3}) \n",
+      "\n",
+      "ox.\n",
+      ".xx\n",
+      "oo. Counter({3: 10, 8: 2, 2: 2}) \n",
+      "\n",
+      "xxo\n",
+      "xo.\n",
+      ".ox Counter({6: 10, 5: 0}) \n",
+      "\n",
+      "xxo\n",
+      "oxx\n",
+      "o.. Counter({7: 1, 8: 0}) \n",
+      "\n",
+      "x.o\n",
+      "..x\n",
+      "..o Counter({4: 4, 1: 3, 3: 3, 6: 3, 7: 2}) \n",
+      "\n",
+      "xo.\n",
+      "oxx\n",
+      ".xo Counter({2: 3, 6: 3}) \n",
+      "\n",
+      "xxo\n",
+      "o..\n",
+      ".x. Counter({4: 4, 8: 2, 5: 2, 6: 2}) \n",
+      "\n",
+      "xxo\n",
+      ".xo\n",
+      "... Counter({8: 5, 6: 3, 7: 3, 3: 2}) \n",
+      "\n",
+      "xox\n",
+      "o.o\n",
+      ".x. Counter({4: 4, 8: 3, 6: 3}) \n",
+      "\n",
+      "xoo\n",
+      ".x.\n",
+      ".xo Counter({5: 4, 3: 0, 6: 0}) \n",
+      "\n",
+      "xx.\n",
+      ".o.\n",
+      ".xo Counter({2: 5, 3: 3, 5: 2, 6: 2}) \n",
+      "\n",
+      "xox\n",
+      ".o.\n",
+      "ox. Counter({8: 5, 5: 5, 3: 3}) \n",
+      "\n",
+      "x.o\n",
+      "..x\n",
+      "o.. Counter({8: 3, 1: 3, 4: 3, 3: 2, 7: 2}) \n",
+      "\n",
+      "xx.\n",
+      "oo.\n",
+      "xo. Counter({2: 5, 5: 5, 8: 2}) \n",
+      "\n",
+      "xxo\n",
+      ".xo\n",
+      "xo. Counter({8: 6, 3: 3}) \n",
+      "\n",
+      "xx.\n",
+      "ox.\n",
+      ".oo Counter({2: 6, 6: 3, 5: 2}) \n",
+      "\n",
+      "oxo\n",
+      "xx.\n",
+      "..o Counter({5: 5, 6: 3, 7: 3}) \n",
+      "\n",
+      "xx.\n",
+      "o.o\n",
+      "... Counter({2: 4, 4: 4, 8: 3, 6: 3, 7: 3}) \n",
+      "\n",
+      "xo.\n",
+      ".xx\n",
+      "o.. Counter({2: 3, 3: 3, 8: 2, 7: 1}) \n",
+      "\n",
+      "xxo\n",
+      ".xx\n",
+      "oo. Counter({8: 7, 3: 2}) \n",
+      "\n",
+      "ox.\n",
+      "x.o\n",
+      "... Counter({4: 5, 7: 4, 8: 3, 2: 3, 6: 2}) \n",
+      "\n",
+      "xx.\n",
+      "oo.\n",
+      "o.x Counter({5: 4, 2: 3, 7: 2}) \n",
+      "\n",
+      "xox\n",
+      "...\n",
+      "xoo Counter({3: 4, 4: 3, 5: 3}) \n",
+      "\n",
+      "xx.\n",
+      "o..\n",
+      "..o Counter({5: 4, 2: 3, 4: 3, 6: 3, 7: 3}) \n",
+      "\n",
+      "xxo\n",
+      "..x\n",
+      "oo. Counter({8: 3, 3: 3, 4: 3}) \n",
+      "\n",
+      "xx.\n",
+      ".xo\n",
+      "o.. Counter({2: 3, 3: 3, 7: 2, 8: 1}) \n",
+      "\n",
+      "xx.\n",
+      ".ox\n",
+      ".oo Counter({2: 3, 3: 3, 6: 3}) \n",
+      "\n",
+      "xxo\n",
+      "o.x\n",
+      "ox. Counter({4: 3, 8: 0}) \n",
+      "\n",
+      "xxo\n",
+      ".x.\n",
+      "oo. Counter({8: 6, 5: 2, 3: 1}) \n",
+      "\n",
+      "ox.\n",
+      ".o.\n",
+      ".x. Counter({8: 3, 6: 3, 5: 2, 2: 1, 3: 1}) \n",
+      "\n",
+      "xx.\n",
+      "oo.\n",
+      "ox. Counter({2: 5, 8: 3, 5: 2}) \n",
+      "\n",
+      "xx.\n",
+      "o..\n",
+      "x.o Counter({2: 3, 4: 3, 5: 3, 7: 2}) \n",
+      "\n",
+      "xoo\n",
+      "..x\n",
+      "... Counter({8: 4, 3: 3, 4: 3, 6: 3, 7: 3}) \n",
+      "\n",
+      "xxo\n",
+      "...\n",
+      "... Counter({4: 7, 3: 6, 8: 5, 5: 2, 6: 2, 7: 2}) \n",
+      "\n",
+      "xx.\n",
+      "oox\n",
+      "oox Counter({2: 10}) \n",
+      "\n",
+      "xxo\n",
+      "o..\n",
+      ".xo Counter({4: 3, 5: 3, 6: 3}) \n",
+      "\n",
+      "xoo\n",
+      ".xx\n",
+      "xoo Counter({3: 8}) \n",
+      "\n",
+      "xxo\n",
+      "oo.\n",
+      "xox Counter({5: 3}) \n",
+      "\n",
+      "x.x\n",
+      "...\n",
+      ".o. Counter({1: 3, 4: 3, 5: 3, 8: 3, 3: 2, 6: 2}) \n",
+      "\n",
+      "x..\n",
+      ".ox\n",
+      "... Counter({2: 3, 1: 2, 6: 2, 7: 1, 3: 0, 8: 0}) \n",
+      "\n",
+      "xx.\n",
+      "o.x\n",
+      ".o. Counter({8: 3, 4: 3, 6: 3, 2: 2}) \n",
+      "\n",
+      "xo.\n",
+      ".xx\n",
+      "o.o Counter({3: 6, 7: 4, 2: 3}) \n",
+      "\n",
+      "x.o\n",
+      ".xx\n",
+      "o.o Counter({3: 7, 7: 3, 1: 0}) \n",
+      "\n",
+      "ox.\n",
+      "o.x\n",
+      ".x. Counter({6: 4, 4: 3, 8: 2, 2: 2}) \n",
+      "\n",
+      "oxo\n",
+      "x..\n",
+      ".x. Counter({4: 3, 8: 2, 5: 2, 6: 2}) \n",
+      "\n",
+      "ox.\n",
+      "..x\n",
+      "..o Counter({4: 4, 2: 3, 3: 3, 6: 3, 7: 3}) \n",
+      "\n",
+      "xxo\n",
+      "oo.\n",
+      ".xx Counter({5: 8, 6: 5}) \n",
+      "\n",
+      "x..\n",
+      ".x.\n",
+      "..o Counter({5: 5, 6: 4, 1: 3, 2: 3, 3: 3, 7: 3}) \n",
+      "\n",
+      "xx.\n",
+      ".ox\n",
+      ".o. Counter({8: 3, 2: 3, 6: 3, 3: 2}) \n",
+      "\n",
+      "xo.\n",
+      ".o.\n",
+      "x.x Counter({2: 3, 3: 3, 5: 3, 7: 3}) \n",
+      "\n",
+      "ox.\n",
+      "xxo\n",
+      ".o. Counter({2: 4, 6: 4, 8: 3}) \n",
+      "\n",
+      "xx.\n",
+      "x.o\n",
+      ".o. Counter({8: 3, 2: 3, 6: 3, 4: 2}) \n",
+      "\n",
+      "x.x\n",
+      "...\n",
+      "oo. Counter({8: 3, 1: 3, 3: 3, 4: 3, 5: 3}) \n",
+      "\n",
+      "xxo\n",
+      "o.o\n",
+      "oxx Counter({4: 4}) \n",
+      "\n",
+      "xxo\n",
+      "xo.\n",
+      "..o Counter({6: 5, 7: 3, 5: 2}) \n",
+      "\n",
+      "xxo\n",
+      "xox\n",
+      ".o. Counter({6: 8, 8: 0}) \n",
+      "\n",
+      "ox.\n",
+      "o.x\n",
+      "... Counter({6: 4, 7: 4, 8: 3, 4: 3, 2: 2}) \n",
+      "\n",
+      "xxo\n",
+      ".oo\n",
+      "xx. Counter({8: 5, 3: 4}) \n",
+      "\n",
+      "xxo\n",
+      "xox\n",
+      ".oo Counter({6: 7}) \n",
+      "\n",
+      "xx.\n",
+      "o.o\n",
+      "xo. Counter({2: 3, 4: 3, 8: 2}) \n",
+      "\n",
+      "xx.\n",
+      ".oo\n",
+      "ox. Counter({3: 4, 2: 3, 8: 2}) \n",
+      "\n",
+      "xxo\n",
+      "..x\n",
+      ".o. Counter({3: 3, 4: 3, 8: 2, 6: 2}) \n",
+      "\n",
+      "xox\n",
+      ".o.\n",
+      "... Counter({7: 3, 8: 0, 3: 0, 5: 0, 6: 0}) \n",
+      "\n",
+      "xxo\n",
+      "oox\n",
+      "..x Counter({6: 8, 7: 3}) \n",
+      "\n",
+      "xoo\n",
+      ".x.\n",
+      "x.. Counter({8: 3, 3: 3, 5: 3, 7: 2}) \n",
+      "\n",
+      "xx.\n",
+      "oo.\n",
+      "xox Counter({5: 4, 2: 3}) \n",
+      "\n",
+      "xxo\n",
+      "o.x\n",
+      "o.. Counter({8: 3, 4: 3, 7: 3}) \n",
+      "\n",
+      "xoo\n",
+      "...\n",
+      "x.x Counter({3: 2, 5: 1, 4: 0, 7: 0}) \n",
+      "\n",
+      "xx.\n",
+      "o.o\n",
+      ".x. Counter({8: 3, 4: 3, 2: 2, 6: 2}) \n",
+      "\n",
+      "x.o\n",
+      "..x\n",
+      "oxo Counter({1: 3, 4: 3, 3: 2}) \n",
+      "\n",
+      "xx.\n",
+      "x.o\n",
+      "..o Counter({2: 6, 4: 4, 7: 3, 6: 2}) \n",
+      "\n",
+      "xxo\n",
+      "o..\n",
+      "oxx Counter({4: 9, 5: 1}) \n",
+      "\n",
+      "xxo\n",
+      "..x\n",
+      ".oo Counter({4: 3, 6: 3, 3: 1}) \n",
+      "\n",
+      "xxo\n",
+      "oox\n",
+      "xxo Counter() \n",
+      "\n",
+      "xx.\n",
+      ".xo\n",
+      "oo. Counter({8: 5, 2: 3, 3: 3}) \n",
+      "\n",
+      "xx.\n",
+      "oxo\n",
+      "o.. Counter({7: 5, 2: 4, 8: 3}) \n",
+      "\n",
+      "o..\n",
+      ".xx\n",
+      "... Counter({3: 13, 1: 0, 2: 0, 6: 0, 7: 0, 8: 0}) \n",
+      "\n",
+      "oxo\n",
+      "x..\n",
+      "... Counter({7: 4, 8: 3, 4: 3, 5: 3, 6: 3}) \n",
+      "\n",
+      "xox\n",
+      "...\n",
+      "xo. Counter({3: 4, 4: 4, 8: 3, 5: 3}) \n",
+      "\n",
+      "ox.\n",
+      "x..\n",
+      "..o Counter({2: 3, 4: 3, 5: 3, 6: 3, 7: 3}) \n",
+      "\n",
+      "xxo\n",
+      "..o\n",
+      "ox. Counter({8: 3, 4: 3, 3: 2}) \n",
+      "\n",
+      ".x.\n",
+      "oo.\n",
+      ".x. Counter({0: 4, 8: 3, 5: 3, 2: 2, 6: 2}) \n",
+      "\n",
+      "xx.\n",
+      "..o\n",
+      "o.x Counter({2: 1, 3: 0, 4: 0, 7: 0}) \n",
+      "\n",
+      "xoo\n",
+      ".xo\n",
+      "x.. Counter({3: 6, 7: 4, 8: 3}) \n",
+      "\n",
+      "xx.\n",
+      "..o\n",
+      "..o Counter({2: 4, 3: 3, 4: 3, 7: 3, 6: 2}) \n",
+      "\n",
+      "ox.\n",
+      ".x.\n",
+      "o.. Counter({3: 7, 7: 7, 8: 5, 5: 2, 2: 0}) \n",
+      "\n",
+      "xoo\n",
+      "...\n",
+      "x.. Counter({5: 4, 8: 3, 3: 3, 4: 3, 7: 3}) \n",
+      "\n",
+      "xx.\n",
+      "...\n",
+      "xoo Counter({2: 3, 3: 2, 4: 1, 5: 1}) \n",
+      "\n",
+      "xxo\n",
+      ".o.\n",
+      "xxo Counter({5: 5, 3: 3}) \n",
+      "\n",
+      "xxo\n",
+      "..x\n",
+      "xoo Counter({3: 3, 4: 2}) \n",
+      "\n",
+      "xxo\n",
+      ".x.\n",
+      "o.o Counter({7: 7, 5: 2, 3: 0}) \n",
+      "\n",
+      "oo.\n",
+      ".xx\n",
+      ".x. Counter({2: 8, 3: 3, 8: 2, 6: 2}) \n",
+      "\n",
+      "xx.\n",
+      "oox\n",
+      "xo. Counter({2: 3, 8: 2}) \n",
+      "\n",
+      "xxo\n",
+      "o..\n",
+      "xxo Counter({5: 5, 4: 3}) \n",
+      "\n",
+      "xoo\n",
+      ".xx\n",
+      "o.. Counter({3: 6, 7: 5, 8: 3}) \n",
+      "\n",
+      "xxo\n",
+      "x.o\n",
+      ".o. Counter({8: 3, 4: 3, 6: 3}) \n",
+      "\n",
+      ".x.\n",
+      ".o.\n",
+      "... Counter({2: 11, 0: 5, 6: 4, 3: 1, 8: 1, 5: 0, 7: 0}) \n",
+      "\n",
+      "xo.\n",
+      ".xo\n",
+      "x.. Counter({8: 3, 2: 3, 3: 3, 7: 3}) \n",
+      "\n",
+      "xxo\n",
+      "oxx\n",
+      ".oo Counter({6: 3}) \n",
+      "\n",
+      "xx.\n",
+      "..o\n",
+      "o.. Counter({2: 4, 8: 3, 3: 3, 4: 3, 7: 3}) \n",
+      "\n",
+      "xo.\n",
+      "...\n",
+      "x.. Counter({7: 4, 4: 3, 5: 3, 8: 3, 2: 2, 3: 2}) \n",
+      "\n",
+      "xo.\n",
+      "oxx\n",
+      ".o. Counter({6: 4, 8: 3, 2: 3}) \n",
+      "\n",
+      "xxo\n",
+      "..x\n",
+      "oxo Counter({4: 8, 3: 1}) \n",
+      "\n",
+      "xxo\n",
+      "x.o\n",
+      "oox Counter({4: 5}) \n",
+      "\n",
+      "xox\n",
+      "...\n",
+      "ox. Counter({8: 3, 4: 3, 5: 3, 3: 2}) \n",
+      "\n",
+      "xx.\n",
+      "xoo\n",
+      ".o. Counter({8: 5, 2: 4, 6: 3}) \n",
+      "\n",
+      "xx.\n",
+      "..o\n",
+      "oox Counter({2: 3, 3: 3, 4: 3}) \n",
+      "\n",
+      "xxo\n",
+      "oxo\n",
+      "xo. Counter({8: 6}) \n",
+      "\n",
+      "xox\n",
+      "oo.\n",
+      "..x Counter({5: 3, 7: 2, 6: 1}) \n",
+      "\n",
+      "xx.\n",
+      ".ox\n",
+      "xoo Counter({3: 1, 2: 0}) \n",
+      "\n",
+      "xoo\n",
+      ".x.\n",
+      ".x. Counter({8: 5, 3: 0, 5: 0, 6: 0}) \n",
+      "\n",
+      "xx.\n",
+      ".oo\n",
+      "..x Counter({3: 5, 2: 4, 6: 3, 7: 3}) \n",
+      "\n",
+      "xoo\n",
+      "ox.\n",
+      ".x. Counter({6: 5, 8: 4, 5: 3}) \n",
+      "\n",
+      "xxo\n",
+      "...\n",
+      "xo. Counter({8: 3, 3: 3, 5: 3, 4: 2}) \n",
+      "\n",
+      "x.o\n",
+      ".x.\n",
+      "o.. Counter({8: 4, 3: 4, 5: 4, 1: 3, 7: 3}) \n",
+      "\n",
+      "ox.\n",
+      "..x\n",
+      ".o. Counter({4: 4, 8: 3, 2: 3, 3: 3, 6: 3}) \n",
+      "\n",
+      "oo.\n",
+      ".xx\n",
+      "... Counter({6: 6, 2: 4, 3: 4, 8: 3, 7: 2}) \n",
+      "\n",
+      "x.x\n",
+      "...\n",
+      "o.. Counter({8: 1, 1: 0, 3: 0, 4: 0, 5: 0, 7: 0}) \n",
+      "\n",
+      ".x.\n",
+      "o..\n",
+      "... Counter({4: 6, 2: 5, 0: 4, 8: 4, 5: 3, 6: 3, 7: 2}) \n",
+      "\n",
+      "xx.\n",
+      ".o.\n",
+      "ox. Counter({2: 8, 3: 4, 8: 3, 5: 3}) \n",
+      "\n",
+      "xo.\n",
+      ".x.\n",
+      "..o Counter({3: 8, 5: 5, 2: 3, 7: 3, 6: 2}) \n",
+      "\n",
+      "o..\n",
+      ".ox\n",
+      ".x. Counter({6: 4, 8: 3, 2: 3, 1: 2, 3: 2}) \n",
+      "\n",
+      "oo.\n",
+      "..x\n",
+      ".x. Counter({8: 5, 3: 3, 6: 3, 2: 2, 4: 2}) \n",
+      "\n",
+      "xo.\n",
+      ".xx\n",
+      "oxo Counter({3: 3, 2: 0}) \n",
+      "\n",
+      "xo.\n",
+      "ox.\n",
+      "... Counter({2: 4, 8: 3, 5: 3, 6: 3, 7: 3}) \n",
+      "\n",
+      "x.o\n",
+      ".xx\n",
+      "oxo Counter({1: 2, 3: 1}) \n",
+      "\n",
+      "xx.\n",
+      "oo.\n",
+      "x.. Counter({2: 4, 8: 3, 5: 3, 7: 2}) \n",
+      "\n",
+      "xo.\n",
+      "..x\n",
+      "x.o Counter({3: 3, 4: 3, 7: 3, 2: 2}) \n",
+      "\n",
+      "xxo\n",
+      ".ox\n",
+      "xo. Counter({3: 3, 8: 0}) \n",
+      "\n",
+      "xxo\n",
+      "o..\n",
+      "x.o Counter({4: 3, 5: 3, 7: 2}) \n",
+      "\n",
+      "xxo\n",
+      "oox\n",
+      "x.. Counter({8: 3, 7: 3}) \n",
+      "\n",
+      "x.o\n",
+      ".x.\n",
+      "..o Counter({5: 11, 1: 0, 3: 0, 6: 0, 7: 0}) \n",
+      "\n",
+      "xx.\n",
+      ".xo\n",
+      "xoo Counter({2: 7, 3: 2}) \n",
+      "\n",
+      "xoo\n",
+      "...\n",
+      "..x Counter({7: 4, 3: 3, 4: 3, 5: 3, 6: 3}) \n",
+      "\n",
+      "xxo\n",
+      ".xx\n",
+      ".oo Counter({6: 11, 3: 3}) \n",
+      "\n",
+      "xox\n",
+      "...\n",
+      "oxo Counter({3: 3, 4: 3, 5: 3}) \n",
+      "\n",
+      "x..\n",
+      "..x\n",
+      "..o Counter({3: 3, 4: 3, 6: 3, 1: 2, 2: 2, 7: 2}) \n",
+      "\n",
+      "xoo\n",
+      "oxx\n",
+      ".xo Counter({6: 3}) \n",
+      "\n",
+      "xxo\n",
+      ".ox\n",
+      "xoo Counter({3: 14}) \n",
+      "\n",
+      "xx.\n",
+      "oo.\n",
+      "..x Counter({2: 5, 5: 5, 7: 3, 6: 2}) \n",
+      "\n",
+      "x.x\n",
+      ".o.\n",
+      ".o. Counter({1: 11, 3: 4, 5: 2, 8: 1, 6: 0}) \n",
+      "\n",
+      "xoo\n",
+      ".x.\n",
+      "xo. Counter({8: 5, 3: 3, 5: 3}) \n",
+      "\n",
+      "xxo\n",
+      ".oo\n",
+      "x.x Counter({3: 5, 7: 1}) \n",
+      "\n",
+      "xx.\n",
+      "o.o\n",
+      "x.o Counter({2: 3, 4: 3, 7: 3}) \n",
+      "\n",
+      "ox.\n",
+      ".ox\n",
+      "ox. Counter({8: 3, 3: 3, 2: 2}) \n",
+      "\n",
+      "xx.\n",
+      ".o.\n",
+      "x.o Counter({3: 4, 5: 1, 7: 1, 2: 0}) \n",
+      "\n",
+      "oxo\n",
+      "x.x\n",
+      ".o. Counter({8: 3, 4: 3, 6: 3}) \n",
+      "\n",
+      "xox\n",
+      "...\n",
+      "... Counter({4: 4, 5: 3, 6: 3, 7: 3, 8: 3, 3: 2}) \n",
+      "\n",
+      "xxo\n",
+      "x..\n",
+      "o.. Counter({8: 5, 4: 3, 5: 3, 7: 3}) \n",
+      "\n",
+      "ox.\n",
+      "..x\n",
+      "ox. Counter({8: 3, 2: 3, 3: 3, 4: 3}) \n",
+      "\n",
+      "xx.\n",
+      "oox\n",
+      "o.. Counter({2: 8, 7: 4, 8: 2}) \n",
+      "\n",
+      "xx.\n",
+      "ox.\n",
+      "o.o Counter({7: 6, 2: 4, 5: 3}) \n",
+      "\n",
+      "x.x\n",
+      ".o.\n",
+      "... Counter({3: 4, 1: 3, 5: 3, 6: 3, 8: 3, 7: 2}) \n",
+      "\n",
+      "oxo\n",
+      "xx.\n",
+      "... Counter({6: 2, 7: 2, 8: 1, 5: 1}) \n",
+      "\n",
+      "xx.\n",
+      "xoo\n",
+      "... Counter({8: 3, 2: 2, 6: 2, 7: 2}) \n",
+      "\n",
+      "xxo\n",
+      "oo.\n",
+      ".x. Counter({5: 3, 6: 2, 8: 1}) \n",
+      "\n",
+      "xx.\n",
+      "..o\n",
+      "oxo Counter({2: 3, 3: 3, 4: 3}) \n",
+      "\n",
+      "xxo\n",
+      ".oo\n",
+      "..x Counter({6: 3, 7: 3, 3: 2}) \n",
+      "\n",
+      "xxo\n",
+      "x..\n",
+      ".oo Counter({5: 4, 4: 3, 6: 3}) \n",
+      "\n",
+      "ox.\n",
+      "..x\n",
+      "o.. Counter({8: 4, 2: 3, 3: 3, 4: 3, 7: 3}) \n",
+      "\n",
+      "x.o\n",
+      "..x\n",
+      "... Counter({8: 5, 4: 4, 6: 4, 1: 3, 3: 3, 7: 3}) \n",
+      "\n",
+      "xx.\n",
+      "..o\n",
+      "x.o Counter({2: 3, 3: 3, 4: 2, 7: 1}) \n",
+      "\n",
+      "xo.\n",
+      ".ox\n",
+      "x.o Counter({3: 6, 7: 4, 2: 2}) \n",
+      "\n",
+      "xo.\n",
+      "..o\n",
+      ".x. Counter({8: 5, 6: 4, 2: 3, 3: 3, 4: 3}) \n",
+      "\n",
+      "xxo\n",
+      "..o\n",
+      "xo. Counter({8: 3, 3: 3, 4: 3}) \n",
+      "\n"
+     ]
+    }
+   ],
+   "source": [
+    "for b in p_floor0:\n",
+    "    if b != 'human?':\n",
+    "        print(show_board(b), p_floor0[b], '\\n')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 236,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "x.o\n",
+      ".ox\n",
+      ".xo Counter({6: 5, 1: 1, 3: 1}) \n",
+      "\n",
+      "oxo\n",
+      "...\n",
+      ".x. Counter({3: 4, 6: 4, 4: 3, 5: 3, 8: 2}) \n",
+      "\n",
+      "xx.\n",
+      "o.x\n",
+      "oox Counter({2: 1, 4: 1}) \n",
+      "\n",
+      "o..\n",
+      ".xx\n",
+      ".o. Counter({8: 782, 3: 743, 6: 690, 2: 282, 1: 15}) \n",
+      "\n",
+      "xo.\n",
+      ".xx\n",
+      "..o Counter({2: 1, 3: 1, 6: 1, 7: 1}) \n",
+      "\n",
+      "xo.\n",
+      "..o\n",
+      "x.. Counter({4: 6878, 3: 5308, 8: 3024, 7: 549, 2: 380}) \n",
+      "\n",
+      "xx.\n",
+      ".ox\n",
+      "oxo Counter({2: 21, 3: 1}) \n",
+      "\n",
+      "xx.\n",
+      "o..\n",
+      "xo. Counter({5: 4, 2: 3, 4: 3, 8: 2}) \n",
+      "\n",
+      "xx.\n",
+      "...\n",
+      "oxo Counter({4: 5, 2: 3, 5: 2, 3: 1}) \n",
+      "\n",
+      "xo.\n",
+      "...\n",
+      "... Counter({6: 35062, 4: 33987, 3: 5003, 8: 2378, 7: 2101, 2: 80, 5: 10}) \n",
+      "\n",
+      "xox\n",
+      "ox.\n",
+      "... Counter({8: 1, 5: 1, 6: 1, 7: 1}) \n",
+      "\n",
+      "xoo\n",
+      ".xx\n",
+      ".xo Counter({3: 3, 6: 1}) \n",
+      "\n",
+      "xx.\n",
+      "...\n",
+      "oox Counter({2: 5, 4: 3, 3: 1, 5: 1}) \n",
+      "\n",
+      "xxo\n",
+      ".ox\n",
+      "... Counter({6: 20, 8: 10, 3: 5, 7: 2}) \n",
+      "\n",
+      "xoo\n",
+      ".xo\n",
+      ".x. Counter({8: 155, 3: 1, 6: 1}) \n",
+      "\n",
+      "xx.\n",
+      "o.x\n",
+      "xoo Counter({2: 3, 4: 2}) \n",
+      "\n",
+      "xo.\n",
+      ".ox\n",
+      ".x. Counter({2: 4, 8: 3, 3: 3, 6: 3}) \n",
+      "\n",
+      "xx.\n",
+      ".ox\n",
+      "oo. Counter({2: 18, 8: 1, 3: 1}) \n",
+      "\n",
+      ".x.\n",
+      "xoo\n",
+      "... Counter({0: 5, 2: 4, 8: 3, 6: 2, 7: 1}) \n",
+      "\n",
+      "ox.\n",
+      "x..\n",
+      "... Counter({2: 4, 8: 4, 4: 3, 5: 3, 6: 3, 7: 3}) \n",
+      "\n",
+      "xx.\n",
+      "oox\n",
+      ".xo Counter({2: 3, 6: 1}) \n",
+      "\n",
+      "o.o\n",
+      ".x.\n",
+      ".x. Counter({1: 201, 3: 2, 8: 1, 5: 1, 6: 1}) \n",
+      "\n",
+      "xxo\n",
+      ".x.\n",
+      "..o Counter({5: 25, 7: 13, 3: 2, 6: 1}) \n",
+      "\n",
+      "xxo\n",
+      "x.x\n",
+      "o.o Counter({7: 10, 4: 6}) \n",
+      "\n",
+      "x.o\n",
+      "..o\n",
+      ".x. Counter({3: 6, 8: 3, 1: 3, 4: 3, 6: 3}) \n",
+      "\n",
+      "xxo\n",
+      "o..\n",
+      "o.x Counter({4: 514, 5: 1, 7: 1}) \n",
+      "\n",
+      "xx.\n",
+      ".xo\n",
+      ".oo Counter({2: 684, 3: 1, 6: 1}) \n",
+      "\n",
+      "ox.\n",
+      ".ox\n",
+      "... Counter({8: 1, 2: 1, 3: 1, 6: 1, 7: 1}) \n",
+      "\n",
+      "xo.\n",
+      ".x.\n",
+      ".o. Counter({3: 5707, 2: 5644, 6: 5475, 5: 4195, 8: 1403}) \n",
+      "\n",
+      "x.o\n",
+      "..x\n",
+      ".o. Counter({4: 5, 6: 5, 8: 3, 1: 2, 3: 2}) \n",
+      "\n",
+      "xox\n",
+      "oxo\n",
+      "ox. Counter({8: 6658}) \n",
+      "\n",
+      "oxo\n",
+      "x..\n",
+      ".xo Counter({5: 4, 4: 3, 6: 3}) \n",
+      "\n",
+      "o..\n",
+      "..x\n",
+      "... Counter({2: 13, 4: 12, 8: 6, 6: 4, 7: 4, 1: 2, 3: 1}) \n",
+      "\n",
+      "xxo\n",
+      "...\n",
+      "..o Counter({3: 1, 4: 1, 5: 1, 6: 1, 7: 1}) \n",
+      "\n",
+      "xx.\n",
+      "o.x\n",
+      "oo. Counter({8: 171, 2: 91, 4: 1}) \n",
+      "\n",
+      "xx.\n",
+      ".oo\n",
+      "... Counter({2: 16, 3: 5, 8: 1, 6: 1, 7: 1}) \n",
+      "\n",
+      "ox.\n",
+      ".x.\n",
+      "..o Counter({7: 4884, 3: 3320, 6: 1451, 2: 1256, 5: 541}) \n",
+      "\n",
+      "xxo\n",
+      "o.x\n",
+      "... Counter({4: 4, 8: 3, 7: 3, 6: 2}) \n",
+      "\n",
+      "oxo\n",
+      "xox\n",
+      "... Counter({8: 3, 6: 2, 7: 2}) \n",
+      "\n",
+      "xo.\n",
+      ".xo\n",
+      ".x. Counter({8: 2, 2: 1, 3: 1, 6: 1}) \n",
+      "\n",
+      "xxo\n",
+      ".x.\n",
+      "xoo Counter({5: 26, 3: 3}) \n",
+      "\n",
+      "x..\n",
+      "..o\n",
+      "... Counter({2: 39728, 4: 26663, 6: 10545, 8: 2834, 3: 218, 7: 4, 1: 2}) \n",
+      "\n",
+      "ox.\n",
+      ".x.\n",
+      "... Counter({2: 1, 3: 1, 5: 1, 6: 1, 7: 1, 8: 1}) \n",
+      "\n",
+      "xxo\n",
+      ".ox\n",
+      "..o Counter({6: 4, 3: 1, 7: 1}) \n",
+      "\n",
+      "xx.\n",
+      "ox.\n",
+      "..o Counter({2: 1, 5: 1, 6: 1, 7: 1}) \n",
+      "\n",
+      "xo.\n",
+      "oxx\n",
+      "..o Counter({2: 85, 6: 63, 7: 3}) \n",
+      "\n",
+      "xx.\n",
+      "oxx\n",
+      "oo. Counter({8: 26, 2: 1}) \n",
+      "\n",
+      "xo.\n",
+      "...\n",
+      ".xo Counter({6: 149, 3: 145, 2: 8, 5: 8, 4: 6}) \n",
+      "\n",
+      "xx.\n",
+      "oox\n",
+      "xoo Counter({2: 1928}) \n",
+      "\n",
+      "xx.\n",
+      ".oo\n",
+      ".xo Counter({2: 5, 3: 2, 6: 1}) \n",
+      "\n",
+      "xo.\n",
+      "oxx\n",
+      "... Counter({8: 1, 2: 1, 6: 1, 7: 1}) \n",
+      "\n",
+      "xx.\n",
+      "o..\n",
+      "ox. Counter({2: 3, 5: 3, 4: 2, 8: 1}) \n",
+      "\n",
+      "xox\n",
+      ".x.\n",
+      "oo. Counter({8: 3677, 3: 1, 5: 1}) \n",
+      "\n",
+      "xxo\n",
+      "o.x\n",
+      "xo. Counter({8: 3, 4: 3}) \n",
+      "\n",
+      "xoo\n",
+      ".xx\n",
+      "... Counter({8: 1, 3: 1, 6: 1, 7: 1}) \n",
+      "\n",
+      "xx.\n",
+      "oo.\n",
+      ".x. Counter({2: 9, 5: 9, 8: 3, 6: 2}) \n",
+      "\n",
+      "xo.\n",
+      "...\n",
+      ".ox Counter({4: 885, 2: 1, 3: 1, 5: 1, 6: 1}) \n",
+      "\n",
+      "xox\n",
+      "o..\n",
+      "o.x Counter({5: 6160, 7: 4587, 4: 1208}) \n",
+      "\n",
+      "xx.\n",
+      ".ox\n",
+      "..o Counter({6: 4, 2: 2, 3: 1, 7: 1}) \n",
+      "\n",
+      "xx.\n",
+      "..o\n",
+      "xoo Counter({3: 218, 2: 121, 4: 2}) \n",
+      "\n",
+      "xx.\n",
+      ".o.\n",
+      ".ox Counter({2: 5, 3: 4, 5: 1, 6: 1}) \n",
+      "\n",
+      "xxo\n",
+      "o..\n",
+      "... Counter({4: 831, 5: 5, 7: 3, 8: 1, 6: 1}) \n",
+      "\n",
+      "xxo\n",
+      "x.x\n",
+      ".oo Counter({6: 6, 4: 1}) \n",
+      "\n",
+      "xoo\n",
+      "oxx\n",
+      ".x. Counter({8: 3, 6: 1}) \n",
+      "\n",
+      "xxo\n",
+      ".ox\n",
+      "x.o Counter({3: 3, 7: 1}) \n",
+      "\n",
+      "xxo\n",
+      "...\n",
+      "ox. Counter({4: 8, 8: 4, 3: 3, 5: 3}) \n",
+      "\n",
+      "x..\n",
+      ".ox\n",
+      "..o Counter({6: 7, 1: 5, 2: 4, 3: 3, 7: 1}) \n",
+      "\n",
+      "xox\n",
+      "ox.\n",
+      "..o Counter({6: 7449, 5: 25, 7: 14}) \n",
+      "\n",
+      "ox.\n",
+      "xx.\n",
+      "..o Counter({2: 1, 5: 1, 6: 1, 7: 1}) \n",
+      "\n",
+      "xxo\n",
+      "ox.\n",
+      "..o Counter({7: 3981, 5: 23, 6: 1}) \n",
+      "\n",
+      "xx.\n",
+      ".o.\n",
+      "oxo Counter({2: 112, 3: 1, 5: 1}) \n",
+      "\n",
+      "xxo\n",
+      "oox\n",
+      ".ox Counter({6: 3}) \n",
+      "\n",
+      ".x.\n",
+      "ox.\n",
+      ".o. Counter({2: 1152, 0: 994, 6: 66, 8: 4, 5: 2}) \n",
+      "\n",
+      "...\n",
+      ".x.\n",
+      "... Counter({0: 1, 1: 1, 2: 1, 3: 1, 5: 1, 6: 1, 7: 1, 8: 1}) \n",
+      "\n",
+      "xxo\n",
+      ".xx\n",
+      "o.o Counter({7: 24, 3: 1}) \n",
+      "\n",
+      "xoo\n",
+      "oxx\n",
+      "... Counter({8: 5111, 6: 14, 7: 6}) \n",
+      "\n",
+      ".x.\n",
+      "...\n",
+      ".o. Counter({6: 10, 4: 8, 8: 8, 3: 4, 5: 2, 0: 1, 2: 1}) \n",
+      "\n",
+      "xx.\n",
+      "o..\n",
+      "xoo Counter({2: 362, 4: 16, 5: 16}) \n",
+      "\n",
+      "xxo\n",
+      "o.x\n",
+      "xoo Counter({4: 3}) \n",
+      "\n",
+      "xo.\n",
+      "...\n",
+      "xo. Counter({3: 6560, 4: 5868, 8: 1, 2: 1, 5: 1}) \n",
+      "\n",
+      ".x.\n",
+      "ox.\n",
+      "... Counter({0: 1, 2: 1, 5: 1, 6: 1, 7: 1, 8: 1}) \n",
+      "\n",
+      "ox.\n",
+      "o..\n",
+      ".x. Counter({8: 4, 4: 4, 6: 4, 5: 2, 2: 1}) \n",
+      "\n",
+      "xxo\n",
+      "oxo\n",
+      "... Counter({7: 2649, 8: 1030, 6: 1}) \n",
+      "\n",
+      "xxo\n",
+      ".xo\n",
+      ".o. Counter({8: 682, 3: 1, 6: 1}) \n",
+      "\n",
+      "xxo\n",
+      "..x\n",
+      "o.. Counter({7: 6, 8: 5, 3: 4, 4: 4}) \n",
+      "\n",
+      "xxo\n",
+      ".oo\n",
+      ".xx Counter({3: 13, 6: 5}) \n",
+      "\n",
+      "xx.\n",
+      "oxo\n",
+      "... Counter({8: 1, 2: 1, 6: 1, 7: 1}) \n",
+      "\n",
+      "xxo\n",
+      "xxo\n",
+      "oo. Counter({8: 12}) \n",
+      "\n",
+      "xx.\n",
+      "xoo\n",
+      "..o Counter({6: 9, 2: 6, 7: 1}) \n",
+      "\n",
+      "xox\n",
+      "o..\n",
+      ".ox Counter({4: 1511, 5: 1137, 6: 1}) \n",
+      "\n",
+      "xoo\n",
+      ".x.\n",
+      "... Counter({8: 10740, 5: 4145, 6: 1144, 3: 991, 7: 163}) \n",
+      "\n",
+      "xx.\n",
+      "o..\n",
+      "... Counter({2: 1, 4: 1, 5: 1, 6: 1, 7: 1, 8: 1}) \n",
+      "\n",
+      "x..\n",
+      "..x\n",
+      ".o. Counter({6: 7, 4: 6, 1: 3, 2: 3, 8: 3, 3: 2}) \n",
+      "\n",
+      "xxo\n",
+      ".x.\n",
+      ".oo Counter({3: 1, 5: 1, 6: 1}) \n",
+      "\n",
+      "xo.\n",
+      "..x\n",
+      ".o. Counter({4: 6, 8: 4, 3: 4, 6: 4, 2: 2}) \n",
+      "\n",
+      "xo.\n",
+      "o.x\n",
+      ".xo Counter({2: 3, 4: 3, 6: 3}) \n",
+      "\n",
+      "xxo\n",
+      "oox\n",
+      "xox Counter() \n",
+      "\n",
+      "xxo\n",
+      ".o.\n",
+      "x.. Counter({3: 25, 8: 1, 5: 1, 7: 1}) \n",
+      "\n",
+      "xx.\n",
+      ".o.\n",
+      "xo. Counter({8: 1, 2: 1, 3: 1, 5: 1}) \n",
+      "\n",
+      "xxo\n",
+      "ox.\n",
+      "xoo Counter({5: 3}) \n",
+      "\n",
+      "xo.\n",
+      "..o\n",
+      "..x Counter({4: 480, 7: 347, 6: 99, 3: 17, 2: 1}) \n",
+      "\n",
+      "xxo\n",
+      "..o\n",
+      "xox Counter({3: 1, 4: 1}) \n",
+      "\n",
+      "x.o\n",
+      "...\n",
+      "..x Counter({6: 2, 1: 1, 3: 1, 4: 1, 5: 1, 7: 1}) \n",
+      "\n",
+      "x.o\n",
+      ".o.\n",
+      "..x Counter({6: 5637, 1: 1, 3: 1, 5: 1, 7: 1}) \n",
+      "\n",
+      "x.x\n",
+      ".o.\n",
+      "o.. Counter({1: 17772, 8: 3779, 7: 715, 5: 546, 3: 1}) \n",
+      "\n",
+      "xx.\n",
+      ".x.\n",
+      "o.o Counter({7: 37, 2: 1, 3: 1, 5: 1}) \n",
+      "\n",
+      "xox\n",
+      ".x.\n",
+      "o.o Counter({7: 3, 3: 1, 5: 1}) \n",
+      "\n",
+      "x.o\n",
+      "..x\n",
+      ".xo Counter({4: 3, 3: 2, 1: 1, 6: 1}) \n",
+      "\n",
+      "x.o\n",
+      ".x.\n",
+      ".o. Counter({8: 7584, 6: 4297, 3: 2587, 5: 2022, 1: 1}) \n",
+      "\n",
+      "xoo\n",
+      "oxx\n",
+      "ox. Counter({8: 2016}) \n",
+      "\n",
+      "xxo\n",
+      ".o.\n",
+      "xo. Counter({3: 566, 5: 24, 8: 12}) \n",
+      "\n",
+      "xxo\n",
+      "oxx\n",
+      "..o Counter({7: 3, 6: 1}) \n",
+      "\n",
+      "xxo\n",
+      "...\n",
+      "xoo Counter({3: 208, 5: 13, 4: 1}) \n",
+      "\n",
+      "x.x\n",
+      ".o.\n",
+      "ox. Counter({8: 1, 1: 1, 3: 1, 5: 1}) \n",
+      "\n",
+      "ox.\n",
+      "xox\n",
+      ".o. Counter({8: 3, 2: 3, 6: 1}) \n",
+      "\n",
+      "x..\n",
+      ".ox\n",
+      ".o. Counter({1: 14, 8: 1, 2: 1, 3: 1, 6: 1}) \n",
+      "\n",
+      "xxo\n",
+      "oxx\n",
+      "oo. Counter({8: 2269}) \n",
+      "\n",
+      "xo.\n",
+      "...\n",
+      ".x. Counter({4: 4, 6: 4, 2: 2, 3: 2, 5: 2, 8: 2}) \n",
+      "\n",
+      "xxo\n",
+      ".o.\n",
+      ".xo Counter({3: 1, 5: 1, 6: 1}) \n",
+      "\n",
+      "xxo\n",
+      "...\n",
+      ".xo Counter({6: 6, 5: 5, 4: 3, 3: 2}) \n",
+      "\n",
+      "xxo\n",
+      "oxx\n",
+      ".o. Counter({8: 3, 6: 1}) \n",
+      "\n",
+      "xox\n",
+      ".x.\n",
+      ".o. Counter({8: 1, 3: 1, 5: 1, 6: 1}) \n",
+      "\n",
+      "xx.\n",
+      ".oo\n",
+      "x.o Counter({3: 103, 2: 53, 7: 1}) \n",
+      "\n",
+      "xxo\n",
+      "oo.\n",
+      "xx. Counter({5: 28, 8: 3}) \n",
+      "\n",
+      "xxo\n",
+      "oox\n",
+      "xo. Counter({8: 3}) \n",
+      "\n",
+      "o..\n",
+      ".x.\n",
+      "... Counter({3: 43485, 1: 19956, 6: 17169, 8: 835, 7: 661, 5: 585, 2: 287}) \n",
+      "\n",
+      "x..\n",
+      "..x\n",
+      ".oo Counter({6: 15, 1: 4, 3: 2, 2: 1, 4: 1}) \n",
+      "\n",
+      "xx.\n",
+      ".o.\n",
+      "... Counter({2: 60, 3: 5, 5: 1, 6: 1, 7: 1, 8: 1}) \n",
+      "\n",
+      "xo.\n",
+      "...\n",
+      "x.o Counter({3: 11464, 2: 5727, 4: 4588, 5: 475, 7: 191}) \n",
+      "\n",
+      "xxo\n",
+      "oox\n",
+      ".x. Counter({6: 8, 8: 3}) \n",
+      "\n",
+      "xox\n",
+      "oo.\n",
+      ".x. Counter({5: 876, 8: 1, 6: 1}) \n",
+      "\n",
+      "xoo\n",
+      ".xx\n",
+      "..o Counter({3: 5701, 6: 16, 7: 16}) \n",
+      "\n",
+      "x..\n",
+      ".ox\n",
+      ".xo Counter({2: 4, 1: 3, 6: 3, 3: 2}) \n",
+      "\n",
+      ".x.\n",
+      "o..\n",
+      ".x. Counter({2: 3, 6: 3, 8: 3, 4: 2, 5: 2, 0: 1}) \n",
+      "\n",
+      "xoo\n",
+      "o.x\n",
+      ".x. Counter({4: 8, 6: 4, 8: 3}) \n",
+      "\n",
+      "xxo\n",
+      "x..\n",
+      ".o. Counter({8: 4, 6: 4, 4: 2, 5: 1}) \n",
+      "\n",
+      "xx.\n",
+      "oox\n",
+      "oxo Counter({2: 92}) \n",
+      "\n",
+      "xo.\n",
+      ".x.\n",
+      "x.o Counter({2: 1, 3: 1, 5: 1, 7: 1}) \n",
+      "\n",
+      "x..\n",
+      "...\n",
+      "..o Counter({6: 26002, 2: 13368, 4: 460, 7: 6, 1: 1, 3: 1, 5: 1}) \n",
+      "\n",
+      "xxo\n",
+      "oo.\n",
+      "x.. Counter({5: 3, 8: 1, 7: 1}) \n",
+      "\n",
+      "xxo\n",
+      "x.o\n",
+      "o.. Counter({8: 1, 4: 1, 7: 1}) \n",
+      "\n",
+      "xx.\n",
+      "o.x\n",
+      ".oo Counter({2: 57, 6: 14, 4: 1}) \n",
+      "\n",
+      "xo.\n",
+      ".oo\n",
+      "x.x Counter({3: 629, 7: 131, 2: 1}) \n",
+      "\n",
+      "xxo\n",
+      ".x.\n",
+      "o.. Counter({8: 1, 3: 1, 5: 1, 7: 1}) \n",
+      "\n",
+      "xox\n",
+      "o..\n",
+      ".x. Counter({8: 3, 4: 3, 6: 3, 5: 2}) \n",
+      "\n",
+      "xxo\n",
+      "...\n",
+      "oox Counter({4: 798, 3: 1, 5: 1}) \n",
+      "\n",
+      "oxo\n",
+      "xx.\n",
+      "o.. Counter({8: 535, 7: 533, 5: 147}) \n",
+      "\n",
+      "xo.\n",
+      ".x.\n",
+      "o.. Counter({8: 13197, 3: 2604, 5: 1164, 7: 150, 2: 1}) \n",
+      "\n",
+      "xoo\n",
+      "..o\n",
+      "x.x Counter({3: 3036, 7: 2438, 4: 1397}) \n",
+      "\n",
+      "x.x\n",
+      ".o.\n",
+      "x.o Counter({7: 2, 1: 1, 3: 1, 5: 1}) \n",
+      "\n",
+      "xo.\n",
+      ".xo\n",
+      "xo. Counter({3: 4776, 2: 1933, 8: 771}) \n",
+      "\n",
+      "xxo\n",
+      "oox\n",
+      "x.o Counter({7: 3}) \n",
+      "\n",
+      "xxo\n",
+      "o..\n",
+      "x.. Counter({5: 5, 4: 4, 8: 3, 7: 3}) \n",
+      "\n",
+      "xxo\n",
+      "..o\n",
+      "o.x Counter({4: 471, 3: 1, 7: 1}) \n",
+      "\n",
+      "xx.\n",
+      "oxo\n",
+      ".o. Counter({2: 1600, 8: 816, 6: 624}) \n",
+      "\n",
+      "xx.\n",
+      "ox.\n",
+      ".o. Counter({8: 1, 2: 1, 5: 1, 6: 1}) \n",
+      "\n",
+      "oxo\n",
+      "x.x\n",
+      "o.. Counter({4: 5, 8: 3, 7: 3}) \n",
+      "\n",
+      "xx.\n",
+      "o.o\n",
+      "..x Counter({4: 9, 2: 3, 7: 3, 6: 2}) \n",
+      "\n",
+      "xxo\n",
+      "x.o\n",
+      ".ox Counter({4: 1, 6: 1}) \n",
+      "\n",
+      "xo.\n",
+      "..x\n",
+      "oxo Counter({3: 4, 4: 4, 2: 3}) \n",
+      "\n",
+      "xxo\n",
+      "o.o\n",
+      ".xx Counter({4: 7, 6: 1}) \n",
+      "\n",
+      "xo.\n",
+      ".o.\n",
+      "x.. Counter({3: 23572, 7: 2006, 8: 2, 2: 1, 5: 1}) \n",
+      "\n",
+      "xxo\n",
+      "ox.\n",
+      "... Counter({8: 1, 5: 1, 6: 1, 7: 1}) \n",
+      "\n",
+      "xxo\n",
+      "o.o\n",
+      "x.x Counter({4: 15, 7: 1}) \n",
+      "\n",
+      "x.x\n",
+      "...\n",
+      "oxo Counter({1: 3, 5: 3, 3: 2, 4: 2}) \n",
+      "\n",
+      "xx.\n",
+      "oox\n",
+      "x.o Counter({2: 3, 7: 1}) \n",
+      "\n",
+      "xoo\n",
+      ".ox\n",
+      "x.. Counter({7: 823, 3: 258, 8: 1}) \n",
+      "\n",
+      "xxo\n",
+      "o.x\n",
+      ".xo Counter({4: 3, 6: 1}) \n",
+      "\n",
+      "xxo\n",
+      "..x\n",
+      "o.o Counter({3: 1, 4: 1, 7: 1}) \n",
+      "\n",
+      "ox.\n",
+      "...\n",
+      ".xo Counter({2: 3, 3: 3, 4: 3, 6: 3, 5: 2}) \n",
+      "\n",
+      "xxo\n",
+      "o.x\n",
+      "x.o Counter({4: 3, 7: 3}) \n",
+      "\n",
+      "xxo\n",
+      "oox\n",
+      ".xo Counter({6: 3}) \n",
+      "\n",
+      "xx.\n",
+      ".xo\n",
+      ".o. Counter({8: 1, 2: 1, 3: 1, 6: 1}) \n",
+      "\n",
+      "xxo\n",
+      "o.o\n",
+      "xox Counter({4: 2983}) \n",
+      "\n",
+      "xx.\n",
+      ".o.\n",
+      ".o. Counter({8: 19, 2: 18, 6: 17, 5: 7, 3: 4}) \n",
+      "\n",
+      "xx.\n",
+      "oo.\n",
+      ".xo Counter({2: 36, 5: 7, 6: 1}) \n",
+      "\n",
+      "xx.\n",
+      "oxo\n",
+      "xo. Counter({8: 1, 2: 1}) \n",
+      "\n",
+      "ox.\n",
+      "ox.\n",
+      "... Counter({6: 8237, 7: 5058, 8: 1, 2: 1, 5: 1}) \n",
+      "\n",
+      "xxo\n",
+      "o.x\n",
+      "o.x Counter({4: 10, 7: 1}) \n",
+      "\n",
+      "xx.\n",
+      "oxx\n",
+      "o.o Counter({7: 33, 2: 1}) \n",
+      "\n",
+      "xx.\n",
+      "oo.\n",
+      "... Counter({2: 824, 5: 2, 8: 1, 6: 1, 7: 1}) \n",
+      "\n",
+      "x.o\n",
+      ".o.\n",
+      ".x. Counter({6: 20, 8: 2, 3: 2, 5: 2, 1: 1}) \n",
+      "\n",
+      "xx.\n",
+      ".oo\n",
+      "o.x Counter({2: 420, 3: 1, 7: 1}) \n",
+      "\n",
+      "ox.\n",
+      "xo.\n",
+      "... Counter({8: 3, 2: 3, 5: 3, 6: 2, 7: 2}) \n",
+      "\n",
+      ".x.\n",
+      "x.o\n",
+      "... Counter({2: 3, 6: 3, 0: 2, 7: 2, 8: 2, 4: 1}) \n",
+      "\n",
+      "xxo\n",
+      "...\n",
+      "o.x Counter({4: 10, 7: 4, 5: 3, 3: 2}) \n",
+      "\n",
+      ".x.\n",
+      "...\n",
+      "... Counter({4: 68, 7: 2, 0: 1, 2: 1, 3: 1, 5: 1, 6: 1, 8: 1}) \n",
+      "\n",
+      "ox.\n",
+      ".xx\n",
+      "o.o Counter({7: 97, 3: 51, 2: 1}) \n",
+      "\n",
+      "x.o\n",
+      ".xx\n",
+      "o.. Counter({8: 1, 1: 1, 3: 1, 7: 1}) \n",
+      "\n",
+      "xxo\n",
+      "xoo\n",
+      "... Counter({6: 12, 8: 2, 7: 1}) \n",
+      "\n",
+      "xox\n",
+      "...\n",
+      ".o. Counter({4: 1736, 8: 1, 3: 1, 5: 1, 6: 1}) \n",
+      "\n",
+      "xo.\n",
+      ".xo\n",
+      ".xo Counter({2: 29, 3: 1, 6: 1}) \n",
+      "\n",
+      "xx.\n",
+      "xoo\n",
+      ".ox Counter({2: 1, 6: 1}) \n",
+      "\n",
+      "xx.\n",
+      "o.o\n",
+      "xox Counter({4: 9, 2: 2}) \n",
+      "\n",
+      ".x.\n",
+      "xox\n",
+      ".o. Counter({8: 4, 0: 3, 2: 3, 6: 3}) \n",
+      "\n",
+      "x..\n",
+      ".o.\n",
+      "... Counter({6: 19773, 2: 14042, 8: 1025, 7: 2, 1: 1, 3: 1, 5: 1}) \n",
+      "\n",
+      "x.o\n",
+      ".ox\n",
+      ".x. Counter({8: 11, 6: 10, 1: 2, 3: 2}) \n",
+      "\n",
+      "xxo\n",
+      "o.x\n",
+      "oxo Counter({4: 109}) \n",
+      "\n",
+      "xxo\n",
+      "..x\n",
+      "..o Counter({7: 4, 3: 3, 6: 3, 4: 2}) \n",
+      "\n",
+      "xoo\n",
+      ".xx\n",
+      ".o. Counter({3: 2419, 6: 2065, 8: 1230}) \n",
+      "\n",
+      "xox\n",
+      "...\n",
+      "o.. Counter({8: 10031, 7: 8, 5: 4, 3: 1, 4: 1}) \n",
+      "\n",
+      "xx.\n",
+      "oxo\n",
+      "xoo Counter({2: 3761}) \n",
+      "\n",
+      "xo.\n",
+      ".ox\n",
+      "... Counter({7: 10, 8: 1, 2: 1, 3: 1, 6: 1}) \n",
+      "\n",
+      "oxo\n",
+      "xo.\n",
+      ".x. Counter({8: 2, 5: 1, 6: 1}) \n",
+      "\n",
+      "xxo\n",
+      "...\n",
+      "x.o Counter({5: 8, 3: 4, 4: 1, 7: 1}) \n",
+      "\n",
+      "xx.\n",
+      ".x.\n",
+      "oo. Counter({8: 29, 2: 1, 3: 1, 5: 1}) \n",
+      "\n",
+      "ox.\n",
+      "x.x\n",
+      ".oo Counter({6: 4, 4: 3, 2: 2}) \n",
+      "\n",
+      "ox.\n",
+      "oox\n",
+      ".x. Counter({6: 3, 8: 1, 2: 1}) \n",
+      "\n",
+      "xoo\n",
+      "..x\n",
+      "x.. Counter({4: 3, 8: 2, 3: 1, 7: 1}) \n",
+      "\n",
+      "xx.\n",
+      "..x\n",
+      ".oo Counter({6: 5, 2: 3, 3: 3, 4: 2}) \n",
+      "\n",
+      "xxo\n",
+      ".o.\n",
+      ".x. Counter({3: 11, 5: 7, 8: 4, 6: 4}) \n",
+      "\n",
+      "xoo\n",
+      ".ox\n",
+      ".x. Counter({6: 21, 3: 3, 8: 2}) \n",
+      "\n",
+      ".x.\n",
+      "xxo\n",
+      ".o. Counter({8: 5, 6: 5, 0: 3, 2: 3}) \n",
+      "\n",
+      "xx.\n",
+      ".xo\n",
+      "o.o Counter({2: 630, 7: 165, 3: 1}) \n",
+      "\n",
+      "xxo\n",
+      "o.x\n",
+      "oox Counter({4: 506}) \n",
+      "\n",
+      "xx.\n",
+      "oxo\n",
+      "..o Counter({2: 2935, 7: 1121, 6: 1}) \n",
+      "\n",
+      "xxo\n",
+      "xxo\n",
+      ".o. Counter({8: 38, 6: 1}) \n",
+      "\n",
+      "xxo\n",
+      "...\n",
+      ".ox Counter({6: 4, 3: 2, 4: 2, 5: 1}) \n",
+      "\n",
+      "xoo\n",
+      "..x\n",
+      "ox. Counter({4: 11, 8: 1, 3: 1}) \n",
+      "\n",
+      "x.o\n",
+      "...\n",
+      "... Counter({8: 31446, 6: 20173, 4: 15727, 3: 12148, 5: 22, 1: 1, 7: 1}) \n",
+      "\n",
+      "x.o\n",
+      ".xo\n",
+      "... Counter({8: 16607, 1: 1, 3: 1, 6: 1, 7: 1}) \n",
+      "\n",
+      "xox\n",
+      "oxo\n",
+      ".x. Counter({8: 1, 6: 1}) \n",
+      "\n",
+      ".x.\n",
+      "x.o\n",
+      ".o. Counter({0: 4, 6: 4, 8: 3, 2: 3, 4: 3}) \n",
+      "\n",
+      "xx.\n",
+      "xxo\n",
+      ".oo Counter({2: 12, 6: 7}) \n",
+      "\n",
+      "xxo\n",
+      ".oo\n",
+      "x.. Counter({3: 18, 8: 1, 7: 1}) \n",
+      "\n",
+      "xx.\n",
+      "..x\n",
+      "o.o Counter({7: 12, 4: 4, 2: 3, 3: 2}) \n",
+      "\n",
+      "oxo\n",
+      "xox\n",
+      ".x. Counter({8: 7, 6: 4}) \n",
+      "\n",
+      "xoo\n",
+      ".xx\n",
+      "x.o Counter({3: 3, 7: 1}) \n",
+      "\n",
+      "x.o\n",
+      ".xo\n",
+      ".x. Counter({8: 17, 1: 3, 3: 1, 6: 1}) \n",
+      "\n",
+      "oxo\n",
+      "xxo\n",
+      "... Counter({7: 2146, 8: 25, 6: 1}) \n",
+      "\n",
+      "x.o\n",
+      ".xx\n",
+      "oo. Counter({3: 1503, 8: 1075, 1: 1}) \n",
+      "\n",
+      "xo.\n",
+      ".ox\n",
+      "x.. Counter({7: 16, 3: 7, 8: 1, 2: 1}) \n",
+      "\n",
+      "xo.\n",
+      ".ox\n",
+      "ox. Counter({2: 16, 8: 1, 3: 1}) \n",
+      "\n",
+      "xx.\n",
+      "oo.\n",
+      "x.o Counter({2: 135, 5: 6, 7: 1}) \n",
+      "\n",
+      "xx.\n",
+      "o.o\n",
+      "ox. Counter({4: 240, 2: 74, 8: 1}) \n",
+      "\n",
+      "xox\n",
+      "ox.\n",
+      ".o. Counter({5: 5571, 6: 5109, 8: 2230}) \n",
+      "\n",
+      "xo.\n",
+      ".x.\n",
+      "xo. Counter({8: 1, 2: 1, 3: 1, 5: 1}) \n",
+      "\n",
+      "xx.\n",
+      "..o\n",
+      "... Counter({2: 4, 3: 4, 4: 1, 6: 1, 7: 1, 8: 1}) \n",
+      "\n",
+      "x..\n",
+      "...\n",
+      "... Counter({4: 2, 1: 1, 2: 1, 3: 1, 5: 1, 6: 1, 7: 1, 8: 1}) \n",
+      "\n",
+      "ox.\n",
+      "oxx\n",
+      ".o. Counter({6: 10, 2: 2, 8: 1}) \n",
+      "\n",
+      "xo.\n",
+      ".x.\n",
+      "oxo Counter({5: 510, 3: 490, 2: 3}) \n",
+      "\n",
+      "x.o\n",
+      ".xx\n",
+      "..o Counter({1: 1, 3: 1, 6: 1, 7: 1}) \n",
+      "\n",
+      "xox\n",
+      "o..\n",
+      "x.. Counter({4: 4, 8: 3, 5: 3, 7: 2}) \n",
+      "\n",
+      "xxo\n",
+      "x..\n",
+      "o.o Counter({4: 3, 5: 2, 7: 1}) \n",
+      "\n",
+      "xxo\n",
+      "..o\n",
+      ".ox Counter({6: 128, 4: 106, 3: 62}) \n",
+      "\n",
+      "xox\n",
+      "o.o\n",
+      "x.. Counter({4: 993, 8: 1, 7: 1}) \n",
+      "\n",
+      "xoo\n",
+      "..x\n",
+      "xo. Counter({3: 552, 4: 495, 8: 1}) \n",
+      "\n",
+      "xxo\n",
+      "o.o\n",
+      "x.. Counter({8: 1, 4: 1, 7: 1}) \n",
+      "\n",
+      "xxo\n",
+      "o.o\n",
+      "..x Counter({4: 10, 6: 3, 7: 3}) \n",
+      "\n",
+      "xx.\n",
+      "xo.\n",
+      "..o Counter({6: 3, 2: 2, 5: 2, 7: 2}) \n",
+      "\n",
+      "xxo\n",
+      "oxx\n",
+      "o.o Counter({7: 2508}) \n",
+      "\n",
+      "xx.\n",
+      "..x\n",
+      "oo. Counter({2: 6, 8: 3, 3: 2, 4: 2}) \n",
+      "\n",
+      "xo.\n",
+      "o..\n",
+      "..x Counter({4: 335, 5: 198, 7: 162, 6: 105, 2: 101}) \n",
+      "\n",
+      "ox.\n",
+      "..o\n",
+      ".x. Counter({3: 4, 4: 4, 2: 3, 6: 3, 8: 2}) \n",
+      "\n",
+      ".x.\n",
+      "oxo\n",
+      "... Counter({8: 914, 2: 800, 6: 275, 7: 199, 0: 186}) \n",
+      "\n",
+      "xo.\n",
+      "..x\n",
+      ".xo Counter({2: 3, 3: 3, 4: 3, 6: 3}) \n",
+      "\n",
+      "xxo\n",
+      "oo.\n",
+      "..x Counter({5: 1, 6: 1, 7: 1}) \n",
+      "\n",
+      "xxo\n",
+      "oo.\n",
+      "xxo Counter({5: 3}) \n",
+      "\n",
+      ".x.\n",
+      ".o.\n",
+      ".x. Counter({3: 13, 5: 6, 2: 4, 6: 4, 0: 3, 8: 3}) \n",
+      "\n",
+      "xxo\n",
+      "oxx\n",
+      "xoo Counter() \n",
+      "\n",
+      "xxo\n",
+      ".ox\n",
+      ".xo Counter({6: 9, 3: 3}) \n",
+      "\n",
+      "xxo\n",
+      ".oo\n",
+      "xox Counter({3: 3572}) \n",
+      "\n",
+      "xoo\n",
+      ".xx\n",
+      "ox. Counter({8: 1, 3: 1}) \n",
+      "\n",
+      "xx.\n",
+      ".ox\n",
+      "o.o Counter({2: 12, 7: 2, 3: 1}) \n",
+      "\n",
+      "xxo\n",
+      "ox.\n",
+      "x.o Counter({5: 45, 7: 3}) \n",
+      "\n",
+      "ox.\n",
+      "xxo\n",
+      "... Counter({8: 1, 2: 1, 6: 1, 7: 1}) \n",
+      "\n",
+      "xx.\n",
+      "...\n",
+      "o.. Counter({4: 3, 2: 2, 5: 2, 3: 1, 7: 1, 8: 1}) \n",
+      "\n",
+      "x.x\n",
+      ".o.\n",
+      "oxo Counter({1: 249, 3: 22, 5: 6}) \n",
+      "\n",
+      "x.x\n",
+      "...\n",
+      "o.o Counter({1: 9546, 7: 178, 4: 2, 5: 2, 3: 1}) \n",
+      "\n",
+      "xxo\n",
+      "o..\n",
+      "..x Counter({4: 5, 5: 3, 6: 2, 7: 2}) \n",
+      "\n",
+      "xox\n",
+      "o..\n",
+      "... Counter({4: 7965, 8: 3298, 5: 857, 7: 41, 6: 4}) \n",
+      "\n",
+      "xoo\n",
+      "..x\n",
+      ".xo Counter({3: 11, 4: 3, 6: 3}) \n",
+      "\n",
+      "xx.\n",
+      "o.o\n",
+      "x.. Counter({4: 7, 2: 5, 8: 3, 7: 3}) \n",
+      "\n",
+      "xox\n",
+      ".x.\n",
+      "o.. Counter({8: 27, 3: 1, 5: 1, 7: 1}) \n",
+      "\n",
+      "xx.\n",
+      "..o\n",
+      ".ox Counter({2: 2, 3: 2, 4: 1, 6: 1}) \n",
+      "\n",
+      "xxo\n",
+      "ox.\n",
+      "o.. Counter({7: 1322, 5: 1177, 8: 1174}) \n",
+      "\n",
+      "xx.\n",
+      "o..\n",
+      "o.. Counter({7: 892, 5: 800, 4: 672, 2: 300, 8: 292}) \n",
+      "\n",
+      "xoo\n",
+      "...\n",
+      ".x. Counter({8: 160, 3: 146, 6: 57, 4: 16, 5: 10}) \n",
+      "\n",
+      ".o.\n",
+      ".x.\n",
+      "... Counter({6: 31672, 2: 24748, 5: 11312, 0: 9496, 8: 6709, 3: 2217, 7: 1}) \n",
+      "\n",
+      "xxo\n",
+      "o.x\n",
+      ".ox Counter({4: 3, 6: 1}) \n",
+      "\n",
+      "x.o\n",
+      ".xx\n",
+      ".o. Counter({8: 1, 1: 1, 3: 1, 6: 1}) \n",
+      "\n",
+      "xox\n",
+      "ox.\n",
+      ".xo Counter({6: 3, 5: 1}) \n",
+      "\n",
+      "xo.\n",
+      "...\n",
+      "ox. Counter({4: 182, 8: 118, 2: 12, 3: 6, 5: 1}) \n",
+      "\n",
+      "xox\n",
+      "o..\n",
+      "ox. Counter({8: 831, 4: 7, 5: 6}) \n",
+      "\n",
+      "oxo\n",
+      "x.o\n",
+      ".x. Counter({8: 4, 4: 3, 6: 3}) \n",
+      "\n",
+      "xo.\n",
+      ".xo\n",
+      "ox. Counter({8: 3032, 2: 43, 3: 11}) \n",
+      "\n",
+      "xx.\n",
+      ".ox\n",
+      "o.. Counter({2: 13, 7: 3, 8: 1, 3: 1}) \n",
+      "\n",
+      "xx.\n",
+      "..o\n",
+      ".o. Counter({6: 17, 8: 16, 4: 12, 3: 9, 2: 8}) \n",
+      "\n",
+      "xx.\n",
+      "oox\n",
+      "ox. Counter({2: 8, 8: 1}) \n",
+      "\n",
+      "x.o\n",
+      ".x.\n",
+      ".xo Counter({5: 22, 1: 2, 3: 1, 6: 1}) \n",
+      "\n",
+      "xox\n",
+      "o..\n",
+      "x.o Counter({4: 4717, 7: 30, 5: 29}) \n",
+      "\n",
+      "ox.\n",
+      ".xx\n",
+      "..o Counter({2: 1, 3: 1, 6: 1, 7: 1}) \n",
+      "\n",
+      "xo.\n",
+      "..x\n",
+      "xo. Counter({4: 5, 8: 2, 2: 2, 3: 2}) \n",
+      "\n",
+      "xxo\n",
+      "o.o\n",
+      ".x. Counter({4: 7, 8: 3, 6: 1}) \n",
+      "\n",
+      "xxo\n",
+      "o..\n",
+      "xo. Counter({4: 82, 8: 22, 5: 3}) \n",
+      "\n",
+      "xxo\n",
+      ".o.\n",
+      "x.o Counter({3: 152, 5: 8, 7: 1}) \n",
+      "\n",
+      "xxo\n",
+      "x..\n",
+      "..o Counter({4: 5, 5: 5, 6: 5, 7: 3}) \n",
+      "\n",
+      "xxo\n",
+      "...\n",
+      ".o. Counter({6: 47, 8: 1, 3: 1, 4: 1, 5: 1}) \n",
+      "\n",
+      "xxo\n",
+      "xox\n",
+      "..o Counter({6: 18, 7: 1}) \n",
+      "\n",
+      "ox.\n",
+      "oxx\n",
+      "... Counter({6: 33, 8: 1, 2: 1, 7: 1}) \n",
+      "\n",
+      "xx.\n",
+      "o..\n",
+      "oox Counter({5: 794, 2: 356, 4: 270}) \n",
+      "\n",
+      "xx.\n",
+      "o.o\n",
+      "o.x Counter({2: 539, 4: 389, 7: 1}) \n",
+      "\n",
+      "xx.\n",
+      ".x.\n",
+      ".oo Counter({6: 18, 2: 13, 3: 3, 5: 1}) \n",
+      "\n",
+      "xoo\n",
+      ".o.\n",
+      "x.x Counter({3: 9400, 7: 1349, 5: 1}) \n",
+      "\n",
+      "xox\n",
+      ".x.\n",
+      "oxo Counter({3: 3, 5: 3}) \n",
+      "\n",
+      "xox\n",
+      ".o.\n",
+      ".x. Counter({8: 1, 3: 1, 5: 1, 6: 1}) \n",
+      "\n",
+      "xoo\n",
+      ".xx\n",
+      "xo. Counter({8: 1, 3: 1}) \n",
+      "\n",
+      "xx.\n",
+      ".o.\n",
+      "o.. Counter({2: 2025, 3: 2, 8: 1, 5: 1, 7: 1}) \n",
+      "\n",
+      "xo.\n",
+      "..x\n",
+      "... Counter({4: 9, 2: 1, 3: 1, 6: 1, 7: 1, 8: 1}) \n",
+      "\n",
+      "xxo\n",
+      ".o.\n",
+      ".ox Counter({6: 152, 3: 1, 5: 1}) \n",
+      "\n",
+      "xox\n",
+      "ox.\n",
+      "oxo Counter({5: 3}) \n",
+      "\n",
+      "xx.\n",
+      "ox.\n",
+      "xoo Counter({2: 3, 5: 1}) \n",
+      "\n",
+      "xxo\n",
+      "..o\n",
+      ".x. Counter({4: 6, 6: 4, 8: 3, 3: 3}) \n",
+      "\n",
+      "ox.\n",
+      ".xo\n",
+      "... Counter({7: 5119, 2: 3898, 6: 3041, 8: 536, 3: 447}) \n",
+      "\n",
+      "xx.\n",
+      "xox\n",
+      ".oo Counter({6: 8, 2: 2}) \n",
+      "\n",
+      "x.o\n",
+      "..x\n",
+      "ox. Counter({4: 5, 1: 4, 8: 3, 3: 3}) \n",
+      "\n",
+      "xx.\n",
+      "oox\n",
+      "o.x Counter({2: 6, 7: 1}) \n",
+      "\n",
+      ".x.\n",
+      "o.o\n",
+      ".x. Counter({0: 3, 8: 3, 2: 3, 4: 3, 6: 3}) \n",
+      "\n",
+      "xxo\n",
+      "...\n",
+      "oxo Counter({4: 99, 3: 1, 5: 1}) \n",
+      "\n",
+      "x.x\n",
+      ".x.\n",
+      "o.o Counter({7: 16, 1: 3, 3: 2, 5: 1}) \n",
+      "\n",
+      "xxo\n",
+      "xo.\n",
+      "... Counter({6: 23, 7: 2, 8: 1, 5: 1}) \n",
+      "\n",
+      "xox\n",
+      "o..\n",
+      ".xo Counter({6: 25, 4: 19, 5: 3}) \n",
+      "\n",
+      ".x.\n",
+      ".x.\n",
+      ".o. Counter({0: 1, 2: 1, 3: 1, 5: 1, 6: 1, 8: 1}) \n",
+      "\n",
+      "xx.\n",
+      "ox.\n",
+      "o.. Counter({8: 1, 2: 1, 5: 1, 7: 1}) \n",
+      "\n",
+      "xx.\n",
+      "..o\n",
+      "xo. Counter({8: 4, 2: 2, 3: 1, 4: 1}) \n",
+      "\n",
+      "xox\n",
+      ".o.\n",
+      "x.o Counter({3: 9713, 7: 19, 5: 1}) \n",
+      "\n",
+      "xo.\n",
+      "..o\n",
+      "x.x Counter({4: 4, 3: 3, 7: 3, 2: 2}) \n",
+      "\n",
+      "oo.\n",
+      ".x.\n",
+      ".x. Counter({2: 178, 8: 1, 3: 1, 5: 1, 6: 1}) \n",
+      "\n",
+      "xo.\n",
+      ".o.\n",
+      ".x. Counter({6: 187, 8: 173, 2: 18, 5: 3, 3: 2}) \n",
+      "\n",
+      "xx.\n",
+      "o.o\n",
+      ".xo Counter({2: 26, 4: 21, 6: 1}) \n",
+      "\n",
+      "xxo\n",
+      "xo.\n",
+      ".xo Counter({5: 12, 6: 6}) \n",
+      "\n",
+      "oxo\n",
+      ".x.\n",
+      "... Counter({7: 5547, 6: 1449, 5: 1380, 3: 1176, 8: 926}) \n",
+      "\n",
+      "xxo\n",
+      "xx.\n",
+      ".oo Counter({5: 21, 6: 17}) \n",
+      "\n",
+      "xo.\n",
+      ".xx\n",
+      ".o. Counter({8: 1, 2: 1, 3: 1, 6: 1}) \n",
+      "\n",
+      "xx.\n",
+      ".oo\n",
+      ".ox Counter({2: 437, 3: 256, 6: 1}) \n",
+      "\n",
+      "xx.\n",
+      ".o.\n",
+      "xoo Counter({2: 613, 5: 180, 3: 73}) \n",
+      "\n",
+      "xo.\n",
+      ".xo\n",
+      "... Counter({6: 9004, 8: 7799, 2: 4862, 3: 812, 7: 112}) \n",
+      "\n",
+      "x..\n",
+      ".xo\n",
+      "... Counter({1: 1, 2: 1, 3: 1, 6: 1, 7: 1, 8: 1}) \n",
+      "\n",
+      "x.o\n",
+      "...\n",
+      "o.x Counter({4: 5301, 1: 1, 3: 1, 5: 1, 7: 1}) \n",
+      "\n",
+      "xx.\n",
+      ".oo\n",
+      ".x. Counter({2: 9, 3: 9, 6: 2, 8: 1}) \n",
+      "\n",
+      "xxo\n",
+      ".ox\n",
+      ".o. Counter({6: 9, 8: 2, 3: 1}) \n",
+      "\n",
+      "xx.\n",
+      "ox.\n",
+      "oo. Counter({8: 795, 2: 465, 5: 1}) \n",
+      "\n",
+      "xx.\n",
+      "...\n",
+      "oo. Counter({8: 1136, 2: 854, 3: 1, 4: 1, 5: 1}) \n",
+      "\n",
+      "xx.\n",
+      "...\n",
+      "..o Counter({2: 13, 5: 5, 7: 2, 3: 1, 4: 1, 6: 1}) \n",
+      "\n",
+      "x.o\n",
+      "...\n",
+      ".x. Counter({8: 5, 3: 3, 1: 1, 4: 1, 5: 1, 6: 1}) \n",
+      "\n",
+      "ox.\n",
+      ".ox\n",
+      ".x. Counter({6: 10, 3: 5, 8: 3, 2: 2}) \n",
+      "\n",
+      "xx.\n",
+      "x.o\n",
+      ".oo Counter({6: 6, 2: 4, 4: 1}) \n",
+      "\n",
+      "...\n",
+      "...\n",
+      "... Counter({4: 169091, 2: 143376, 0: 96169, 8: 51596, 6: 21545, 3: 17, 7: 7, 5: 2, 1: 1}) \n",
+      "\n",
+      "xx.\n",
+      "oxx\n",
+      ".oo Counter({6: 42, 2: 3}) \n",
+      "\n",
+      "xx.\n",
+      "o.x\n",
+      "..o Counter({7: 4, 2: 3, 4: 3, 6: 2}) \n",
+      "\n",
+      "oxo\n",
+      "xx.\n",
+      ".o. Counter({5: 2170, 8: 10, 6: 8}) \n",
+      "\n",
+      "ox.\n",
+      ".xx\n",
+      "o.. Counter({3: 27, 7: 3, 8: 1, 2: 1}) \n",
+      "\n",
+      "xxo\n",
+      "..o\n",
+      "... Counter({7: 2, 8: 1, 3: 1, 4: 1, 6: 1}) \n",
+      "\n",
+      "xox\n",
+      "oo.\n",
+      "x.x Counter({5: 15, 7: 9}) \n",
+      "\n",
+      "xxo\n",
+      "oo.\n",
+      "x.x Counter({5: 27, 7: 3}) \n",
+      "\n",
+      "x..\n",
+      ".xo\n",
+      "..o Counter({2: 11283, 1: 1, 3: 1, 6: 1, 7: 1}) \n",
+      "\n",
+      "ox.\n",
+      ".xx\n",
+      ".o. Counter({8: 1, 2: 1, 3: 1, 6: 1}) \n",
+      "\n",
+      "x..\n",
+      ".o.\n",
+      "..x Counter({7: 16, 1: 6, 5: 3, 2: 1, 3: 1, 6: 1}) \n",
+      "\n",
+      "xx.\n",
+      "o..\n",
+      ".ox Counter({5: 3, 4: 2, 2: 1, 6: 1}) \n",
+      "\n",
+      "x.x\n",
+      ".x.\n",
+      "oo. Counter({8: 26, 1: 2, 3: 1, 5: 1}) \n",
+      "\n",
+      "xo.\n",
+      ".xx\n",
+      ".oo Counter({6: 1058, 3: 743, 2: 1}) \n",
+      "\n",
+      "xx.\n",
+      "...\n",
+      ".o. Counter({6: 4, 8: 4, 2: 3, 3: 1, 4: 1, 5: 1}) \n",
+      "\n",
+      "xxo\n",
+      "...\n",
+      "o.. Counter({4: 2135, 8: 1, 3: 1, 5: 1, 7: 1}) \n",
+      "\n",
+      "xox\n",
+      "o.o\n",
+      "xox Counter({4: 5}) \n",
+      "\n",
+      "ox.\n",
+      ".x.\n",
+      ".o. Counter({6: 5744, 3: 3058, 5: 5, 8: 4, 2: 1}) \n",
+      "\n",
+      "xo.\n",
+      "oox\n",
+      ".x. Counter({8: 5, 2: 5, 6: 5}) \n",
+      "\n",
+      "ox.\n",
+      "...\n",
+      "... Counter({4: 17, 8: 9, 6: 5, 2: 3, 3: 3, 7: 3, 5: 2}) \n",
+      "\n",
+      "xox\n",
+      ".o.\n",
+      "x.. Counter({3: 35, 7: 16, 5: 3, 8: 1}) \n",
+      "\n",
+      "xo.\n",
+      ".ox\n",
+      ".xo Counter({3: 6, 6: 5, 2: 3}) \n",
+      "\n",
+      "xx.\n",
+      "..o\n",
+      "ox. Counter({2: 3, 8: 2, 3: 2, 4: 2}) \n",
+      "\n",
+      "xo.\n",
+      "o.x\n",
+      ".x. Counter({8: 3, 2: 3, 6: 3, 4: 2}) \n",
+      "\n",
+      "xx.\n",
+      "oox\n",
+      "..o Counter({2: 56, 7: 7, 6: 5}) \n",
+      "\n",
+      "xx.\n",
+      "o..\n",
+      "o.x Counter({2: 3, 4: 1, 5: 1, 7: 1}) \n",
+      "\n",
+      "x.o\n",
+      ".ox\n",
+      "... Counter({6: 27, 1: 2, 8: 1, 3: 1, 7: 1}) \n",
+      "\n",
+      "xxo\n",
+      "o.x\n",
+      ".o. Counter({4: 9, 8: 4, 6: 3}) \n",
+      "\n",
+      "xxo\n",
+      "o..\n",
+      "ox. Counter({4: 238, 8: 1, 5: 1}) \n",
+      "\n",
+      "x..\n",
+      ".xo\n",
+      ".o. Counter({8: 6289, 6: 2415, 1: 1008, 3: 567, 2: 473}) \n",
+      "\n",
+      "xx.\n",
+      "o..\n",
+      ".o. Counter({8: 301, 4: 281, 2: 216, 6: 63, 5: 20}) \n",
+      "\n",
+      "x.o\n",
+      "...\n",
+      ".xo Counter({5: 2, 1: 1, 3: 1, 4: 1, 6: 1}) \n",
+      "\n",
+      "xo.\n",
+      ".xx\n",
+      "oo. Counter({3: 1374, 8: 458, 2: 1}) \n",
+      "\n",
+      "xx.\n",
+      "o.x\n",
+      "oxo Counter({4: 2, 2: 1}) \n",
+      "\n",
+      "x.o\n",
+      ".xx\n",
+      ".oo Counter({3: 3607, 6: 13, 1: 1}) \n",
+      "\n",
+      "xx.\n",
+      "...\n",
+      ".oo Counter({2: 33, 6: 12, 3: 1, 4: 1, 5: 1}) \n",
+      "\n",
+      "xx.\n",
+      "o..\n",
+      "oxo Counter({4: 191, 2: 161, 5: 50}) \n",
+      "\n",
+      "xx.\n",
+      "oox\n",
+      ".o. Counter({2: 16, 6: 4, 8: 3}) \n",
+      "\n",
+      "oxo\n",
+      "x.x\n",
+      "oxo Counter({4: 4}) \n",
+      "\n",
+      "xox\n",
+      "ox.\n",
+      "o.. Counter({8: 8065, 5: 31, 7: 19}) \n",
+      "\n",
+      "xxo\n",
+      "x.o\n",
+      "... Counter({6: 5, 8: 4, 4: 2, 7: 1}) \n",
+      "\n",
+      "xxo\n",
+      ".o.\n",
+      "... Counter({6: 4, 8: 1, 3: 1, 5: 1, 7: 1}) \n",
+      "\n",
+      "xx.\n",
+      ".oo\n",
+      "xox Counter({3: 20, 2: 1}) \n",
+      "\n",
+      "xx.\n",
+      ".o.\n",
+      "..o Counter({2: 11, 6: 4, 7: 4, 5: 3, 3: 2}) \n",
+      "\n",
+      "xx.\n",
+      "o..\n",
+      ".xo Counter({4: 2, 2: 1, 5: 1, 6: 1}) \n",
+      "\n",
+      "xxo\n",
+      "xxo\n",
+      "o.. Counter({8: 36, 7: 1}) \n",
+      "\n",
+      "oxo\n",
+      "x.x\n",
+      "... Counter({8: 3, 4: 3, 6: 3, 7: 3}) \n",
+      "\n",
+      "xx.\n",
+      "o.x\n",
+      "o.o Counter({2: 209, 7: 104, 4: 1}) \n",
+      "\n",
+      "xo.\n",
+      "..x\n",
+      "o.. Counter({8: 6, 7: 5, 2: 4, 4: 4, 3: 2}) \n",
+      "\n",
+      "xox\n",
+      "oo.\n",
+      "x.. Counter({8: 1, 5: 1, 7: 1}) \n",
+      "\n",
+      "xxo\n",
+      "..o\n",
+      "x.. Counter({3: 9, 8: 5, 4: 1, 7: 1}) \n",
+      "\n",
+      "xx.\n",
+      ".o.\n",
+      "oox Counter({2: 1149, 3: 1, 5: 1}) \n",
+      "\n",
+      "xx.\n",
+      "..o\n",
+      ".xo Counter({2: 4, 3: 3, 4: 3, 6: 3}) \n",
+      "\n",
+      "xoo\n",
+      ".x.\n",
+      "ox. Counter({3: 1421, 8: 960, 5: 941}) \n",
+      "\n",
+      "o..\n",
+      "..x\n",
+      ".x. Counter({4: 7, 6: 7, 2: 3, 3: 3, 1: 2, 8: 2}) \n",
+      "\n",
+      "xxo\n",
+      ".o.\n",
+      "xox Counter({3: 3, 5: 1}) \n",
+      "\n",
+      "xx.\n",
+      "oxo\n",
+      "x.o Counter({2: 32, 7: 1}) \n",
+      "\n",
+      "xx.\n",
+      "oox\n",
+      "... Counter({2: 6, 7: 2, 8: 1, 6: 1}) \n",
+      "\n",
+      "xo.\n",
+      ".x.\n",
+      ".xo Counter({2: 1, 3: 1, 5: 1, 6: 1}) \n",
+      "\n",
+      "xox\n",
+      "...\n",
+      "x.o Counter({3: 1, 4: 1, 5: 1, 7: 1}) \n",
+      "\n",
+      "xxo\n",
+      "oox\n",
+      "... Counter({6: 3, 8: 1, 7: 1}) \n",
+      "\n",
+      "xo.\n",
+      ".o.\n",
+      "..x Counter({7: 1359, 2: 1, 3: 1, 5: 1, 6: 1}) \n",
+      "\n",
+      "xx.\n",
+      ".oo\n",
+      "x.. Counter({3: 7, 7: 5, 8: 4, 2: 1}) \n",
+      "\n",
+      "xxo\n",
+      "xx.\n",
+      "o.o Counter({7: 20, 5: 4}) \n",
+      "\n",
+      "xxo\n",
+      "o.x\n",
+      "..o Counter({7: 17, 4: 12, 6: 3}) \n",
+      "\n",
+      "xoo\n",
+      "..x\n",
+      ".x. Counter({8: 3, 3: 3, 6: 3, 4: 1}) \n",
+      "\n",
+      "xxo\n",
+      ".oo\n",
+      ".x. Counter({8: 1, 3: 1, 6: 1}) \n",
+      "\n",
+      "ox.\n",
+      "...\n",
+      "ox. Counter({3: 4, 8: 3, 2: 3, 4: 3, 5: 3}) \n",
+      "\n",
+      "ox.\n",
+      "..x\n",
+      "... Counter({6: 8, 3: 4, 4: 4, 7: 2, 8: 2, 2: 1}) \n",
+      "\n",
+      "xox\n",
+      "oxo\n",
+      "... Counter({6: 3277, 8: 3078, 7: 992}) \n",
+      "\n",
+      "xox\n",
+      "ox.\n",
+      "ox. Counter({8: 3, 5: 1}) \n",
+      "\n",
+      "xx.\n",
+      ".o.\n",
+      "o.x Counter({2: 14, 3: 3, 5: 2, 7: 1}) \n",
+      "\n",
+      "ox.\n",
+      "xxo\n",
+      "..o Counter({7: 1687, 2: 1093, 6: 1}) \n",
+      "\n",
+      "xx.\n",
+      "...\n",
+      "o.o Counter({2: 1659, 7: 387, 3: 1, 4: 1, 5: 1}) \n",
+      "\n",
+      "xxo\n",
+      "x.o\n",
+      "o.x Counter({4: 10, 7: 2}) \n",
+      "\n",
+      "xo.\n",
+      ".x.\n",
+      "... Counter({2: 1, 3: 1, 5: 1, 6: 1, 7: 1, 8: 1}) \n",
+      "\n",
+      "xoo\n",
+      ".xx\n",
+      "oxo Counter({3: 5454}) \n",
+      "\n",
+      "xxo\n",
+      "xoo\n",
+      ".x. Counter({6: 8, 8: 3}) \n",
+      "\n",
+      "xo.\n",
+      "..x\n",
+      "..o Counter({3: 12, 6: 5, 4: 4, 7: 3, 2: 1}) \n",
+      "\n",
+      "xx.\n",
+      "oox\n",
+      ".ox Counter({2: 3, 6: 3}) \n",
+      "\n",
+      "xxo\n",
+      "ox.\n",
+      ".o. Counter({8: 2248, 6: 40, 5: 15}) \n",
+      "\n",
+      "oo.\n",
+      "oxx\n",
+      ".x. Counter({8: 1, 2: 1, 6: 1}) \n",
+      "\n",
+      "xxo\n",
+      "o.o\n",
+      "xx. Counter({8: 10, 4: 3}) \n",
+      "\n",
+      "x..\n",
+      ".xx\n",
+      ".oo Counter({6: 22, 3: 3, 1: 1, 2: 1}) \n",
+      "\n",
+      "xxo\n",
+      "xo.\n",
+      ".o. Counter({6: 4, 5: 3, 8: 2}) \n",
+      "\n",
+      "x.o\n",
+      ".x.\n",
+      "... Counter({1: 1, 3: 1, 5: 1, 6: 1, 7: 1, 8: 1}) \n",
+      "\n",
+      "xox\n",
+      "o..\n",
+      "..x Counter({7: 5, 4: 4, 5: 4, 6: 1}) \n",
+      "\n",
+      "xxo\n",
+      "xoo\n",
+      ".ox Counter({6: 573}) \n",
+      "\n",
+      "xxo\n",
+      ".o.\n",
+      "..x Counter({3: 14, 6: 12, 5: 11, 7: 6}) \n",
+      "\n",
+      "xo.\n",
+      "..x\n",
+      "ox. Counter({4: 4, 2: 3, 8: 2, 3: 2}) \n",
+      "\n",
+      "xxo\n",
+      "ox.\n",
+      "xo. Counter({8: 3, 5: 1}) \n",
+      "\n",
+      "xoo\n",
+      "..x\n",
+      "x.o Counter({3: 1052, 4: 14, 7: 8}) \n",
+      "\n",
+      "ox.\n",
+      "xox\n",
+      "... Counter({6: 10, 8: 7, 2: 6, 7: 4}) \n",
+      "\n",
+      "xo.\n",
+      ".xo\n",
+      "x.o Counter({3: 4267, 2: 3500, 7: 1}) \n",
+      "\n",
+      "xox\n",
+      "o.o\n",
+      "x.x Counter({4: 10, 7: 1}) \n",
+      "\n",
+      "xxo\n",
+      ".x.\n",
+      ".o. Counter({8: 21, 5: 2, 3: 1, 6: 1}) \n",
+      "\n",
+      "xoo\n",
+      ".x.\n",
+      "x.o Counter({3: 6781, 5: 16, 7: 1}) \n",
+      "\n",
+      "ox.\n",
+      "x.x\n",
+      ".o. Counter({8: 4, 4: 4, 6: 3, 2: 2}) \n",
+      "\n",
+      "xo.\n",
+      ".x.\n",
+      "ox. Counter({8: 1, 2: 1, 3: 1, 5: 1}) \n",
+      "\n",
+      "xo.\n",
+      "...\n",
+      "o.x Counter({4: 5884, 2: 3915, 5: 1416, 7: 211, 3: 1}) \n",
+      "\n",
+      "xx.\n",
+      ".oo\n",
+      "xo. Counter({2: 583, 3: 226, 8: 1}) \n",
+      "\n",
+      "xx.\n",
+      "o.x\n",
+      "o.. Counter({2: 3, 8: 2, 4: 2, 7: 2}) \n",
+      "\n",
+      "xxo\n",
+      "oxo\n",
+      "x.. Counter({8: 29, 7: 1}) \n",
+      "\n",
+      "xxo\n",
+      "x.x\n",
+      "oo. Counter({4: 8, 8: 5}) \n",
+      "\n",
+      "xxo\n",
+      "o..\n",
+      ".ox Counter({4: 268, 6: 10, 5: 7}) \n",
+      "\n",
+      "oxo\n",
+      "x.x\n",
+      "ox. Counter({4: 5, 8: 3}) \n",
+      "\n",
+      "xx.\n",
+      "oo.\n",
+      ".ox Counter({2: 643, 5: 23, 6: 1}) \n",
+      "\n",
+      "xxo\n",
+      "o..\n",
+      "xox Counter({4: 3, 5: 1}) \n",
+      "\n",
+      "ox.\n",
+      "...\n",
+      ".x. Counter({4: 7, 2: 5, 5: 5, 3: 2, 8: 2, 6: 1}) \n",
+      "\n",
+      "xx.\n",
+      ".xo\n",
+      "..o Counter({2: 29, 3: 1, 6: 1, 7: 1}) \n",
+      "\n",
+      "ox.\n",
+      "oxx\n",
+      "..o Counter({7: 220, 6: 53, 2: 1}) \n",
+      "\n",
+      "xxo\n",
+      ".xo\n",
+      "o.. Counter({8: 1364, 7: 451, 3: 1}) \n",
+      "\n",
+      "xx.\n",
+      "o.o\n",
+      ".ox Counter({2: 268, 4: 108, 6: 1}) \n",
+      "\n",
+      "xo.\n",
+      "...\n",
+      "..x Counter({4: 11, 2: 1, 3: 1, 5: 1, 6: 1, 7: 1}) \n",
+      "\n",
+      "xo.\n",
+      "o.x\n",
+      "... Counter({8: 319, 4: 46, 2: 31, 6: 8, 7: 8}) \n",
+      "\n",
+      "xxo\n",
+      "xoo\n",
+      "..x Counter({6: 13, 7: 1}) \n",
+      "\n",
+      "xxo\n",
+      "..o\n",
+      "..x Counter({4: 7, 3: 3, 6: 3, 7: 2}) \n",
+      "\n",
+      "ox.\n",
+      "x.x\n",
+      "..o Counter({2: 4, 4: 3, 6: 3, 7: 3}) \n",
+      "\n",
+      ".x.\n",
+      "xo.\n",
+      "... Counter({0: 20, 6: 8, 2: 2, 7: 2, 8: 2, 5: 1}) \n",
+      "\n",
+      "ox.\n",
+      ".xx\n",
+      "oo. Counter({3: 17, 2: 2, 8: 1}) \n",
+      "\n",
+      "xxo\n",
+      "xo.\n",
+      ".ox Counter({6: 15, 5: 1}) \n",
+      "\n",
+      "xxo\n",
+      "oxx\n",
+      "o.. Counter({8: 1, 7: 1}) \n",
+      "\n",
+      "x.o\n",
+      "..x\n",
+      "..o Counter({4: 10, 3: 6, 6: 4, 7: 4, 1: 1}) \n",
+      "\n",
+      "xo.\n",
+      "oxx\n",
+      ".xo Counter({2: 3, 6: 3}) \n",
+      "\n",
+      "xxo\n",
+      "o..\n",
+      ".x. Counter({8: 4, 6: 4, 4: 3, 5: 3}) \n",
+      "\n",
+      "xxo\n",
+      ".xo\n",
+      "... Counter({8: 20, 7: 4, 6: 2, 3: 1}) \n",
+      "\n",
+      "xox\n",
+      "o.o\n",
+      ".x. Counter({4: 33, 8: 1, 6: 1}) \n",
+      "\n",
+      "xoo\n",
+      ".x.\n",
+      ".xo Counter({5: 58, 3: 1, 6: 1}) \n",
+      "\n",
+      "xx.\n",
+      ".o.\n",
+      ".xo Counter({2: 5, 3: 3, 5: 3, 6: 2}) \n",
+      "\n",
+      "xox\n",
+      ".o.\n",
+      "ox. Counter({5: 476, 8: 421, 3: 3}) \n",
+      "\n",
+      "x.o\n",
+      "..x\n",
+      "o.. Counter({4: 12, 7: 3, 8: 2, 1: 1, 3: 1}) \n",
+      "\n",
+      "xx.\n",
+      "oo.\n",
+      "xo. Counter({2: 834, 5: 27, 8: 1}) \n",
+      "\n",
+      "xxo\n",
+      ".xo\n",
+      "xo. Counter({8: 31, 3: 1}) \n",
+      "\n",
+      "xx.\n",
+      "ox.\n",
+      ".oo Counter({2: 2648, 6: 39, 5: 1}) \n",
+      "\n",
+      "oxo\n",
+      "xx.\n",
+      "..o Counter({7: 1973, 5: 813, 6: 1}) \n",
+      "\n",
+      "xx.\n",
+      "o.o\n",
+      "... Counter({4: 529, 2: 371, 7: 2, 8: 1, 6: 1}) \n",
+      "\n",
+      "xo.\n",
+      ".xx\n",
+      "o.. Counter({8: 1, 2: 1, 3: 1, 7: 1}) \n",
+      "\n",
+      "xxo\n",
+      ".xx\n",
+      "oo. Counter({8: 27, 3: 1}) \n",
+      "\n",
+      "ox.\n",
+      "x.o\n",
+      "... Counter({8: 5, 4: 5, 7: 2, 2: 1, 6: 1}) \n",
+      "\n",
+      "xx.\n",
+      "oo.\n",
+      "o.x Counter({2: 448, 5: 1, 7: 1}) \n",
+      "\n",
+      "xox\n",
+      "...\n",
+      "xoo Counter({4: 7758, 3: 3191, 5: 1}) \n",
+      "\n",
+      "xx.\n",
+      "o..\n",
+      "..o Counter({2: 481, 4: 152, 7: 127, 5: 52, 6: 6}) \n",
+      "\n",
+      "xxo\n",
+      "..x\n",
+      "oo. Counter({8: 1, 3: 1, 4: 1}) \n",
+      "\n",
+      "xx.\n",
+      ".xo\n",
+      "o.. Counter({8: 1, 2: 1, 3: 1, 7: 1}) \n",
+      "\n",
+      "xx.\n",
+      ".ox\n",
+      ".oo Counter({6: 10, 2: 6, 3: 1}) \n",
+      "\n",
+      "xxo\n",
+      "o.x\n",
+      "ox. Counter({4: 8, 8: 2}) \n",
+      "\n",
+      "xxo\n",
+      ".x.\n",
+      "oo. Counter({8: 1084, 3: 1, 5: 1}) \n",
+      "\n",
+      "ox.\n",
+      ".o.\n",
+      ".x. Counter({8: 1, 2: 1, 3: 1, 5: 1, 6: 1}) \n",
+      "\n",
+      "xx.\n",
+      "oo.\n",
+      "ox. Counter({2: 216, 8: 1, 5: 1}) \n",
+      "\n",
+      "xx.\n",
+      "o..\n",
+      "x.o Counter({2: 4, 5: 3, 7: 3, 4: 2}) \n",
+      "\n",
+      "xoo\n",
+      "..x\n",
+      "... Counter({3: 14, 6: 5, 4: 3, 8: 1, 7: 1}) \n",
+      "\n",
+      "xxo\n",
+      "...\n",
+      "... Counter({6: 7, 8: 5, 4: 3, 5: 3, 7: 3, 3: 2}) \n",
+      "\n",
+      "xx.\n",
+      "oox\n",
+      "oox Counter({2: 488}) \n",
+      "\n",
+      "xxo\n",
+      "o..\n",
+      ".xo Counter({4: 21, 5: 9, 6: 1}) \n",
+      "\n",
+      "xoo\n",
+      ".xx\n",
+      "xoo Counter({3: 5055}) \n",
+      "\n",
+      "xxo\n",
+      "oo.\n",
+      "xox Counter({5: 3}) \n",
+      "\n",
+      "x.x\n",
+      "...\n",
+      ".o. Counter({3: 5, 1: 4, 4: 3, 5: 3, 6: 3, 8: 3}) \n",
+      "\n",
+      "x..\n",
+      ".ox\n",
+      "... Counter({2: 22, 7: 19, 1: 11, 6: 2, 8: 2, 3: 1}) \n",
+      "\n",
+      "xx.\n",
+      "o.x\n",
+      ".o. Counter({2: 2, 6: 2, 8: 1, 4: 1}) \n",
+      "\n",
+      "xo.\n",
+      ".xx\n",
+      "o.o Counter({3: 849, 7: 10, 2: 1}) \n",
+      "\n",
+      "x.o\n",
+      ".xx\n",
+      "o.o Counter({7: 2380, 3: 1231, 1: 1}) \n",
+      "\n",
+      "ox.\n",
+      "o.x\n",
+      ".x. Counter({6: 6, 8: 3, 2: 3, 4: 2}) \n",
+      "\n",
+      "oxo\n",
+      "x..\n",
+      ".x. Counter({4: 5, 6: 5, 8: 1, 5: 1}) \n",
+      "\n",
+      "ox.\n",
+      "..x\n",
+      "..o Counter({2: 3, 3: 3, 4: 3, 6: 3, 7: 3}) \n",
+      "\n",
+      "xxo\n",
+      "oo.\n",
+      ".xx Counter({6: 18, 5: 7}) \n",
+      "\n",
+      "x..\n",
+      ".x.\n",
+      "..o Counter({1: 1, 2: 1, 3: 1, 5: 1, 6: 1, 7: 1}) \n",
+      "\n",
+      "xx.\n",
+      ".ox\n",
+      ".o. Counter({2: 8, 8: 1, 3: 1, 6: 1}) \n",
+      "\n",
+      "xo.\n",
+      ".o.\n",
+      "x.x Counter({7: 16, 3: 3, 2: 2, 5: 1}) \n",
+      "\n",
+      "ox.\n",
+      "xxo\n",
+      ".o. Counter({2: 135, 6: 135, 8: 3}) \n",
+      "\n",
+      "xx.\n",
+      "x.o\n",
+      ".o. Counter({8: 3, 2: 3, 4: 3, 6: 3}) \n",
+      "\n",
+      "x.x\n",
+      "...\n",
+      "oo. Counter({8: 12967, 1: 628, 3: 1, 4: 1, 5: 1}) \n",
+      "\n",
+      "xxo\n",
+      "o.o\n",
+      "oxx Counter({4: 12}) \n",
+      "\n",
+      "xxo\n",
+      "xo.\n",
+      "..o Counter({6: 9, 5: 1, 7: 1}) \n",
+      "\n",
+      "xxo\n",
+      "xox\n",
+      ".o. Counter({6: 15, 8: 1}) \n",
+      "\n",
+      "ox.\n",
+      "o.x\n",
+      "... Counter({8: 4, 2: 4, 6: 3, 7: 3, 4: 2}) \n",
+      "\n",
+      "xxo\n",
+      ".oo\n",
+      "xx. Counter({8: 10, 3: 4}) \n",
+      "\n",
+      "xxo\n",
+      "xox\n",
+      ".oo Counter({6: 15}) \n",
+      "\n",
+      "xx.\n",
+      "o.o\n",
+      "xo. Counter({4: 470, 2: 61, 8: 1}) \n",
+      "\n",
+      "xx.\n",
+      ".oo\n",
+      "ox. Counter({2: 64, 3: 2, 8: 1}) \n",
+      "\n",
+      "xxo\n",
+      "..x\n",
+      ".o. Counter({8: 3, 3: 3, 4: 3, 6: 3}) \n",
+      "\n",
+      "xox\n",
+      ".o.\n",
+      "... Counter({7: 1645, 8: 1, 3: 1, 5: 1, 6: 1}) \n",
+      "\n",
+      "xxo\n",
+      "oox\n",
+      "..x Counter({6: 14, 7: 3}) \n",
+      "\n",
+      "xoo\n",
+      ".x.\n",
+      "x.. Counter({8: 1, 3: 1, 5: 1, 7: 1}) \n",
+      "\n",
+      "xx.\n",
+      "oo.\n",
+      "xox Counter({5: 36, 2: 3}) \n",
+      "\n",
+      "xxo\n",
+      "o.x\n",
+      "o.. Counter({4: 271, 8: 1, 7: 1}) \n",
+      "\n",
+      "xoo\n",
+      "...\n",
+      "x.x Counter({3: 1, 4: 1, 5: 1, 7: 1}) \n",
+      "\n",
+      "xx.\n",
+      "o.o\n",
+      ".x. Counter({4: 8, 8: 1, 2: 1, 6: 1}) \n",
+      "\n",
+      "x.o\n",
+      "..x\n",
+      "oxo Counter({4: 4, 3: 3, 1: 1}) \n",
+      "\n",
+      "xx.\n",
+      "x.o\n",
+      "..o Counter({2: 5, 6: 2, 4: 1, 7: 1}) \n",
+      "\n",
+      "xxo\n",
+      "o..\n",
+      "oxx Counter({4: 9, 5: 1}) \n",
+      "\n",
+      "xxo\n",
+      "..x\n",
+      ".oo Counter({6: 4, 3: 1, 4: 1}) \n",
+      "\n",
+      "xxo\n",
+      "oox\n",
+      "xxo Counter() \n",
+      "\n",
+      "xx.\n",
+      ".xo\n",
+      "oo. Counter({2: 733, 8: 730, 3: 1}) \n",
+      "\n",
+      "xx.\n",
+      "oxo\n",
+      "o.. Counter({8: 1336, 7: 1154, 2: 789}) \n",
+      "\n",
+      "o..\n",
+      ".xx\n",
+      "... Counter({1: 1, 2: 1, 3: 1, 6: 1, 7: 1, 8: 1}) \n",
+      "\n",
+      "oxo\n",
+      "x..\n",
+      "... Counter({8: 3, 4: 3, 5: 3, 6: 3, 7: 3}) \n",
+      "\n",
+      "xox\n",
+      "...\n",
+      "xo. Counter({4: 10, 3: 2, 8: 1, 5: 1}) \n",
+      "\n",
+      "ox.\n",
+      "x..\n",
+      "..o Counter({4: 5, 5: 3, 7: 3, 2: 2, 6: 2}) \n",
+      "\n",
+      "xxo\n",
+      "..o\n",
+      "ox. Counter({4: 66, 8: 1, 3: 1}) \n",
+      "\n",
+      ".x.\n",
+      "oo.\n",
+      ".x. Counter({8: 3, 0: 2, 2: 2, 5: 1, 6: 1}) \n",
+      "\n",
+      "xx.\n",
+      "..o\n",
+      "o.x Counter({2: 3, 4: 3, 3: 1, 7: 1}) \n",
+      "\n",
+      "xoo\n",
+      ".xo\n",
+      "x.. Counter({3: 6391, 8: 1963, 7: 1}) \n",
+      "\n",
+      "xx.\n",
+      "..o\n",
+      "..o Counter({2: 9, 3: 5, 6: 3, 7: 2, 4: 1}) \n",
+      "\n",
+      "ox.\n",
+      ".x.\n",
+      "o.. Counter({7: 9629, 3: 1815, 8: 1, 2: 1, 5: 1}) \n",
+      "\n",
+      "xoo\n",
+      "...\n",
+      "x.. Counter({3: 8521, 8: 7775, 5: 3258, 4: 2559, 7: 434}) \n",
+      "\n",
+      "xx.\n",
+      "...\n",
+      "xoo Counter({3: 2, 2: 1, 4: 1, 5: 1}) \n",
+      "\n",
+      "xxo\n",
+      ".o.\n",
+      "xxo Counter({5: 4, 3: 3}) \n",
+      "\n",
+      "xxo\n",
+      "..x\n",
+      "xoo Counter({3: 3, 4: 1}) \n",
+      "\n",
+      "xxo\n",
+      ".x.\n",
+      "o.o Counter({7: 1059, 3: 1, 5: 1}) \n",
+      "\n",
+      "oo.\n",
+      ".xx\n",
+      ".x. Counter({3: 19, 2: 12, 8: 1, 6: 1}) \n",
+      "\n",
+      "xx.\n",
+      "oox\n",
+      "xo. Counter({2: 3, 8: 1}) \n",
+      "\n",
+      "xxo\n",
+      "o..\n",
+      "xxo Counter({5: 6, 4: 3}) \n",
+      "\n",
+      "xoo\n",
+      ".xx\n",
+      "o.. Counter({7: 2918, 8: 1029, 3: 913}) \n",
+      "\n",
+      "xxo\n",
+      "x.o\n",
+      ".o. Counter({6: 7, 8: 6, 4: 2}) \n",
+      "\n",
+      ".x.\n",
+      ".o.\n",
+      "... Counter({6: 7, 5: 2, 8: 2, 0: 1, 2: 1, 3: 1, 7: 1}) \n",
+      "\n",
+      "xo.\n",
+      ".xo\n",
+      "x.. Counter({8: 1, 2: 1, 3: 1, 7: 1}) \n",
+      "\n",
+      "xxo\n",
+      "oxx\n",
+      ".oo Counter({6: 3}) \n",
+      "\n",
+      "xx.\n",
+      "..o\n",
+      "o.. Counter({2: 1259, 8: 331, 7: 229, 4: 226, 3: 1}) \n",
+      "\n",
+      "xo.\n",
+      "...\n",
+      "x.. Counter({4: 2, 2: 1, 3: 1, 5: 1, 7: 1, 8: 1}) \n",
+      "\n",
+      "xo.\n",
+      "oxx\n",
+      ".o. Counter({6: 679, 2: 637, 8: 288}) \n",
+      "\n",
+      "xxo\n",
+      "..x\n",
+      "oxo Counter({4: 9, 3: 1}) \n",
+      "\n",
+      "xxo\n",
+      "x.o\n",
+      "oox Counter({4: 281}) \n",
+      "\n",
+      "xox\n",
+      "...\n",
+      "ox. Counter({8: 3, 4: 2, 5: 2, 3: 1}) \n",
+      "\n",
+      "xx.\n",
+      "xoo\n",
+      ".o. Counter({6: 7, 8: 5, 2: 3}) \n",
+      "\n",
+      "xx.\n",
+      "..o\n",
+      "oox Counter({3: 519, 2: 453, 4: 373}) \n",
+      "\n",
+      "xxo\n",
+      "oxo\n",
+      "xo. Counter({8: 3853}) \n",
+      "\n",
+      "xox\n",
+      "oo.\n",
+      "..x Counter({5: 976, 6: 1, 7: 1}) \n",
+      "\n",
+      "xx.\n",
+      ".ox\n",
+      "xoo Counter({2: 1, 3: 1}) \n",
+      "\n",
+      "xoo\n",
+      ".x.\n",
+      ".x. Counter({8: 1, 3: 1, 5: 1, 6: 1}) \n",
+      "\n",
+      "xx.\n",
+      ".oo\n",
+      "..x Counter({3: 12, 2: 4, 6: 3, 7: 1}) \n",
+      "\n",
+      "xoo\n",
+      "ox.\n",
+      ".x. Counter({8: 684, 5: 19, 6: 9}) \n",
+      "\n",
+      "xxo\n",
+      "...\n",
+      "xo. Counter({3: 3, 4: 2, 8: 1, 5: 1}) \n",
+      "\n",
+      "x.o\n",
+      ".x.\n",
+      "o.. Counter({5: 1938, 7: 1811, 8: 1224, 3: 581, 1: 149}) \n",
+      "\n",
+      "ox.\n",
+      "..x\n",
+      ".o. Counter({8: 3, 3: 3, 4: 3, 2: 2, 6: 2}) \n",
+      "\n",
+      "oo.\n",
+      ".xx\n",
+      "... Counter({2: 1454, 3: 1024, 6: 2, 8: 1, 7: 1}) \n",
+      "\n",
+      "x.x\n",
+      "...\n",
+      "o.. Counter({1: 1, 3: 1, 4: 1, 5: 1, 7: 1, 8: 1}) \n",
+      "\n",
+      ".x.\n",
+      "o..\n",
+      "... Counter({4: 13, 6: 9, 5: 7, 2: 6, 7: 4, 0: 2, 8: 2}) \n",
+      "\n",
+      "xx.\n",
+      ".o.\n",
+      "ox. Counter({2: 20, 8: 2, 3: 1, 5: 1}) \n",
+      "\n",
+      "xo.\n",
+      ".x.\n",
+      "..o Counter({3: 7742, 6: 3122, 5: 703, 7: 13, 2: 1}) \n",
+      "\n",
+      "o..\n",
+      ".ox\n",
+      ".x. Counter({8: 5, 6: 3, 2: 2, 1: 1, 3: 1}) \n",
+      "\n",
+      "oo.\n",
+      "..x\n",
+      ".x. Counter({4: 5, 2: 3, 6: 3, 8: 1, 3: 1}) \n",
+      "\n",
+      "xo.\n",
+      ".xx\n",
+      "oxo Counter({3: 3, 2: 1}) \n",
+      "\n",
+      "xo.\n",
+      "ox.\n",
+      "... Counter({8: 5654, 2: 4331, 6: 765, 7: 258, 5: 236}) \n",
+      "\n",
+      "x.o\n",
+      ".xx\n",
+      "oxo Counter({1: 1, 3: 1}) \n",
+      "\n",
+      "xx.\n",
+      "oo.\n",
+      "x.. Counter({5: 48, 2: 10, 7: 2, 8: 1}) \n",
+      "\n",
+      "xo.\n",
+      "..x\n",
+      "x.o Counter({2: 3, 3: 3, 4: 3, 7: 3}) \n",
+      "\n",
+      "xxo\n",
+      ".ox\n",
+      "xo. Counter({3: 3, 8: 1}) \n",
+      "\n",
+      "xxo\n",
+      "o..\n",
+      "x.o Counter({5: 3, 4: 1, 7: 1}) \n",
+      "\n",
+      "xxo\n",
+      "oox\n",
+      "x.. Counter({8: 3, 7: 3}) \n",
+      "\n",
+      "x.o\n",
+      ".x.\n",
+      "..o Counter({5: 4986, 3: 2, 1: 1, 6: 1, 7: 1}) \n",
+      "\n",
+      "xx.\n",
+      ".xo\n",
+      "xoo Counter({2: 24, 3: 1}) \n",
+      "\n",
+      "xoo\n",
+      "...\n",
+      "..x Counter({4: 4849, 6: 3456, 3: 1628, 7: 1459, 5: 1}) \n",
+      "\n",
+      "xxo\n",
+      ".xx\n",
+      ".oo Counter({6: 25, 3: 3}) \n",
+      "\n",
+      "xox\n",
+      "...\n",
+      "oxo Counter({3: 3, 4: 3, 5: 3}) \n",
+      "\n",
+      "x..\n",
+      "..x\n",
+      "..o Counter({4: 5, 6: 5, 7: 5, 2: 4, 1: 3, 3: 3}) \n",
+      "\n",
+      "xoo\n",
+      "oxx\n",
+      ".xo Counter({6: 3}) \n",
+      "\n",
+      "xxo\n",
+      ".ox\n",
+      "xoo Counter({3: 599}) \n",
+      "\n",
+      "xx.\n",
+      "oo.\n",
+      "..x Counter({5: 14, 2: 10, 7: 3, 6: 2}) \n",
+      "\n",
+      "x.x\n",
+      ".o.\n",
+      ".o. Counter({1: 8237, 8: 1, 3: 1, 5: 1, 6: 1}) \n",
+      "\n",
+      "xoo\n",
+      ".x.\n",
+      "xo. Counter({5: 6175, 8: 4209, 3: 2172}) \n",
+      "\n",
+      "xxo\n",
+      ".oo\n",
+      "x.x Counter({3: 21, 7: 1}) \n",
+      "\n",
+      "xx.\n",
+      "o.o\n",
+      "x.o Counter({2: 16, 4: 1, 7: 1}) \n",
+      "\n",
+      "ox.\n",
+      ".ox\n",
+      "ox. Counter({8: 1, 2: 1, 3: 1}) \n",
+      "\n",
+      "xx.\n",
+      ".o.\n",
+      "x.o Counter({2: 1, 3: 1, 5: 1, 7: 1}) \n",
+      "\n",
+      "oxo\n",
+      "x.x\n",
+      ".o. Counter({4: 4, 8: 3, 6: 3}) \n",
+      "\n",
+      "xox\n",
+      "...\n",
+      "... Counter({4: 4, 5: 4, 7: 2, 3: 1, 6: 1, 8: 1}) \n",
+      "\n",
+      "xxo\n",
+      "x..\n",
+      "o.. Counter({8: 5, 5: 5, 4: 3, 7: 3}) \n",
+      "\n",
+      "ox.\n",
+      "..x\n",
+      "ox. Counter({2: 4, 3: 3, 4: 3, 8: 2}) \n",
+      "\n",
+      "xx.\n",
+      "oox\n",
+      "o.. Counter({2: 231, 8: 1, 7: 1}) \n",
+      "\n",
+      "xx.\n",
+      "ox.\n",
+      "o.o Counter({7: 1846, 2: 1163, 5: 1}) \n",
+      "\n",
+      "x.x\n",
+      ".o.\n",
+      "... Counter({1: 31, 3: 1, 5: 1, 6: 1, 7: 1, 8: 1}) \n",
+      "\n",
+      "oxo\n",
+      "xx.\n",
+      "... Counter({8: 1, 5: 1, 6: 1, 7: 1}) \n",
+      "\n",
+      "xx.\n",
+      "xoo\n",
+      "... Counter({2: 3, 8: 1, 6: 1, 7: 1}) \n",
+      "\n",
+      "xxo\n",
+      "oo.\n",
+      ".x. Counter({8: 1, 5: 1, 6: 1}) \n",
+      "\n",
+      "xx.\n",
+      "..o\n",
+      "oxo Counter({2: 100, 4: 66, 3: 1}) \n",
+      "\n",
+      "xxo\n",
+      ".oo\n",
+      "..x Counter({3: 1, 6: 1, 7: 1}) \n",
+      "\n",
+      "xxo\n",
+      "x..\n",
+      ".oo Counter({6: 8, 4: 2, 5: 2}) \n",
+      "\n",
+      "ox.\n",
+      "..x\n",
+      "o.. Counter({3: 4, 7: 4, 8: 3, 2: 3, 4: 3}) \n",
+      "\n",
+      "x.o\n",
+      "..x\n",
+      "... Counter({4: 6, 1: 1, 3: 1, 6: 1, 7: 1, 8: 1}) \n",
+      "\n",
+      "xx.\n",
+      "..o\n",
+      "x.o Counter({2: 9, 3: 4, 4: 3, 7: 2}) \n",
+      "\n",
+      "xo.\n",
+      ".ox\n",
+      "x.o Counter({3: 355, 7: 6, 2: 1}) \n",
+      "\n",
+      "xo.\n",
+      "..o\n",
+      ".x. Counter({6: 242, 8: 118, 4: 38, 2: 12, 3: 3}) \n",
+      "\n",
+      "xxo\n",
+      "..o\n",
+      "xo. Counter({8: 310, 3: 47, 4: 1}) \n",
+      "\n"
+     ]
+    }
+   ],
+   "source": [
+    "for b in p_floor1m:\n",
+    "    if b != 'human?':\n",
+    "        print(show_board(b), p_floor1m[b], '\\n')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 325,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "('x', 'o', 'o', 'o', 'x', 'x', 'x', 'x', 'o')"
+      ]
+     },
+     "execution_count": 325,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "# p1 = new_menace()\n",
+    "# p2 = new_menace()\n",
+    "# g = new_game(p1, p2)\n",
+    "g = new_game(p_floor1, p_floor0)\n",
+    "play_game(g)\n",
+    "g['board']"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 326,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[{'board': ('.', '.', '.', '.', '.', '.', '.', '.', '.'),\n",
+       "  'move': 4,\n",
+       "  'player1?': True},\n",
+       " {'board': ('.', '.', '.', '.', 'x', '.', '.', '.', '.'),\n",
+       "  'move': 8,\n",
+       "  'player1?': False},\n",
+       " {'board': ('.', '.', '.', '.', 'x', '.', '.', '.', 'o'),\n",
+       "  'move': 7,\n",
+       "  'player1?': True},\n",
+       " {'board': ('.', '.', '.', '.', 'x', '.', '.', 'x', 'o'),\n",
+       "  'move': 1,\n",
+       "  'player1?': False},\n",
+       " {'board': ('.', 'o', '.', '.', 'x', '.', '.', 'x', 'o'),\n",
+       "  'move': 5,\n",
+       "  'player1?': True},\n",
+       " {'board': ('.', 'o', '.', '.', 'x', 'x', '.', 'x', 'o'),\n",
+       "  'move': 3,\n",
+       "  'player1?': False},\n",
+       " {'board': ('.', 'o', '.', 'o', 'x', 'x', '.', 'x', 'o'),\n",
+       "  'move': 6,\n",
+       "  'player1?': True},\n",
+       " {'board': ('.', 'o', '.', 'o', 'x', 'x', 'x', 'x', 'o'),\n",
+       "  'move': 2,\n",
+       "  'player1?': False},\n",
+       " {'board': ('.', 'o', 'o', 'o', 'x', 'x', 'x', 'x', 'o'),\n",
+       "  'move': 0,\n",
+       "  'player1?': True}]"
+      ]
+     },
+     "execution_count": 326,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "g['history']"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 310,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "update_players(g)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 311,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "...  ...\n",
+      "...  ...\n",
+      "...  ... 7 Counter({0: 3, 1: 3, 2: 3, 3: 3, 4: 3, 5: 3, 6: 3, 8: 3, 7: 2}) \n",
+      "\n",
+      "...  .x.\n",
+      "...  ...\n",
+      ".x.  ... 5 Counter({3: 4, 0: 3, 2: 3, 4: 3, 5: 3, 6: 3, 7: 3, 8: 3}) \n",
+      "\n",
+      "...  .x.\n",
+      "..o  o..\n",
+      ".x.  ... 3 Counter({0: 3, 2: 3, 4: 3, 6: 3, 7: 3, 8: 3, 5: 2}) \n",
+      "\n",
+      "...  .x.\n",
+      "x.o  x.o\n",
+      ".x.  ... 2 Counter({8: 4, 0: 3, 2: 3, 4: 3, 6: 3, 7: 3}) \n",
+      "\n",
+      "..o  oo.\n",
+      "x.o  ..x\n",
+      ".x.  .x. 1 Counter({8: 3, 2: 3, 4: 3, 6: 3, 3: 2}) \n",
+      "\n",
+      ".xo  ox.\n",
+      "x.o  o.x\n",
+      ".x.  .x. 6 Counter({8: 4, 2: 3, 4: 3, 6: 3}) \n",
+      "\n",
+      ".xo  ox.\n",
+      "x.o  x.x\n",
+      "ox.  .oo 0 Counter({4: 3, 6: 3, 2: 2}) \n",
+      "\n",
+      "xxo  xxo\n",
+      "x.o  x.x\n",
+      "ox.  oo. 8 Counter({8: 4, 4: 3}) \n",
+      "\n"
+     ]
+    }
+   ],
+   "source": [
+    "for m in g['history']:\n",
+    "    b, r, f = canonical(m['board'])\n",
+    "    if m['player1?']:\n",
+    "        print(show_boards([m['board'], b]), m['move'], p1[b], '\\n')\n",
+    "    else:\n",
+    "        print(show_boards([m['board'], b]), m['move'], p2[b], '\\n')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 323,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "...  ...  ...  ...\n",
+      "...  ...  ...  ...\n",
+      "...  ...  .x.  .x. 7 7\n",
+      "...  ...\n",
+      "...  ...\n",
+      ".+.  .+. 0 False \n",
+      "\n",
+      "\n",
+      "...  .x.  ...  .x.\n",
+      "...  ...  ..o  o..\n",
+      ".x.  ...  .x.  ... 5 3\n",
+      "...  ...\n",
+      "..+  +..\n",
+      "...  ... 2 False \n",
+      "\n",
+      "\n",
+      "...  .x.  ...  .x.\n",
+      "..o  o..  x.o  o.x\n",
+      ".x.  ...  .x.  ... 3 5\n",
+      "...  ...\n",
+      "+..  ..+\n",
+      "...  ... 2 False \n",
+      "\n",
+      "\n",
+      "...  .x.  ..o  .x.\n",
+      "x.o  x.o  x.o  x.o\n",
+      ".x.  ...  .x.  ..o 2 8\n",
+      "..+  ...\n",
+      "...  ...\n",
+      "...  ..+ 2 True \n",
+      "\n",
+      "\n",
+      "..o  oo.  .xo  oo.\n",
+      "x.o  ..x  x.o  x.x\n",
+      ".x.  .x.  .x.  .x. 1 3\n",
+      ".+.  ...\n",
+      "...  +..\n",
+      "...  ... 3 False \n",
+      "\n",
+      "\n",
+      ".xo  ox.  .xo  ox.\n",
+      "x.o  o.x  x.o  o.x\n",
+      ".x.  .x.  ox.  .xo 6 8\n",
+      "...  ...\n",
+      "...  ...\n",
+      "+..  ..+ 0 True \n",
+      "\n",
+      "\n",
+      ".xo  ox.  xxo  oxx\n",
+      "x.o  x.x  x.o  x.x\n",
+      "ox.  .oo  ox.  .oo 0 2\n",
+      "+..  ..+\n",
+      "...  ...\n",
+      "...  ... 1 False \n",
+      "\n",
+      "\n"
+     ]
+    }
+   ],
+   "source": [
+    "for i in range(len(g['history']) - 1):\n",
+    "    m = g['history'][i]\n",
+    "    n = g['history'][i+1]\n",
+    "    board, r, f = canonical(m['board'])\n",
+    "    move_board = apply_move(empty_board(), m['move'], '+')\n",
+    "    cmove_board = transform(move_board, r, f)\n",
+    "    cmove = cmove_board.index('+')\n",
+    "\n",
+    "    print(show_boards([m['board'], board, n['board'], transform(n['board'], r, f)]), m['move'], cmove)\n",
+    "    print(show_boards([move_board, cmove_board]), r, f, '\\n\\n')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 327,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "0 Counter({4: 44929, 6: 301, 3: 71, 5: 55, 8: 34, 1: 25, 7: 16, 0: 6, 2: 5})\n",
+      "1 Counter({0: 1, 1: 1, 2: 1, 3: 1, 5: 1, 6: 1, 7: 1, 8: 1})\n",
+      "2 Counter({3: 10669, 1: 6873, 2: 2541, 5: 847, 6: 582, 8: 413, 7: 123})\n",
+      "3 Counter({2: 1, 3: 1, 5: 1, 6: 1, 7: 1, 8: 1})\n",
+      "4 Counter({6: 1266, 3: 1114, 8: 17, 2: 1, 5: 1})\n",
+      "5 Counter({8: 1, 2: 1, 6: 1, 7: 1})\n",
+      "6 Counter({2: 68, 6: 17, 8: 3})\n",
+      "7 Counter({8: 3, 6: 1})\n",
+      "8 Counter({6: 3})\n"
+     ]
+    }
+   ],
+   "source": [
+    "for i, m in enumerate(g['history']):\n",
+    "    print(i, p_floor1[canonical(m['board'])[0]])"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 330,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      ".o.  ox.\n",
+      "oxx  xxo\n",
+      ".xo  .o.\n"
+     ]
+    }
+   ],
+   "source": [
+    "tb = g['history'][6]['board']\n",
+    "print(show_boards([tb, canonical(tb)[0]]))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 337,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "Counter({0: 3, 2: 15, 6: 82})"
+      ]
+     },
+     "execution_count": 337,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "g = new_game(p_floor1, p_floor0)\n",
+    "g['board'] = tb\n",
+    "collections.Counter(menace_move(g) for _ in range(100))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 338,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "Counter({2: 79, 6: 18, 8: 3})"
+      ]
+     },
+     "execution_count": 338,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "g = new_game(p_floor1, p_floor0)\n",
+    "g['board'] = canonical(tb)[0]\n",
+    "collections.Counter(menace_move(g) for _ in range(100))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": []
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.5.2+"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/menace-nim-project.ipynb b/menace-nim-project.ipynb
new file mode 100644 (file)
index 0000000..2709a0d
--- /dev/null
@@ -0,0 +1,1197 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# Menace-like Nim player\n",
+    "\n",
+    "This is an implementation of a Menace-like player for one-stack Nim."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Nim\n",
+    "\n",
+    "There are many version of Nim. This version uses a single stack of tokens (initially nine). Players take turns removing one, two, or three tokens from the stack. The player who takes the last token loses."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Menace\n",
+    "[Menace](http://chalkdustmagazine.com/features/menace-machine-educable-noughts-crosses-engine/) was an early program that learnt how to play a perfect game of noughts and crosses. It was developed by [Donald Michie](https://en.wikipedia.org/wiki/Donald_Michie). As computers were rare in the 1950s, Michie implemented the machine as a set of matchboxes.\n",
+    "\n",
+    "There is one matchbox for each state of the game (330 for noughts and crosses, ignoring rotations and reflections; 9 for this version of Nim). Each box contains some beads, with each type of bead representing a different move. \n",
+    "\n",
+    "When playing the game, Menace makes its move by picking a random bead from the appropriate box. It plays randomly, but biased by the number of beads in each box.\n",
+    "\n",
+    "Learning takes place by [reinforcement learning](https://en.wikipedia.org/wiki/Reinforcement_learning) after the game. If Menace won, all the beads are replaced in their original boxes, and another bead of the same type is added to the box. In other words, one bead came out of the box, two beads of that type go back in. If Menace lost, the played beads are removed (with a minimum of one bead of each type remaining in each box)."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Implementation\n",
+    "\n",
+    "Create a new Python3 trinket. In **`main.py`**, add the lines:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from menace import *\n",
+    "import random\n",
+    "import pprint\n",
+    "\n",
+    "pp = pprint.PrettyPrinter()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Create a new file called **`menace.py`**. All the procedures we write will be in this file.\n",
+    "\n",
+    "We start with some imports and constant definitions."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "import collections\n",
+    "import random"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "INITIAL_GAME_SIZE = 9\n",
+    "MAX_TAKE = 3\n",
+    "INITIAL_BEAD_COUNT = 3"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "A **Menace** instance is just a collection of boxes, each box containing some beads. The bead types are just the number of tokens to remove on this move. \n",
+    "\n",
+    "We'll  use a `collections.Counter` object to store counts of the number of beads. `collections.Counter()` creates a new empty Counter. We can assign counts to it the same as a `dict`, by just saying\n",
+    "\n",
+    "```\n",
+    "box = collections.Counter()\n",
+    "box[1] = INITIAL_BEAD_COUNT\n",
+    "```\n",
+    "\n",
+    "We'll use a `dict` of boxes, just to avoid off-by-one errors when comparing the number of tokens to the index of the box collection. \n",
+    "\n",
+    "The boxes `dict` also has a key to show that this is not a human player.\n",
+    "\n",
+    "Note that we ensure that only legal moves are represented in the Menace player.\n",
+    "\n",
+    "#### Task\n",
+    "Write a procedure that will create a new Menace player."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def new_menace():\n",
+    "    boxes = {'human?': False}\n",
+    "    for b in range(1, INITIAL_GAME_SIZE+1):\n",
+    "        box = collections.Counter()\n",
+    "        for i in range(1, MAX_TAKE+1):\n",
+    "            if b >= i:\n",
+    "                box[i] = INITIAL_BEAD_COUNT\n",
+    "        boxes[b] = box\n",
+    "    return boxes"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "This procedure will pick a random move by listing all the beads and picking one at random."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def menace_move(box):\n",
+    "    return random.choice(list(box.elements()))"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Test\n",
+    "We test this by adding a line to the end of **`main.py`** and running the project.\n",
+    "\n",
+    "Note that there are four 'p's on this line!"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 11,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{1: Counter({1: 3}),\n",
+      " 2: Counter({1: 3, 2: 3}),\n",
+      " 3: Counter({1: 3, 2: 3, 3: 3}),\n",
+      " 4: Counter({1: 3, 2: 3, 3: 3}),\n",
+      " 5: Counter({1: 3, 2: 3, 3: 3}),\n",
+      " 6: Counter({1: 3, 2: 3, 3: 3}),\n",
+      " 7: Counter({1: 3, 2: 3, 3: 3}),\n",
+      " 8: Counter({1: 3, 2: 3, 3: 3}),\n",
+      " 9: Counter({1: 3, 2: 3, 3: 3}),\n",
+      " 'human?': False}\n"
+     ]
+    }
+   ],
+   "source": [
+    "pp.pprint(new_menace())"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 41,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "1\n"
+     ]
+    }
+   ],
+   "source": [
+    "p1 = new_menace()\n",
+    "print(menace_move(p1[9]))"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "A **human** player has no state, apart from saying it's human. There's some complex logic to ensure that we only get valid moves from the human.\n",
+    "\n",
+    "Add these procedures to **`menace.py`**"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 13,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def new_human():\n",
+    "    return {'human?': True}"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 14,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def human_move(game):\n",
+    "    if game['history']:\n",
+    "        print('Opponent took', game['history'][-1]['move'], 'pieces.')\n",
+    "    else:\n",
+    "        print('You play first.')\n",
+    "    print('There are', game['tokens'], 'pieces left.')\n",
+    "    \n",
+    "    max_move = min(MAX_TAKE, game['tokens'])\n",
+    "    valid_input = False\n",
+    "    \n",
+    "    while not valid_input:\n",
+    "        user_input = input('Your move (1-{})? '.format(max_move))\n",
+    "        if user_input.isnumeric():\n",
+    "            move = int(user_input)\n",
+    "            if move in range(1, max_move+1):\n",
+    "                valid_input = True\n",
+    "            else:\n",
+    "                print('Number not a valid move.')\n",
+    "        else:\n",
+    "            print('Please enter a number.')\n",
+    "    return move"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "A **game** is the current state of the game (number of tokens, who's the current player), the two players, and a history of moves. We use the history for the reinforcement learning phase."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 15,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def new_game(player1, player2):\n",
+    "    return {'tokens': INITIAL_GAME_SIZE,\n",
+    "           'player1': player1,\n",
+    "           'player2': player2,\n",
+    "           'player1_active': True,\n",
+    "           'history': []}"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "The **active player** makes a move, depending on whether it's a human or a menace. After the move is taken, update the game state and history. We store plenty in the history to make the learning phase easier."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 16,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def make_move(game):\n",
+    "    if game['player1_active']:\n",
+    "        active = game['player1']\n",
+    "    else:\n",
+    "        active = game['player2']\n",
+    "    if active['human?']:\n",
+    "        move = human_move(game)\n",
+    "    else:\n",
+    "        move = menace_move(active[game['tokens']])\n",
+    "    game['history'] += [{'player1?': game['player1_active'], 'move': move, 'tokens': game['tokens']}]\n",
+    "    game['tokens'] -= move\n",
+    "    game['player1_active'] = not game['player1_active'] "
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Test what we've got\n",
+    "\n",
+    "Let's test the move-making code.\n",
+    "\n",
+    "Remove the `pp.pprint` and `print` lines from **`main.py`** . Add these to **`main.py`** then run the project. Check you get output like this."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 17,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{'history': [],\n",
+      " 'player1': {1: Counter({1: 3}),\n",
+      "             2: Counter({1: 3, 2: 3}),\n",
+      "             3: Counter({1: 3, 2: 3, 3: 3}),\n",
+      "             4: Counter({1: 3, 2: 3, 3: 3}),\n",
+      "             5: Counter({1: 3, 2: 3, 3: 3}),\n",
+      "             6: Counter({1: 3, 2: 3, 3: 3}),\n",
+      "             7: Counter({1: 3, 2: 3, 3: 3}),\n",
+      "             8: Counter({1: 3, 2: 3, 3: 3}),\n",
+      "             9: Counter({1: 3, 2: 3, 3: 3}),\n",
+      "             'human?': False},\n",
+      " 'player1_active': True,\n",
+      " 'player2': {1: Counter({1: 3}),\n",
+      "             2: Counter({1: 3, 2: 3}),\n",
+      "             3: Counter({1: 3, 2: 3, 3: 3}),\n",
+      "             4: Counter({1: 3, 2: 3, 3: 3}),\n",
+      "             5: Counter({1: 3, 2: 3, 3: 3}),\n",
+      "             6: Counter({1: 3, 2: 3, 3: 3}),\n",
+      "             7: Counter({1: 3, 2: 3, 3: 3}),\n",
+      "             8: Counter({1: 3, 2: 3, 3: 3}),\n",
+      "             9: Counter({1: 3, 2: 3, 3: 3}),\n",
+      "             'human?': False},\n",
+      " 'tokens': 9}\n"
+     ]
+    }
+   ],
+   "source": [
+    "p1 = new_menace()\n",
+    "p2 = new_menace()\n",
+    "g = new_game(p1, p2)\n",
+    "\n",
+    "pp.pprint(g)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Note that we've got two players, an empty history, and that player 1 is active. \n",
+    "\n",
+    "Add these lines to make a move, run the project, and check you get output like this."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 18,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{'history': [{'move': 2, 'player1?': True, 'tokens': 9}],\n",
+      " 'player1': {1: Counter({1: 3}),\n",
+      "             2: Counter({1: 3, 2: 3}),\n",
+      "             3: Counter({1: 3, 2: 3, 3: 3}),\n",
+      "             4: Counter({1: 3, 2: 3, 3: 3}),\n",
+      "             5: Counter({1: 3, 2: 3, 3: 3}),\n",
+      "             6: Counter({1: 3, 2: 3, 3: 3}),\n",
+      "             7: Counter({1: 3, 2: 3, 3: 3}),\n",
+      "             8: Counter({1: 3, 2: 3, 3: 3}),\n",
+      "             9: Counter({1: 3, 2: 3, 3: 3}),\n",
+      "             'human?': False},\n",
+      " 'player1_active': False,\n",
+      " 'player2': {1: Counter({1: 3}),\n",
+      "             2: Counter({1: 3, 2: 3}),\n",
+      "             3: Counter({1: 3, 2: 3, 3: 3}),\n",
+      "             4: Counter({1: 3, 2: 3, 3: 3}),\n",
+      "             5: Counter({1: 3, 2: 3, 3: 3}),\n",
+      "             6: Counter({1: 3, 2: 3, 3: 3}),\n",
+      "             7: Counter({1: 3, 2: 3, 3: 3}),\n",
+      "             8: Counter({1: 3, 2: 3, 3: 3}),\n",
+      "             9: Counter({1: 3, 2: 3, 3: 3}),\n",
+      "             'human?': False},\n",
+      " 'tokens': 7}\n"
+     ]
+    }
+   ],
+   "source": [
+    "make_move(g)\n",
+    "pp.pprint(g)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "After the move, note that the move is now recorded in the history and player 1 is no longer active."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Playing the game\n",
+    "\n",
+    "#### Task\n",
+    "Back in **`menace.py`**, write a function that returns `True` if the game has finished (i.e. has zero tokens left) and `False` otherwise."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 19,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def game_finished(game):\n",
+    "    # Your code here"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "A **game** is just move after move until the game is finished."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 20,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def play_game(game):\n",
+    "    while not game_finished(game):\n",
+    "        make_move(game)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "The last player to move in a game is the loser. \n",
+    "\n",
+    "Note that \n",
+    "\n",
+    "`game['history']` is the list of game states,  \n",
+    "\n",
+    "`game['history'][-1]` gives us the last game state, and \n",
+    "\n",
+    "`game['history'][-1]['player1?]` tells us if player 1 made the last move."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 21,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def winner(game):\n",
+    "    if game['history'][-1]['player1?']:\n",
+    "        return game['player2']\n",
+    "    else:\n",
+    "        return game['player1']"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "#### Task\n",
+    "Write a function, similar to `winner()`, that returns the losing player."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 22,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "def loser(game):\n",
+    "    # Your code here"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Test what we've got\n",
+    "Let's test what we've got so far, by creating a game and making some moves with it. \n",
+    "\n",
+    "Change the end of **`main.py`** so that you play a whole game, rather than make just one move."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 23,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{'history': [{'move': 3, 'player1?': True, 'tokens': 9},\n",
+      "             {'move': 1, 'player1?': False, 'tokens': 6},\n",
+      "             {'move': 3, 'player1?': True, 'tokens': 5},\n",
+      "             {'move': 1, 'player1?': False, 'tokens': 2},\n",
+      "             {'move': 1, 'player1?': True, 'tokens': 1}],\n",
+      " 'player1': {1: Counter({1: 3}),\n",
+      "             2: Counter({1: 3, 2: 3}),\n",
+      "             3: Counter({1: 3, 2: 3, 3: 3}),\n",
+      "             4: Counter({1: 3, 2: 3, 3: 3}),\n",
+      "             5: Counter({1: 3, 2: 3, 3: 3}),\n",
+      "             6: Counter({1: 3, 2: 3, 3: 3}),\n",
+      "             7: Counter({1: 3, 2: 3, 3: 3}),\n",
+      "             8: Counter({1: 3, 2: 3, 3: 3}),\n",
+      "             9: Counter({1: 3, 2: 3, 3: 3}),\n",
+      "             'human?': False},\n",
+      " 'player1_active': False,\n",
+      " 'player2': {1: Counter({1: 3}),\n",
+      "             2: Counter({1: 3, 2: 3}),\n",
+      "             3: Counter({1: 3, 2: 3, 3: 3}),\n",
+      "             4: Counter({1: 3, 2: 3, 3: 3}),\n",
+      "             5: Counter({1: 3, 2: 3, 3: 3}),\n",
+      "             6: Counter({1: 3, 2: 3, 3: 3}),\n",
+      "             7: Counter({1: 3, 2: 3, 3: 3}),\n",
+      "             8: Counter({1: 3, 2: 3, 3: 3}),\n",
+      "             9: Counter({1: 3, 2: 3, 3: 3}),\n",
+      "             'human?': False},\n",
+      " 'tokens': 0}\n"
+     ]
+    }
+   ],
+   "source": [
+    "p1 = new_menace()\n",
+    "p2 = new_menace()\n",
+    "g = new_game(p1, p2)\n",
+    "\n",
+    "play_game(g)          # <-- change this line\n",
+    "pp.pprint(g)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Play a game between two players\n",
+    "\n",
+    "Let's not make a procedure that will take two players, pick one to be the first player, then play a game between them. \n",
+    "\n",
+    "Add this procedure to **`menace.py`**"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 24,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def game_with_players(p1, p2, report_result_for=None):\n",
+    "    if random.choice([True, False]):\n",
+    "        g = new_game(p1, p2)\n",
+    "    else:\n",
+    "        g = new_game(p2, p1)\n",
+    "    play_game(g)\n",
+    "    if report_result_for:\n",
+    "        if winner(g) == report_result_for:\n",
+    "            print('You won')\n",
+    "        else:\n",
+    "            print('You lost')\n",
+    "    return g"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Now change the lines at the end of **`main.py`** to play a game against the computer!"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 25,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Opponent took 1 pieces.\n",
+      "There are 8 pieces left.\n",
+      "Your move (1-3)? 3\n",
+      "Opponent took 2 pieces.\n",
+      "There are 3 pieces left.\n",
+      "Your move (1-3)? 2\n",
+      "You won\n"
+     ]
+    }
+   ],
+   "source": [
+    "p1 = new_menace()\n",
+    "ph = new_human()\n",
+    "\n",
+    "g = game_with_players(p1, ph, report_result_for=ph)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Learning\n",
+    "Now we can play a game, it's time to start the learning. We need to extract the winning and losing moves from a game, and use them to update the counts of beads in the player.\n",
+    "\n",
+    "Add this function to **`menace.py`**"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 26,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def winning_moves(game):\n",
+    "    moves = []\n",
+    "    player1_won = game['history'][-1]['player1?']\n",
+    "    for m in game['history']:\n",
+    "        if m['player1?'] != player1_won:\n",
+    "            moves += [m]\n",
+    "    return moves"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "#### Task\n",
+    "Write a similar function to find the losing moves. The function you need to write is almost identical to the one above, but you need to change the condition in the `if` statement.\n",
+    "\n",
+    "Note that in Python, `!=` means \"is not equal to\" and `==` means \"is equal to\". "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 27,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def losing_moves(game):\n",
+    "    # Your code here"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Test\n",
+    "Test this works. Add the following lines to the end of **`main.py`**\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 42,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Opponent took 3 pieces.\n",
+      "There are 6 pieces left.\n",
+      "Your move (1-3)? 1\n",
+      "Opponent took 1 pieces.\n",
+      "There are 4 pieces left.\n",
+      "Your move (1-3)? 2\n",
+      "You won\n",
+      "\n",
+      "Winning moves\n",
+      "[{'move': 1, 'player1?': False, 'tokens': 6},\n",
+      " {'move': 2, 'player1?': False, 'tokens': 4}]\n",
+      "\n",
+      "Losing moves\n",
+      "[{'move': 3, 'player1?': True, 'tokens': 9},\n",
+      " {'move': 1, 'player1?': True, 'tokens': 5},\n",
+      " {'move': 2, 'player1?': True, 'tokens': 2}]\n"
+     ]
+    }
+   ],
+   "source": [
+    "p1 = new_menace()\n",
+    "ph = new_human()\n",
+    "\n",
+    "g = game_with_players(p1, ph, report_result_for=ph)\n",
+    "\n",
+    "print()                     # <-- Add this line and the ones below.\n",
+    "print('Winning moves')\n",
+    "pp.pprint(winning_moves(g))\n",
+    "print()\n",
+    "print('Losing moves')\n",
+    "pp.pprint(losing_moves(g))"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "**Updating the winner** is straighforward: just find the correct box for each move, and update the number of winning beads in that box. \n",
+    "\n",
+    "In **`menace.py`**, add and complete this procedure. Remember that `m['tokens']` will tell you how many tokens there were before the move, and `m['move']` will tell you how many tokens the winner took in that move. `player[n]` will contain box _n_, which you want to update."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 30,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "def update_winner(game):\n",
+    "    player = # how do you find the winner?\n",
+    "    moves = # how do you find the winning moves?\n",
+    "    for m in moves:\n",
+    "        # how do you update the correct boxes?"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "**Updating the loser** is a bit tricker. The idea is the same as updating the winner, but we don't want to take the last bead of any particular type. You'll need to write a procedure very similar to `update_winner()`, but with an additional `if` statement to check if there's more than one bead of that type."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 31,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def update_loser(game):\n",
+    "    # Your code here"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Testing\n",
+    "We test the learning by playing a game and updating the players. Change the lines at the end of **`main.py`**."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 32,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{'history': [{'move': 1, 'player1?': True, 'tokens': 9},\n",
+      "             {'move': 2, 'player1?': False, 'tokens': 8},\n",
+      "             {'move': 1, 'player1?': True, 'tokens': 6},\n",
+      "             {'move': 1, 'player1?': False, 'tokens': 5},\n",
+      "             {'move': 1, 'player1?': True, 'tokens': 4},\n",
+      "             {'move': 1, 'player1?': False, 'tokens': 3},\n",
+      "             {'move': 2, 'player1?': True, 'tokens': 2}],\n",
+      " 'player1': {1: Counter({1: 3}),\n",
+      "             2: Counter({1: 3, 2: 3}),\n",
+      "             3: Counter({1: 3, 2: 3, 3: 3}),\n",
+      "             4: Counter({1: 3, 2: 3, 3: 3}),\n",
+      "             5: Counter({1: 3, 2: 3, 3: 3}),\n",
+      "             6: Counter({1: 3, 2: 3, 3: 3}),\n",
+      "             7: Counter({1: 3, 2: 3, 3: 3}),\n",
+      "             8: Counter({1: 3, 2: 3, 3: 3}),\n",
+      "             9: Counter({1: 3, 2: 3, 3: 3}),\n",
+      "             'human?': False},\n",
+      " 'player1_active': False,\n",
+      " 'player2': {1: Counter({1: 3}),\n",
+      "             2: Counter({1: 3, 2: 2}),\n",
+      "             3: Counter({1: 4, 2: 3, 3: 3}),\n",
+      "             4: Counter({2: 3, 3: 3, 1: 2}),\n",
+      "             5: Counter({1: 4, 2: 3, 3: 3}),\n",
+      "             6: Counter({2: 3, 3: 3, 1: 2}),\n",
+      "             7: Counter({1: 3, 2: 3, 3: 3}),\n",
+      "             8: Counter({2: 4, 1: 3, 3: 3}),\n",
+      "             9: Counter({2: 3, 3: 3, 1: 2}),\n",
+      "             'human?': False},\n",
+      " 'tokens': 0}\n"
+     ]
+    }
+   ],
+   "source": [
+    "p1 = new_menace()\n",
+    "p2 = new_menace()      # Change this line\n",
+    "g = new_game(p1, p2)   # Change this line to be p2 not ph\n",
+    "play_game(g)\n",
+    "\n",
+    "update_winner(g)       # Add these lines\n",
+    "update_loser(g)        # Add these lines \n",
+    "\n",
+    "pp.pprint(g)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "This shows the winner's counts being increased and the losers decreased.\n",
+    "\n",
+    "What happens when the push the updates? Does the number of beads stay at the minum value of 1?\n",
+    "\n",
+    "Wrap the `update...` lines in a `for` loop to do many updates at the same time."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 33,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{'history': [{'move': 1, 'player1?': True, 'tokens': 9},\n",
+      "             {'move': 2, 'player1?': False, 'tokens': 8},\n",
+      "             {'move': 1, 'player1?': True, 'tokens': 6},\n",
+      "             {'move': 1, 'player1?': False, 'tokens': 5},\n",
+      "             {'move': 1, 'player1?': True, 'tokens': 4},\n",
+      "             {'move': 1, 'player1?': False, 'tokens': 3},\n",
+      "             {'move': 2, 'player1?': True, 'tokens': 2}],\n",
+      " 'player1': {1: Counter({1: 3}),\n",
+      "             2: Counter({1: 3, 2: 3}),\n",
+      "             3: Counter({1: 3, 2: 3, 3: 3}),\n",
+      "             4: Counter({1: 3, 2: 3, 3: 3}),\n",
+      "             5: Counter({1: 3, 2: 3, 3: 3}),\n",
+      "             6: Counter({1: 3, 2: 3, 3: 3}),\n",
+      "             7: Counter({1: 3, 2: 3, 3: 3}),\n",
+      "             8: Counter({1: 3, 2: 3, 3: 3}),\n",
+      "             9: Counter({1: 3, 2: 3, 3: 3}),\n",
+      "             'human?': False},\n",
+      " 'player1_active': False,\n",
+      " 'player2': {1: Counter({1: 3}),\n",
+      "             2: Counter({1: 3, 2: 1}),\n",
+      "             3: Counter({1: 8, 2: 3, 3: 3}),\n",
+      "             4: Counter({2: 3, 3: 3, 1: 1}),\n",
+      "             5: Counter({1: 8, 2: 3, 3: 3}),\n",
+      "             6: Counter({2: 3, 3: 3, 1: 1}),\n",
+      "             7: Counter({1: 3, 2: 3, 3: 3}),\n",
+      "             8: Counter({2: 8, 1: 3, 3: 3}),\n",
+      "             9: Counter({2: 3, 3: 3, 1: 1}),\n",
+      "             'human?': False},\n",
+      " 'tokens': 0}\n"
+     ]
+    }
+   ],
+   "source": [
+    "for _ in range(4):\n",
+    "    update_winner(g)\n",
+    "    update_loser(g)\n",
+    "    \n",
+    "pp.pprint(g)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Making clever players\n",
+    "Now we can play games and have players learn, let's train some players. \n",
+    "\n",
+    "We'll create two players and get them to play a large number of games against each other. To avoid any first-player advantage, we'll randomly swap which player goes first.\n",
+    "\n",
+    "Create this procedure in **`menace.py`**"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 34,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def game_with_players(p1, p2, report_result_for=None):\n",
+    "    if random.choice([True, False]):\n",
+    "        g = new_game(p1, p2)\n",
+    "    else:\n",
+    "        g = new_game(p2, p1)\n",
+    "    play_game(g)\n",
+    "    if report_result_for:\n",
+    "        if winner(g) == report_result_for:\n",
+    "            print('You won')\n",
+    "        else:\n",
+    "            print('You lost')\n",
+    "    return g"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Change the end of **`main.py`** to be this"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 35,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "You play first.\n",
+      "There are 9 pieces left.\n",
+      "Your move (1-3)? 1\n",
+      "Opponent took 3 pieces.\n",
+      "There are 5 pieces left.\n",
+      "Your move (1-3)? 1\n",
+      "Opponent took 2 pieces.\n",
+      "There are 2 pieces left.\n",
+      "Your move (1-2)? 1\n",
+      "You won\n"
+     ]
+    },
+    {
+     "data": {
+      "text/plain": [
+       "{'history': [{'move': 1, 'player1?': True, 'tokens': 9},\n",
+       "  {'move': 3, 'player1?': False, 'tokens': 8},\n",
+       "  {'move': 1, 'player1?': True, 'tokens': 5},\n",
+       "  {'move': 2, 'player1?': False, 'tokens': 4},\n",
+       "  {'move': 1, 'player1?': True, 'tokens': 2},\n",
+       "  {'move': 1, 'player1?': False, 'tokens': 1}],\n",
+       " 'player1': {'human?': True},\n",
+       " 'player1_active': True,\n",
+       " 'player2': {1: Counter({1: 3}),\n",
+       "  2: Counter({1: 3, 2: 3}),\n",
+       "  3: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  4: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  5: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  6: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  7: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  8: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  9: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  'human?': False},\n",
+       " 'tokens': 0}"
+      ]
+     },
+     "execution_count": 35,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "p1 = new_menace()\n",
+    "ph = new_human()\n",
+    "\n",
+    "game_with_players(p1, ph, report_result_for=ph)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "It should play a game with you and say if you won or lost."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Now we want to train some players. We create two `menace` players and have them play a bunch of games against themselves. About 10,000 games is enough for training.\n",
+    "\n",
+    "In **`menace.py`**, create this procedure:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 36,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def train_players(p1, p2, rounds=10000):\n",
+    "    for _ in range(rounds):\n",
+    "        # your code here to...\n",
+    "        # play a game with the two players\n",
+    "        # update the winner\n",
+    "        # update the loser\n",
+    "    return p1, p2"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Change the end of **`main.py`** to do the training. "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 37,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{1: Counter({1: 1}),\n",
+      " 2: Counter({1: 1741, 2: 1}),\n",
+      " 3: Counter({2: 1790, 1: 1, 3: 1}),\n",
+      " 4: Counter({3: 1620, 1: 1, 2: 1}),\n",
+      " 5: Counter({1: 1, 2: 1, 3: 1}),\n",
+      " 6: Counter({1: 1248, 2: 1, 3: 1}),\n",
+      " 7: Counter({2: 2651, 1: 1, 3: 1}),\n",
+      " 8: Counter({3: 1120, 1: 2, 2: 1}),\n",
+      " 9: Counter({1: 1, 2: 1, 3: 1}),\n",
+      " 'human?': False}\n"
+     ]
+    }
+   ],
+   "source": [
+    "p1 = new_menace()\n",
+    "p2 = new_menace()\n",
+    "\n",
+    "train_players(p1, p2) # Change this line\n",
+    "\n",
+    "pp.pprint(p1)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Playing Menace\n",
+    "Let's now play our trained Menace AI!"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 40,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Opponent took 1 pieces.\n",
+      "There are 8 pieces left.\n",
+      "Your move (1-3)? 1\n",
+      "Opponent took 2 pieces.\n",
+      "There are 5 pieces left.\n",
+      "Your move (1-3)? 3\n",
+      "Opponent took 1 pieces.\n",
+      "There are 1 pieces left.\n",
+      "Your move (1-1)? 1\n",
+      "You lost\n"
+     ]
+    },
+    {
+     "data": {
+      "text/plain": [
+       "{'history': [{'move': 1, 'player1?': True, 'tokens': 9},\n",
+       "  {'move': 1, 'player1?': False, 'tokens': 8},\n",
+       "  {'move': 2, 'player1?': True, 'tokens': 7},\n",
+       "  {'move': 3, 'player1?': False, 'tokens': 5},\n",
+       "  {'move': 1, 'player1?': True, 'tokens': 2},\n",
+       "  {'move': 1, 'player1?': False, 'tokens': 1}],\n",
+       " 'player1': {1: Counter({1: 1}),\n",
+       "  2: Counter({1: 1713, 2: 1}),\n",
+       "  3: Counter({1: 1, 2: 1678, 3: 1}),\n",
+       "  4: Counter({1: 1, 2: 1, 3: 1674}),\n",
+       "  5: Counter({1: 1, 2: 1, 3: 1}),\n",
+       "  6: Counter({1: 203, 2: 2, 3: 1}),\n",
+       "  7: Counter({1: 12, 2: 4775, 3: 2}),\n",
+       "  8: Counter({1: 1, 2: 1, 3: 7}),\n",
+       "  9: Counter({1: 193, 2: 1, 3: 1}),\n",
+       "  'human?': False},\n",
+       " 'player1_active': True,\n",
+       " 'player2': {'human?': True},\n",
+       " 'tokens': 0}"
+      ]
+     },
+     "execution_count": 40,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "p1 = new_menace()\n",
+    "p2 = new_menace()\n",
+    "\n",
+    "train_players(p1, p2)\n",
+    "\n",
+    "ph = new_human()\n",
+    "\n",
+    "game_with_players(p1, ph, report_result_for=ph)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Extension\n",
+    "\n",
+    "The `update_loser()` procedure doesn't take the last bead of a particular type from any box. But taking this last bead could make Menace completely avoid bad moves. \n",
+    "\n",
+    "Change the `update_loser()` procedure so that we can say whether we want to take the last bead of a type from the box. \n",
+    "\n",
+    "Change the procedure definition to\n",
+    "\n",
+    "```\n",
+    "def update_loser(game, allow_drop_move=False):\n",
+    "```\n",
+    "\n",
+    "You'll need add an `if` statement when you update the number of beads, something like:\n",
+    "\n",
+    "```\n",
+    "for m in moves:\n",
+    "    if allow_drop_move:\n",
+    "        # your new code\n",
+    "    else:\n",
+    "        # the existing update code\n",
+    "```\n",
+    "\n",
+    "Be careful that you don't take the last bead from a box, leaving that box with no beads at all!\n",
+    "\n",
+    "You'll also need to update `train_players()` to accept an `allow_drop_moves` parameter and pass it to the `update_loser()` procedure inside it.\n",
+    "\n",
+    "Can you beat players trained this way?"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": []
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.5.2+"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/menace-nim.ipynb b/menace-nim.ipynb
new file mode 100644 (file)
index 0000000..8ed2bb2
--- /dev/null
@@ -0,0 +1,1588 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# Menace-like Nim player\n",
+    "\n",
+    "This is an implementation of a Menace-like player for one-stack Nim."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Nim\n",
+    "\n",
+    "There are many version of Nim. This version uses a single stack of tokens (initially nine). Players take turns removing one, two, or three tokens from the stack. The player who takes the last token loses."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Menace\n",
+    "[Menace](http://chalkdustmagazine.com/features/menace-machine-educable-noughts-crosses-engine/) was an early program that learnt how to play a perfect game of noughts and crosses. It was developed by [Donald Michie](https://en.wikipedia.org/wiki/Donald_Michie). As computers were rare in the 1950s, Michie implemented the machine as a set of matchboxes.\n",
+    "\n",
+    "There is one matchbox for each state of the game (330 for noughts and crosses, ignoring rotations and reflections; 9 for this version of Nim). Each box contains some beads, with each type of bead representing a different move. \n",
+    "\n",
+    "When playing the game, Menace makes its move by picking a random bead from the appropriate box. It plays randomly, but biased by the number of beads in each box.\n",
+    "\n",
+    "Learning takes place by [reinforcement learning](https://en.wikipedia.org/wiki/Reinforcement_learning) after the game. If Menace won, all the beads are replaced in their original boxes, and another bead of the same type is added to the box. In other words, one bead came out of the box, two beads of that type go back in. If Menace lost, the played beads are removed (with a minimum of one bead of each type remaining in each box)."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Implementation\n",
+    "We start with some imports and constant definitions."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 84,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "import collections\n",
+    "import random\n",
+    "from IPython.display import HTML, display"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "INITIAL_GAME_SIZE = 9\n",
+    "MAX_TAKE = 3\n",
+    "INITIAL_BEAD_COUNT = 3"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "A **Menace** instance is just a collection of boxes, each box containing some beads. The bead types are just the number of tokens to remove on this move. \n",
+    "\n",
+    "I use a `collections.Counter` object to store counts of the number of beads. \n",
+    "\n",
+    "I use a `dict` of boxes, just to avoid off-by-one errors when comparing the number of tokens to the index of the box collection. \n",
+    "\n",
+    "Note that we ensure that only legal moves are represented in the Menace player."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def new_menace():\n",
+    "    boxes = {'human?': False}\n",
+    "    for b in range(1, INITIAL_GAME_SIZE+1):\n",
+    "        box = collections.Counter()\n",
+    "        for i in range(1, MAX_TAKE+1):\n",
+    "            if b >= i:\n",
+    "                box[i] = INITIAL_BEAD_COUNT\n",
+    "        boxes[b] = box\n",
+    "    return boxes"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "{1: Counter({1: 3}),\n",
+       " 2: Counter({1: 3, 2: 3}),\n",
+       " 3: Counter({1: 3, 2: 3, 3: 3}),\n",
+       " 4: Counter({1: 3, 2: 3, 3: 3}),\n",
+       " 5: Counter({1: 3, 2: 3, 3: 3}),\n",
+       " 6: Counter({1: 3, 2: 3, 3: 3}),\n",
+       " 7: Counter({1: 3, 2: 3, 3: 3}),\n",
+       " 8: Counter({1: 3, 2: 3, 3: 3}),\n",
+       " 9: Counter({1: 3, 2: 3, 3: 3}),\n",
+       " 'human?': False}"
+      ]
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "new_menace()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Pick a random move by listing all the beads and picking one at random."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def menace_move(box):\n",
+    "    return random.choice(list(box.elements()))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "2"
+      ]
+     },
+     "execution_count": 6,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "menace_move(new_menace()[9])"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "A **human** player has no state, apart from saying it's human. There's some complex logic to ensure that we only get valid moves from the human."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def new_human():\n",
+    "    return {'human?': True}"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 34,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def human_move(game):\n",
+    "    if game['history']:\n",
+    "        print('Opponent took', game['history'][-1]['move'], 'pieces.')\n",
+    "    else:\n",
+    "        print('You play first.')\n",
+    "    print('There are', game['tokens'], 'pieces left.')\n",
+    "    \n",
+    "    max_move = min(MAX_TAKE, game['tokens'])\n",
+    "    valid_input = False\n",
+    "    \n",
+    "    while not valid_input:\n",
+    "        user_input = input('Your move (1-{})? '.format(max_move))\n",
+    "        if user_input.isnumeric():\n",
+    "            move = int(user_input)\n",
+    "            if move in range(1, max_move+1):\n",
+    "                valid_input = True\n",
+    "            else:\n",
+    "                print('Number not a valid move.')\n",
+    "        else:\n",
+    "            print('Please enter a number.')\n",
+    "    return move"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "A **game** is the current state of the game (number of tokens, who's the current player), the two players, and a history of moves. We use the history for the reinforcement learning phase."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "def new_game(player1, player2):\n",
+    "    return {'tokens': INITIAL_GAME_SIZE,\n",
+    "           'player1': player1,\n",
+    "           'player2': player2,\n",
+    "           'player1_active': True,\n",
+    "           'history': []}"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def game_finished(game):\n",
+    "    return game['tokens'] == 0"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "The last player to move in a game is the loser."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 11,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def winner(game):\n",
+    "    if game['history'][-1]['player1?']:\n",
+    "        return game['player2']\n",
+    "    else:\n",
+    "        return game['player1']\n",
+    "\n",
+    "def loser(game):\n",
+    "    if game['history'][-1]['player1?']:\n",
+    "        return game['player1']\n",
+    "    else:\n",
+    "        return game['player2']          "
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "The **active player** makes a move, depending on whether it's a human or a menace. After the move is taken, update the game state and history. We store plenty in the history to make the learning phase easier."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 12,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def make_move(game):\n",
+    "    if game['player1_active']:\n",
+    "        active = game['player1']\n",
+    "    else:\n",
+    "        active = game['player2']\n",
+    "    if active['human?']:\n",
+    "        move = human_move(game)\n",
+    "    else:\n",
+    "        move = menace_move(active[game['tokens']])\n",
+    "    game['history'] += [{'player1?': game['player1_active'], 'move': move, 'tokens': game['tokens']}]\n",
+    "    game['tokens'] -= move\n",
+    "    game['player1_active'] = not game['player1_active'] "
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "A **game** is just move after move until the game is finished."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 15,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def play_game(game):\n",
+    "    while not game_finished(game):\n",
+    "        make_move(game)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Test what we've got\n",
+    "Let's test what we've got so far, by creating a game and making some moves with it."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 37,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "{'history': [],\n",
+       " 'player1': {1: Counter({1: 3}),\n",
+       "  2: Counter({1: 3, 2: 3}),\n",
+       "  3: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  4: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  5: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  6: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  7: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  8: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  9: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  'human?': False},\n",
+       " 'player1_active': True,\n",
+       " 'player2': {1: Counter({1: 3}),\n",
+       "  2: Counter({1: 3, 2: 3}),\n",
+       "  3: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  4: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  5: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  6: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  7: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  8: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  9: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  'human?': False},\n",
+       " 'tokens': 9}"
+      ]
+     },
+     "execution_count": 37,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "p1 = new_menace()\n",
+    "p2 = new_menace()\n",
+    "g = new_game(p1, p2)\n",
+    "g"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 38,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "{'history': [{'move': 3, 'player1?': True, 'tokens': 9}],\n",
+       " 'player1': {1: Counter({1: 3}),\n",
+       "  2: Counter({1: 3, 2: 3}),\n",
+       "  3: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  4: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  5: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  6: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  7: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  8: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  9: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  'human?': False},\n",
+       " 'player1_active': False,\n",
+       " 'player2': {1: Counter({1: 3}),\n",
+       "  2: Counter({1: 3, 2: 3}),\n",
+       "  3: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  4: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  5: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  6: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  7: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  8: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  9: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  'human?': False},\n",
+       " 'tokens': 6}"
+      ]
+     },
+     "execution_count": 38,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "make_move(g)\n",
+    "g"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 39,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "{'history': [{'move': 1, 'player1?': True, 'tokens': 9},\n",
+       "  {'move': 2, 'player1?': False, 'tokens': 8},\n",
+       "  {'move': 3, 'player1?': True, 'tokens': 6},\n",
+       "  {'move': 2, 'player1?': False, 'tokens': 3},\n",
+       "  {'move': 1, 'player1?': True, 'tokens': 1}],\n",
+       " 'player1': {1: Counter({1: 3}),\n",
+       "  2: Counter({1: 3, 2: 3}),\n",
+       "  3: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  4: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  5: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  6: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  7: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  8: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  9: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  'human?': False},\n",
+       " 'player1_active': False,\n",
+       " 'player2': {1: Counter({1: 3}),\n",
+       "  2: Counter({1: 3, 2: 3}),\n",
+       "  3: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  4: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  5: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  6: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  7: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  8: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  9: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  'human?': False},\n",
+       " 'tokens': 0}"
+      ]
+     },
+     "execution_count": 39,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "p1 = new_menace()\n",
+    "p2 = new_menace()\n",
+    "g = new_game(p1, p2)\n",
+    "play_game(g)\n",
+    "g"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 40,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Opponent took 1 pieces.\n",
+      "There are 8 pieces left.\n",
+      "Your move (1-3)? 2\n",
+      "Opponent took 2 pieces.\n",
+      "There are 4 pieces left.\n",
+      "Your move (1-3)? 3\n",
+      "You won\n"
+     ]
+    }
+   ],
+   "source": [
+    "p1 = new_menace()\n",
+    "ph = new_human()\n",
+    "if random.choice([True, False]):\n",
+    "    g = new_game(p1, ph)\n",
+    "else:\n",
+    "    g = new_game(ph, p1)\n",
+    "play_game(g)\n",
+    "if winner(g) == ph:\n",
+    "    print('You won')\n",
+    "else:\n",
+    "    print('You lost')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 41,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "{'human?': True}"
+      ]
+     },
+     "execution_count": 41,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "winner(g)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 42,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "{1: Counter({1: 3}),\n",
+       " 2: Counter({1: 3, 2: 3}),\n",
+       " 3: Counter({1: 3, 2: 3, 3: 3}),\n",
+       " 4: Counter({1: 3, 2: 3, 3: 3}),\n",
+       " 5: Counter({1: 3, 2: 3, 3: 3}),\n",
+       " 6: Counter({1: 3, 2: 3, 3: 3}),\n",
+       " 7: Counter({1: 3, 2: 3, 3: 3}),\n",
+       " 8: Counter({1: 3, 2: 3, 3: 3}),\n",
+       " 9: Counter({1: 3, 2: 3, 3: 3}),\n",
+       " 'human?': False}"
+      ]
+     },
+     "execution_count": 42,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "loser(g)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Learning\n",
+    "Now we can play a game, it's time to start the learning. We need to extract the winning and losing moves from a game, and use them to update the counts of beads in the player."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 20,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def winning_moves(game):\n",
+    "    return [h for h in game['history'] \n",
+    "            if h['player1?'] != game['history'][-1]['player1?']]\n",
+    "\n",
+    "def losing_moves(game):\n",
+    "      return [h for h in game['history'] \n",
+    "            if h['player1?'] == game['history'][-1]['player1?']]  "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 21,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[{'move': 2, 'player1?': True, 'tokens': 9},\n",
+       " {'move': 1, 'player1?': True, 'tokens': 4},\n",
+       " {'move': 1, 'player1?': True, 'tokens': 2}]"
+      ]
+     },
+     "execution_count": 21,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "winning_moves(g)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 22,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[{'move': 3, 'player1?': False, 'tokens': 7},\n",
+       " {'move': 1, 'player1?': False, 'tokens': 3},\n",
+       " {'move': 1, 'player1?': False, 'tokens': 1}]"
+      ]
+     },
+     "execution_count": 22,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "losing_moves(g)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "**Updating the winner** is easy: just find the correct box for each move, and update the number of winning beads in that box."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 23,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def update_winner(game):\n",
+    "    player = winner(game)\n",
+    "    moves = winning_moves(game)\n",
+    "    for m in moves:\n",
+    "        player[m['tokens']][m['move']] += 1"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "**Updating the loser** is a bit tricker. The idea is the same as updating the winner, but we have to deal with excepttions. We don't update the bead count in three cases:\n",
+    "1. There are no beads of that type in the box to start with (though this shouldn't happen in practice).\n",
+    "2. There's only one instance of this type of bead in the box (unless we override that behaviour with the `allow_drop_move` flag).\n",
+    "3. In any case, we never take the last bead from a box."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 183,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def update_loser_0(game):\n",
+    "    player = loser(game)\n",
+    "    moves = losing_moves(game)\n",
+    "    for m in moves:\n",
+    "        if player[m['tokens']][m['move']] > 1:\n",
+    "            player[m['tokens']][m['move']] -= 1"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 184,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def update_loser(game, allow_drop_move=False):\n",
+    "    player = loser(game)\n",
+    "    moves = losing_moves(game)\n",
+    "    for m in moves:\n",
+    "        if allow_drop_move:\n",
+    "            if len(list(player[m['tokens']].elements())) > 1:\n",
+    "                player[m['tokens']][m['move']] -= 1\n",
+    "        else:\n",
+    "            if player[m['tokens']][m['move']] > 1:\n",
+    "                player[m['tokens']][m['move']] -= 1"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Testing\n",
+    "We test the learning by playing a game and updating the players."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 52,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "{'history': [{'move': 1, 'player1?': True, 'tokens': 9},\n",
+       "  {'move': 1, 'player1?': False, 'tokens': 8},\n",
+       "  {'move': 2, 'player1?': True, 'tokens': 7},\n",
+       "  {'move': 1, 'player1?': False, 'tokens': 5},\n",
+       "  {'move': 3, 'player1?': True, 'tokens': 4},\n",
+       "  {'move': 1, 'player1?': False, 'tokens': 1}],\n",
+       " 'player1': {1: Counter({1: 3}),\n",
+       "  2: Counter({1: 3, 2: 3}),\n",
+       "  3: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  4: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  5: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  6: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  7: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  8: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  9: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  'human?': False},\n",
+       " 'player1_active': True,\n",
+       " 'player2': {1: Counter({1: 3}),\n",
+       "  2: Counter({1: 3, 2: 3}),\n",
+       "  3: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  4: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  5: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  6: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  7: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  8: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  9: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  'human?': False},\n",
+       " 'tokens': 0}"
+      ]
+     },
+     "execution_count": 52,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "p1 = new_menace()\n",
+    "p2 = new_menace()\n",
+    "g = new_game(p1, p2)\n",
+    "play_game(g)\n",
+    "g"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 53,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "{'history': [{'move': 1, 'player1?': True, 'tokens': 9},\n",
+       "  {'move': 1, 'player1?': False, 'tokens': 8},\n",
+       "  {'move': 2, 'player1?': True, 'tokens': 7},\n",
+       "  {'move': 1, 'player1?': False, 'tokens': 5},\n",
+       "  {'move': 3, 'player1?': True, 'tokens': 4},\n",
+       "  {'move': 1, 'player1?': False, 'tokens': 1}],\n",
+       " 'player1': {1: Counter({1: 3}),\n",
+       "  2: Counter({1: 3, 2: 3}),\n",
+       "  3: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  4: Counter({1: 3, 2: 3, 3: 4}),\n",
+       "  5: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  6: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  7: Counter({1: 3, 2: 4, 3: 3}),\n",
+       "  8: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  9: Counter({1: 4, 2: 3, 3: 3}),\n",
+       "  'human?': False},\n",
+       " 'player1_active': True,\n",
+       " 'player2': {1: Counter({1: 2}),\n",
+       "  2: Counter({1: 3, 2: 3}),\n",
+       "  3: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  4: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  5: Counter({1: 2, 2: 3, 3: 3}),\n",
+       "  6: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  7: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  8: Counter({1: 2, 2: 3, 3: 3}),\n",
+       "  9: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  'human?': False},\n",
+       " 'tokens': 0}"
+      ]
+     },
+     "execution_count": 53,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "update_winner(g)\n",
+    "update_loser(g)\n",
+    "g"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "This shows the winner's counts being increased and the losers decreased.\n",
+    "\n",
+    "What happens when the push the updates? Does the number of beads stay at the minum value of 1?"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 54,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "{'history': [{'move': 1, 'player1?': True, 'tokens': 9},\n",
+       "  {'move': 1, 'player1?': False, 'tokens': 8},\n",
+       "  {'move': 2, 'player1?': True, 'tokens': 7},\n",
+       "  {'move': 1, 'player1?': False, 'tokens': 5},\n",
+       "  {'move': 3, 'player1?': True, 'tokens': 4},\n",
+       "  {'move': 1, 'player1?': False, 'tokens': 1}],\n",
+       " 'player1': {1: Counter({1: 3}),\n",
+       "  2: Counter({1: 3, 2: 3}),\n",
+       "  3: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  4: Counter({1: 3, 2: 3, 3: 8}),\n",
+       "  5: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  6: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  7: Counter({1: 3, 2: 8, 3: 3}),\n",
+       "  8: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  9: Counter({1: 8, 2: 3, 3: 3}),\n",
+       "  'human?': False},\n",
+       " 'player1_active': True,\n",
+       " 'player2': {1: Counter({1: 1}),\n",
+       "  2: Counter({1: 3, 2: 3}),\n",
+       "  3: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  4: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  5: Counter({1: 1, 2: 3, 3: 3}),\n",
+       "  6: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  7: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  8: Counter({1: 1, 2: 3, 3: 3}),\n",
+       "  9: Counter({1: 3, 2: 3, 3: 3}),\n",
+       "  'human?': False},\n",
+       " 'tokens': 0}"
+      ]
+     },
+     "execution_count": 54,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "for _ in range(4):\n",
+    "    update_winner(g)\n",
+    "    update_loser(g)\n",
+    "g"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Now try it again, but allow moves to be dropped. Does the bead count go to zero?"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 55,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "{1: Counter({1: 1}),\n",
+       " 2: Counter({1: 3, 2: 3}),\n",
+       " 3: Counter({1: 3, 2: 3, 3: 3}),\n",
+       " 4: Counter({1: 3, 2: 3, 3: 3}),\n",
+       " 5: Counter({1: 0, 2: 3, 3: 3}),\n",
+       " 6: Counter({1: 3, 2: 3, 3: 3}),\n",
+       " 7: Counter({1: 3, 2: 3, 3: 3}),\n",
+       " 8: Counter({1: 0, 2: 3, 3: 3}),\n",
+       " 9: Counter({1: 3, 2: 3, 3: 3}),\n",
+       " 'human?': False}"
+      ]
+     },
+     "execution_count": 55,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "update_loser(g, allow_drop_move=True)\n",
+    "loser(g)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Yes, that move is now forgotten."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 56,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[2, 2, 2, 3, 3, 3]"
+      ]
+     },
+     "execution_count": 56,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "list(g['player2'][8].elements())"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Making clever players\n",
+    "Now we can play games and have players learn, let's train some players. \n",
+    "\n",
+    "We'll create two players and get them to play a large number of games against each other. To avoid any first-player advantage, we'll randomly swap which player goes first."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 185,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "({1: Counter({1: 1}),\n",
+       "  2: Counter({1: 1683, 2: 1}),\n",
+       "  3: Counter({1: 1, 2: 1678, 3: 1}),\n",
+       "  4: Counter({1: 1, 2: 1, 3: 1647}),\n",
+       "  5: Counter({1: 1, 2: 1, 3: 1}),\n",
+       "  6: Counter({1: 1634, 2: 1, 3: 1}),\n",
+       "  7: Counter({1: 1, 2: 1714, 3: 1}),\n",
+       "  8: Counter({1: 1, 2: 1, 3: 1573}),\n",
+       "  9: Counter({1: 1, 2: 1, 3: 1}),\n",
+       "  'human?': False},\n",
+       " {1: Counter({1: 1}),\n",
+       "  2: Counter({1: 1642, 2: 1}),\n",
+       "  3: Counter({1: 1, 2: 1681, 3: 1}),\n",
+       "  4: Counter({1: 1, 2: 1, 3: 1656}),\n",
+       "  5: Counter({1: 1, 2: 1, 3: 1}),\n",
+       "  6: Counter({1: 1694, 2: 1, 3: 1}),\n",
+       "  7: Counter({1: 1, 2: 1603, 3: 1}),\n",
+       "  8: Counter({1: 1, 2: 1, 3: 1599}),\n",
+       "  9: Counter({1: 1, 2: 1, 3: 1}),\n",
+       "  'human?': False})"
+      ]
+     },
+     "execution_count": 185,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "p1 = new_menace()\n",
+    "p2 = new_menace()\n",
+    "for i in range(10000):\n",
+    "    if random.choice([True, False]):\n",
+    "        g = new_game(p1, p2)\n",
+    "    else:\n",
+    "        g = new_game(p2, p1)\n",
+    "    play_game(g)\n",
+    "    update_winner(g)\n",
+    "    update_loser(g)\n",
+    "p1, p2"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "This shows there's clearly one correct move in each situation, and the first player loses.\n",
+    "\n",
+    "What if we allow the elimination of moves?"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 182,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "({1: Counter({1: 1}),\n",
+       "  2: Counter({1: 14, 2: 1}),\n",
+       "  3: Counter({1: 0, 2: 16, 3: 1}),\n",
+       "  4: Counter({1: 0, 2: 0, 3: 26}),\n",
+       "  5: Counter({1: 0, 2: 1, 3: 0}),\n",
+       "  6: Counter({1: 14, 2: 2, 3: 0}),\n",
+       "  7: Counter({1: 0, 2: 0, 3: 1}),\n",
+       "  8: Counter({1: 0, 2: 0, 3: 12}),\n",
+       "  9: Counter({1: 0, 2: 1, 3: 0}),\n",
+       "  'human?': False},\n",
+       " {1: Counter({1: 1}),\n",
+       "  2: Counter({1: 14, 2: 1}),\n",
+       "  3: Counter({1: 0, 2: 4974, 3: 0}),\n",
+       "  4: Counter({1: 0, 2: 0, 3: 4965}),\n",
+       "  5: Counter({1: 1, 2: 0, 3: 0}),\n",
+       "  6: Counter({1: 17, 2: 0, 3: 1}),\n",
+       "  7: Counter({1: 0, 2: 4948, 3: 0}),\n",
+       "  8: Counter({1: 1, 2: 2, 3: 9}),\n",
+       "  9: Counter({1: 0, 2: 4963, 3: 0}),\n",
+       "  'human?': False})"
+      ]
+     },
+     "execution_count": 182,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "p1 = new_menace()\n",
+    "p2 = new_menace()\n",
+    "for _ in range(10000):\n",
+    "    if random.choice([True, False]):\n",
+    "        g = new_game(p1, p2)\n",
+    "    else:\n",
+    "        g = new_game(p2, p1)\n",
+    "    play_game(g)\n",
+    "    update_winner(g)\n",
+    "    update_loser2(g, allow_drop_move=True)\n",
+    "p1, p2"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Much lower counts for some moves. These are the obviously losing moves, which seem to be taken rarely in the game. This isn't so good for playing against a human, as the **Menace** player needs to play well after non-optimal play by the human."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Playing Menace\n",
+    "Let's retrain, then try playing it!"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 58,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "p1 = new_menace()\n",
+    "p2 = new_menace()\n",
+    "for i in range(10000):\n",
+    "    if random.choice([True, False]):\n",
+    "        g = new_game(p1, p2)\n",
+    "    else:\n",
+    "        g = new_game(p2, p1)\n",
+    "    play_game(g)\n",
+    "    update_winner(g)\n",
+    "    update_loser(g)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 61,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "You play first.\n",
+      "There are 9 pieces left.\n",
+      "Your move (1-3)? 2\n",
+      "Opponent took 2 pieces.\n",
+      "There are 5 pieces left.\n",
+      "Your move (1-3)? 1\n",
+      "Opponent took 3 pieces.\n",
+      "There are 1 pieces left.\n",
+      "Your move (1-1)? 1\n",
+      "You lost\n"
+     ]
+    }
+   ],
+   "source": [
+    "ph = new_human()\n",
+    "if random.choice([True, False]):\n",
+    "    g = new_game(p1, ph)\n",
+    "else:\n",
+    "    g = new_game(ph, p1)\n",
+    "play_game(g)\n",
+    "if winner(g) == ph:\n",
+    "    print('You won')\n",
+    "else:\n",
+    "    print('You lost')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 62,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "{'history': [{'move': 2, 'player1?': True, 'tokens': 9},\n",
+       "  {'move': 2, 'player1?': False, 'tokens': 7},\n",
+       "  {'move': 1, 'player1?': True, 'tokens': 5},\n",
+       "  {'move': 3, 'player1?': False, 'tokens': 4},\n",
+       "  {'move': 1, 'player1?': True, 'tokens': 1}],\n",
+       " 'player1': {'human?': True},\n",
+       " 'player1_active': False,\n",
+       " 'player2': {1: Counter({1: 1}),\n",
+       "  2: Counter({1: 1676, 2: 1}),\n",
+       "  3: Counter({1: 1, 2: 1695, 3: 1}),\n",
+       "  4: Counter({1: 1, 2: 1, 3: 1653}),\n",
+       "  5: Counter({1: 1, 2: 1, 3: 1}),\n",
+       "  6: Counter({1: 1648, 2: 1, 3: 1}),\n",
+       "  7: Counter({1: 2, 2: 1646, 3: 1}),\n",
+       "  8: Counter({1: 1, 2: 1, 3: 1639}),\n",
+       "  9: Counter({1: 1, 2: 1, 3: 1}),\n",
+       "  'human?': False},\n",
+       " 'tokens': 0}"
+      ]
+     },
+     "execution_count": 62,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "g"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## How strong are these players?\n",
+    "Let's generate some players by different methods, and get them playing each other. We'll also introduce a partially-trained player, a \"newbie\" untrained player (essentially random play), and a hand-crafted ideal player."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 149,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Wins 23 games out of 10000 , or  0.23 %\n"
+     ]
+    }
+   ],
+   "source": [
+    "p1 = new_menace()\n",
+    "p2 = new_menace()\n",
+    "for _ in range(10000):\n",
+    "    if random.choice([True, False]):\n",
+    "        g = new_game(p1, p2)\n",
+    "    else:\n",
+    "        g = new_game(p2, p1)\n",
+    "    play_game(g)\n",
+    "    update_winner(g)\n",
+    "    update_loser(g)\n",
+    "\n",
+    "wins = 0\n",
+    "plays = 10000\n",
+    "for _ in range(plays):\n",
+    "    g = new_game(p1, p2)\n",
+    "    play_game(g)\n",
+    "    if winner(g) == p1: \n",
+    "        wins += 1\n",
+    "print(\"Wins\", wins, \"games out of\", plays, \", or \", (100.0 * wins) / plays, \"%\")\n",
+    "\n",
+    "p_floor1 = p1"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 150,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "p1 = new_menace()\n",
+    "p2 = new_menace()\n",
+    "for _ in range(100):\n",
+    "    if random.choice([True, False]):\n",
+    "        g = new_game(p1, p2)\n",
+    "    else:\n",
+    "        g = new_game(p2, p1)\n",
+    "    play_game(g)\n",
+    "    update_winner(g)\n",
+    "    update_loser(g)\n",
+    "\n",
+    "p_parttrained = p1"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 170,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Wins 0 games out of 10000 , or  0.0 %\n"
+     ]
+    }
+   ],
+   "source": [
+    "p1 = new_menace()\n",
+    "p2 = new_menace()\n",
+    "for _ in range(10000):\n",
+    "    if random.choice([True, False]):\n",
+    "        g = new_game(p1, p2)\n",
+    "    else:\n",
+    "        g = new_game(p2, p1)\n",
+    "    play_game(g)\n",
+    "    update_winner(g)\n",
+    "    update_loser(g, allow_drop_move=True)\n",
+    "\n",
+    "wins = 0\n",
+    "plays = 10000\n",
+    "for _ in range(plays):\n",
+    "    g = new_game(p1, p2)\n",
+    "    play_game(g)\n",
+    "    if winner(g) == p1: \n",
+    "        wins += 1\n",
+    "print(\"Wins\", wins, \"games out of\", plays, \", or \", (100.0 * wins) / plays, \"%\")\n",
+    "    \n",
+    "p_floor0 = p2"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Let's try building a stable of players with the `allow_drop_move` and see if that's better."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 171,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Wins 1068 games out of 10000 , or  10.68 %\n"
+     ]
+    }
+   ],
+   "source": [
+    "players = [new_menace() for _ in range(10)]\n",
+    "\n",
+    "for _ in range(100000):\n",
+    "    p1, p2 = random.sample(players, 2)\n",
+    "    g = new_game(p1, p2)\n",
+    "    play_game(g)\n",
+    "    update_winner(g)\n",
+    "    update_loser(g, allow_drop_move=True)\n",
+    "\n",
+    "wins = 0\n",
+    "plays = 10000\n",
+    "p1 = players[0]\n",
+    "for _ in range(plays):\n",
+    "    p2 = random.choice(players[1:])\n",
+    "    g = new_game(p1, p2)\n",
+    "    play_game(g)\n",
+    "    if winner(g) == p1: \n",
+    "        wins += 1\n",
+    "print(\"Wins\", wins, \"games out of\", plays, \", or \", (100.0 * wins) / plays, \"%\")\n",
+    "    \n",
+    "p_floor0_stable = p1"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 172,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "{1: Counter({1: 1}),\n",
+       " 2: Counter({1: 3323, 2: 0}),\n",
+       " 3: Counter({1: 2, 2: 24, 3: 2}),\n",
+       " 4: Counter({1: 0, 2: 0, 3: 7682}),\n",
+       " 5: Counter({1: 0, 2: 1, 3: 0}),\n",
+       " 6: Counter({1: 3288, 2: 0, 3: 0}),\n",
+       " 7: Counter({1: 0, 2: 3302, 3: 0}),\n",
+       " 8: Counter({1: 0, 2: 0, 3: 3290}),\n",
+       " 9: Counter({1: 0, 2: 0, 3: 1}),\n",
+       " 'human?': False}"
+      ]
+     },
+     "execution_count": 172,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "p_floor0_stable"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 152,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "{1: Counter({1: 1}),\n",
+       " 2: Counter({1: 1}),\n",
+       " 3: Counter({2: 1}),\n",
+       " 4: Counter({3: 1}),\n",
+       " 5: Counter({1: 1}),\n",
+       " 6: Counter({1: 1}),\n",
+       " 7: Counter({2: 1}),\n",
+       " 8: Counter({3: 1}),\n",
+       " 9: Counter({1: 1}),\n",
+       " 'human?': False}"
+      ]
+     },
+     "execution_count": 152,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "newbie = new_menace()\n",
+    "ideal = {'human?': False,\n",
+    "         1: collections.Counter([1]),\n",
+    "         2: collections.Counter([1]),\n",
+    "         3: collections.Counter([2]),\n",
+    "         4: collections.Counter([3]),\n",
+    "         5: collections.Counter([1]),\n",
+    "         6: collections.Counter([1]),\n",
+    "         7: collections.Counter([2]),\n",
+    "         8: collections.Counter([3]),\n",
+    "         9: collections.Counter([1])}\n",
+    "ideal"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 153,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "def count_wins(p1, p2, plays=10000):\n",
+    "    wins = 0\n",
+    "    p2d = p2.copy()\n",
+    "    for _ in range(plays):\n",
+    "        g = new_game(p1, p2d)\n",
+    "        play_game(g)\n",
+    "        if not g['history'][-1]['player1?']:\n",
+    "            wins += 1\n",
+    "    return wins"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 173,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "players = [p_floor1, p_floor0, p_floor0_stable, newbie, p_parttrained, ideal]\n",
+    "player_names = ['Floor 1', 'Floor 0', 'Floor 0 stable', 'Newbie', 'Part trained', 'Ideal']"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 174,
+   "metadata": {
+    "scrolled": true
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "{(0, 0): 22,\n",
+       " (0, 1): 1265,\n",
+       " (0, 2): 511,\n",
+       " (0, 3): 8646,\n",
+       " (0, 4): 4449,\n",
+       " (0, 5): 0,\n",
+       " (1, 0): 12,\n",
+       " (1, 1): 1575,\n",
+       " (1, 2): 0,\n",
+       " (1, 3): 7684,\n",
+       " (1, 4): 6222,\n",
+       " (1, 5): 0,\n",
+       " (2, 0): 24,\n",
+       " (2, 1): 2281,\n",
+       " (2, 2): 1444,\n",
+       " (2, 3): 8532,\n",
+       " (2, 4): 3239,\n",
+       " (2, 5): 0,\n",
+       " (3, 0): 7,\n",
+       " (3, 1): 783,\n",
+       " (3, 2): 375,\n",
+       " (3, 3): 5153,\n",
+       " (3, 4): 1286,\n",
+       " (3, 5): 0,\n",
+       " (4, 0): 21,\n",
+       " (4, 1): 781,\n",
+       " (4, 2): 462,\n",
+       " (4, 3): 7901,\n",
+       " (4, 4): 3720,\n",
+       " (4, 5): 0,\n",
+       " (5, 0): 26,\n",
+       " (5, 1): 0,\n",
+       " (5, 2): 0,\n",
+       " (5, 3): 8837,\n",
+       " (5, 4): 7529,\n",
+       " (5, 5): 0}"
+      ]
+     },
+     "execution_count": 174,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "results = {}\n",
+    "\n",
+    "for i, p1 in enumerate(players):\n",
+    "    for j, p2 in enumerate(players):\n",
+    "        results[i, j] = count_wins(p1, p2)\n",
+    "results"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 175,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<table border=1>\n",
+       "<tr><td>&nbsp;</td><td>&nbsp;</td><th colspan=6>Player 1</th></tr>\n",
+       "<tr><td>&nbsp;</td><td>&nbsp;</td><td>Floor 1</td><td>Floor 0</td><td>Floor 0 stable</td><td>Newbie</td><td>Part trained</td><td>Ideal</td></tr>\n",
+       "<tr>\n",
+       "<th rowspan=6>Player 2</th>\n",
+       "<td>Floor 1</td>  <td>22</td>\n",
+       "  <td>12</td>\n",
+       "  <td>24</td>\n",
+       "  <td>7</td>\n",
+       "  <td>21</td>\n",
+       "  <td>26</td>\n",
+       "</tr>\n",
+       "<tr>\n",
+       "<td>Floor 0</td>  <td>1265</td>\n",
+       "  <td>1575</td>\n",
+       "  <td>2281</td>\n",
+       "  <td>783</td>\n",
+       "  <td>781</td>\n",
+       "  <td>0</td>\n",
+       "</tr>\n",
+       "<tr>\n",
+       "<td>Floor 0 stable</td>  <td>511</td>\n",
+       "  <td>0</td>\n",
+       "  <td>1444</td>\n",
+       "  <td>375</td>\n",
+       "  <td>462</td>\n",
+       "  <td>0</td>\n",
+       "</tr>\n",
+       "<tr>\n",
+       "<td>Newbie</td>  <td>8646</td>\n",
+       "  <td>7684</td>\n",
+       "  <td>8532</td>\n",
+       "  <td>5153</td>\n",
+       "  <td>7901</td>\n",
+       "  <td>8837</td>\n",
+       "</tr>\n",
+       "<tr>\n",
+       "<td>Part trained</td>  <td>4449</td>\n",
+       "  <td>6222</td>\n",
+       "  <td>3239</td>\n",
+       "  <td>1286</td>\n",
+       "  <td>3720</td>\n",
+       "  <td>7529</td>\n",
+       "</tr>\n",
+       "<tr>\n",
+       "<td>Ideal</td>  <td>0</td>\n",
+       "  <td>0</td>\n",
+       "  <td>0</td>\n",
+       "  <td>0</td>\n",
+       "  <td>0</td>\n",
+       "  <td>0</td>\n",
+       "</tr>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "<IPython.core.display.HTML object>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "result_table = '<table border=1>\\n'\n",
+    "result_table += '<tr><td>&nbsp;</td><td>&nbsp;</td><th colspan={}>Player 1</th></tr>\\n'.format(len(players))\n",
+    "result_table += '<tr><td>&nbsp;</td><td>&nbsp;</td>'\n",
+    "for i in range(len(players)):\n",
+    "    result_table += '<td>{}</td>'.format(player_names[i])\n",
+    "result_table += '</tr>\\n'\n",
+    "\n",
+    "for i in range(len(players)):\n",
+    "    result_table += '<tr>\\n'\n",
+    "    if i == 0:\n",
+    "        result_table += '<th rowspan={}>Player 2</th>\\n'.format(len(players))\n",
+    "    result_table += '<td>{}</td>'.format(player_names[i])\n",
+    "    for j in range(len(players)):\n",
+    "        result_table += '  <td>{}</td>\\n'.format(results[j, i])\n",
+    "    result_table += '</tr>\\n'\n",
+    "result_table += \"</table>\"\n",
+    "# print(result_table)\n",
+    "display(HTML(result_table))"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "What do these numbers tell us? First, against a trained opponent, the first player is in a very bad position. Indeed, with optimal play (the \"ideal\" player against itself), the first player never wins. However, the disadvantage of first player is almost eliminated with random play.\n",
+    "\n",
+    "We can also see that the non-optimal play can throw off the \"floor 0\" player, while the \"floor 1\" player is more able to cope with non-ideal opponents. \"Floor 0\" ends up only knowing what to do in a few of the game positions. If it ends up outside on of those, it loses badly. This suggest that this player is overtrained, reliant on its opponent doing the right thing. \n",
+    "\n",
+    "All this goes to show that the non-perfect play from \"floor 1\" is an advantage, as it avoids overtraining, keeping the final player more flexible."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": []
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.5.2+"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/nac-trinket/__pycache__/menace.cpython-35.pyc b/nac-trinket/__pycache__/menace.cpython-35.pyc
new file mode 100644 (file)
index 0000000..3015c58
Binary files /dev/null and b/nac-trinket/__pycache__/menace.cpython-35.pyc differ
diff --git a/nac-trinket/__pycache__/nac.cpython-35.pyc b/nac-trinket/__pycache__/nac.cpython-35.pyc
new file mode 100644 (file)
index 0000000..2df5c35
Binary files /dev/null and b/nac-trinket/__pycache__/nac.cpython-35.pyc differ
diff --git a/nac-trinket/main.py b/nac-trinket/main.py
new file mode 100644 (file)
index 0000000..44d0774
--- /dev/null
@@ -0,0 +1,23 @@
+from menace import * 
+import pprint
+import random
+
+pp = pprint.PrettyPrinter()
+
+p1 = new_menace()
+p2 = new_menace()
+
+epochs = 10
+for i in range(epochs):
+  print('Starting epoch', i)
+  train_players(p1, p2, rounds=10**5)
+    
+# pp.pprint(p1)
+# pp.pprint(p2)
+
+ph = new_human()
+
+game_with_players(p1, ph, report_result_for=ph)
+
+
+
diff --git a/nac-trinket/menace.py b/nac-trinket/menace.py
new file mode 100644 (file)
index 0000000..f8adde2
--- /dev/null
@@ -0,0 +1,191 @@
+from nac import *
+
+import itertools
+import functools
+import collections
+import random
+
+INITIAL_BEAD_COUNT = 3
+
+
+def new_game(player1, player2):
+    return {'board': empty_board(),
+           'player1': player1,
+           'player2': player2,
+           'player1_active': True,
+           'history': []}
+
+def game_finished(game):
+    return (winner(game['board']) is not None) or (game['board'].count('.') == 0)
+
+
+def active_player(game):
+    if game['player1_active']:
+        return game['player1']
+    else:
+        return game['player2']
+
+
+def new_menace():
+    boxes = {'human?': False}
+    for b in non_winning_boards():
+        box = collections.Counter()
+        for s in vacants(b):
+            box[s] = INITIAL_BEAD_COUNT
+        boxes[b] = box
+    return boxes
+
+def menace_move(game):
+    board, r, f = canonical(game['board'])
+    player = active_player(game)
+    token = token_for_player(game['player1_active'])
+    cmove = random.choice(list(player[board].elements()))
+    cmove_board = apply_move(empty_board(), cmove, token)
+    moved_board = untransform(cmove_board, r, f)
+    return moved_board.index(token)
+
+def new_human():
+    return {'human?': True}
+
+
+def human_move(game):
+    if game['history']:
+        print('Opponent moved to', game['history'][-1]['move'])
+    else:
+        print('You play first.')
+    print('The board is:')
+    print(show_board(game['board']))
+    
+    valid_moves = vacants(game['board'])
+    valid_input = False
+    
+    while not valid_input:
+        user_input = input('Your move ({})? '.format(', '.join(str(m) for m in valid_moves)))
+        if user_input.isnumeric():
+            move = int(user_input)
+            if move in valid_moves:
+                valid_input = True
+            else:
+                print('Number not a valid move.')
+        else:
+            print('Please enter a number.')
+    return move
+
+def make_move(game):
+    if game['player1_active']:
+        active = game['player1']
+    else:
+        active = game['player2']
+    if active['human?']:
+        move = human_move(game)
+    else:
+        move = menace_move(game)
+    token = token_for_player(game['player1_active'])
+    game['history'] += [{'player1?': game['player1_active'], 'move': move, 'board': game['board']}]
+    game['board'] = apply_move(game['board'], move, token)
+    game['player1_active'] = not game['player1_active'] 
+
+
+def play_game(game):
+    while not game_finished(game):
+        make_move(game)
+
+def winning_player(game):
+    if winner(game['board']) is None:
+        return None
+    elif game['history'][-1]['player1?']:
+        return game['player1']
+    else:
+        return game['player2']
+
+def losing_player(game):
+    if winner(game['board']) is None:
+        return None
+    elif game['history'][-1]['player1?']:
+        return game['player2']
+    else:
+        return game['player1'] 
+
+
+def winning_moves(game):
+    return [h for h in game['history'] 
+            if h['player1?'] == game['history'][-1]['player1?']]
+
+def losing_moves(game):
+      return [h for h in game['history'] 
+            if h['player1?'] != game['history'][-1]['player1?']]
+
+
+def update_players(game, allow_drop_move=False):
+    if winner(game['board']) is not None:
+        update_winner(game)
+        update_loser(game, allow_drop_move=allow_drop_move)
+
+
+def update_winner(game):
+    player = winning_player(game)
+    moves = winning_moves(game)
+    for m in moves:
+        board, r, f = canonical(m['board'])
+        move_board = apply_move(empty_board(), m['move'], '+')
+        cmove_board = transform(move_board, r, f)
+        cmove = cmove_board.index('+')
+        player[board][cmove] += 1
+
+def update_loser(game, allow_drop_move=False):
+    player = losing_player(game)
+    moves = losing_moves(game)
+    for m in moves:
+        board, r, f = canonical(m['board'])
+        move_board = apply_move(empty_board(), m['move'], '+')
+        cmove_board = transform(move_board, r, f)
+        cmove = cmove_board.index('+')
+#         if player[board][cmove] > 1:
+#             player[board][cmove] -= 1
+        if allow_drop_move:
+            if len(list(player[board].elements())) > 1:
+                player[board][cmove] -= 1
+        else:
+            if player[board][cmove] > 1:
+                player[board][cmove] -= 1
+
+
+
+def count_wins(p1, p2, plays=1000):
+    wins = 0
+    draws = 0
+    for _ in range(plays):
+        g = new_game(p1, p2)
+        play_game(g)
+        if winner(g['board']) is None:
+            draws += 1
+        elif winning_player(g) == p1: 
+            wins += 1
+    return wins, draws
+
+
+def game_with_players(p1, p2, report_result_for=None):
+    if random.choice([True, False]):
+        g = new_game(p1, p2)
+    else:
+        g = new_game(p2, p1)
+    play_game(g)
+    
+    if report_result_for:
+      print('\nFinal position')
+      print(show_board(g['board']))
+      if winner(g['board']) is None:
+        print('A draw')
+      elif winning_player(g) == ph:
+        print('You won')
+      else:
+        print('You lost')
+    
+    return g
+
+def train_players(p1, p2, rounds=10000, allow_drop_move=False):
+    for _ in range(rounds):
+        g = game_with_players(p1, p2)
+        update_players(g, allow_drop_move=allow_drop_move)
+    return p1, p2
+    
\ No newline at end of file
diff --git a/nac-trinket/nac.py b/nac-trinket/nac.py
new file mode 100644 (file)
index 0000000..64cf504
--- /dev/null
@@ -0,0 +1,141 @@
+import itertools
+import functools
+import collections
+import random
+
+def xo_count(board):
+    xs = 0
+    os = 0
+    for c in board:
+        if c == 'x':
+            xs += 1
+        elif c == 'o':
+            os += 1
+    return xs, os
+
+def valid_board(board):
+    xs, os = xo_count(board)
+    return (xs - os) == 0 or (xs - os) == 1
+
+def empty_board():
+    return tuple('.' * 9)
+
+
+def all_boards():
+    return [b for b in itertools.product('.xo', repeat=9)
+           if valid_board(b)
+           ]
+
+def winner(board):
+    winning_player = None
+    if board[0] == board[1] == board[2] and board[0] != '.':
+        winning_player = board[0]
+    if board[3] == board[4] == board[5] and board[3] != '.':
+        winning_player = board[3]
+    if board[6] == board[7] == board[8] and board[6] != '.':
+        winning_player = board[6]
+    if board[0] == board[3] == board[6] and board[0] != '.':
+        winning_player = board[0]
+    if board[1] == board[4] == board[7] and board[1] != '.':
+        winning_player = board[1]
+    if board[2] == board[5] == board[8] and board[2] != '.':
+        winning_player = board[2]
+    if board[0] == board[4] == board[8] and board[0] != '.':
+        winning_player = board[0]
+    if board[2] == board[4] == board[6] and board[2] != '.':
+        winning_player = board[2]
+    return winning_player
+
+
+def show_board(b):
+    s = ''.join(b)
+    return s[0:3] + '\n' + s[3:6] + '\n' + s[6:9]
+
+def show_boards(bs):
+    rows = [[], [], []]
+    for b in bs:
+        s = ''.join(b)
+        for i in range(3):
+            rows[i] += [s[i*3:i*3+3]]
+    return '\n'.join('  '.join(r) for r in rows)
+
+
+# 0 1 2    6 3 0
+# 3 4 5 -> 7 4 1
+# 6 7 8    8 5 2
+rotation = {0: 6, 1: 3, 2: 0, 3: 7, 4: 4, 5: 1, 6: 8, 7: 5, 8: 2}
+inverse_rotation = {t: f for f, t in rotation.items()}
+
+# 0 1 2    2 1 0
+# 3 4 5 -> 5 4 3
+# 6 7 8    8 7 6
+reflection = {0: 2, 1: 1, 2: 0, 3: 5, 4: 4, 5: 3, 6: 8, 7: 7, 8: 6}
+
+def rotate(board, n=1):
+    b = board
+    for _ in range(n):
+        b = tuple(b[rotation[i]] for i in range(len(board)))
+    return b
+
+
+def reflect(board, r=True):
+    if r: 
+        return tuple(board[reflection[i]] for i in range(len(board)))
+    else:
+        return board
+
+def transform(board, n, r):
+    b = rotate(board, n)
+    return reflect(b, r)
+
+def untransform(board, n, r):
+    b = reflect(board, r)
+    return rotate(b, abs(4-n))
+
+def all_transforms(board):
+    return [(transform(board, rot, ref), rot, ref)
+            for rot in range(4)
+            for ref in [False, True]]
+
+def score(board):
+    return ''.join(board)
+
+def canonical(board):
+    return max(all_transforms(board), key=lambda brf: score(brf[0]))
+
+def non_winning_boards():
+    return set([canonical(b)[0] for b in all_boards()
+           if not winner(b)
+           ])
+
+
+def successors(board):
+    xs, os = xo_count(board)
+    succs = []
+    if (xs - os) == 0:
+        # add an x
+        for i in range(len(board)):
+            if board[i] == '.':
+                succs += [tuple(board[:i] + ('x',) + board[i+1:])]
+
+    if (xs - os) == 1:
+        # add an o
+        for i in range(len(board)):
+            if board[i] == '.':
+                succs += [tuple(board[:i] + ('o',) + board[i+1:])]
+    return succs
+
+
+def vacants(board):
+    return [i for i, c in enumerate(board) if c == '.']
+
+
+def apply_move(board, position, piece):
+    return tuple(board[:position] + (piece,) + board[position+1:])
+
+def token_for_player(is_player_1):
+    if is_player_1:
+        return 'x'
+    else:
+        return 'o'
+        
\ No newline at end of file
diff --git a/nim-trinket/__pycache__/menace.cpython-35.pyc b/nim-trinket/__pycache__/menace.cpython-35.pyc
new file mode 100644 (file)
index 0000000..294c6b7
Binary files /dev/null and b/nim-trinket/__pycache__/menace.cpython-35.pyc differ
diff --git a/nim-trinket/main.py b/nim-trinket/main.py
new file mode 100644 (file)
index 0000000..94a3f5a
--- /dev/null
@@ -0,0 +1,20 @@
+from menace import * 
+import pprint
+import random
+
+pp = pprint.PrettyPrinter()
+
+p1 = new_menace()
+p2 = new_menace()
+
+train_players(p1, p2)
+    
+pp.pprint(p1)
+# pp.pprint(p2)
+
+ph = new_human()
+
+game_with_players(p1, ph, report_result_for=ph)
+
+
+
diff --git a/nim-trinket/menace.py b/nim-trinket/menace.py
new file mode 100644 (file)
index 0000000..e3b6bbb
--- /dev/null
@@ -0,0 +1,139 @@
+import collections
+import random
+
+INITIAL_GAME_SIZE = 9
+MAX_TAKE = 3
+INITIAL_BEAD_COUNT = 3
+
+def new_menace():
+    boxes = {'human?': False}
+    for b in range(1, INITIAL_GAME_SIZE+1):
+        box = collections.Counter()
+        for i in range(1, MAX_TAKE+1):
+            if b >= i:
+                box[i] = INITIAL_BEAD_COUNT
+        boxes[b] = box
+    return boxes
+    
+def menace_move(box):
+    return random.choice(list(box.elements()))
+    
+def new_human():
+    return {'human?': True}
+    
+def human_move(game):
+    if game['history']:
+        print('Opponent took', game['history'][-1]['move'], 'pieces.')
+    else:
+        print('You play first.')
+    print('There are', game['tokens'], 'pieces left.')
+    
+    max_move = min(MAX_TAKE, game['tokens'])
+    valid_input = False
+    
+    while not valid_input:
+        user_input = input('Your move (1-{})? '.format(max_move))
+        if user_input.isnumeric():
+            move = int(user_input)
+            if move in range(1, max_move+1):
+                valid_input = True
+            else:
+                print('Number not a valid move.')
+        else:
+            print('Please enter a number.')
+    return move
+    
+def new_game(player1, player2):
+    return {'tokens': INITIAL_GAME_SIZE,
+           'player1': player1,
+           'player2': player2,
+           'player1_active': True,
+           'history': []}
+
+def game_finished(game):
+    return game['tokens'] == 0
+    
+def winner(game):
+    if game['history'][-1]['player1?']:
+        return game['player2']
+    else:
+        return game['player1']
+
+def loser(game):
+    if game['history'][-1]['player1?']:
+        return game['player1']
+    else:
+        return game['player2'] 
+    
+    
+def make_move(game):
+    if game['player1_active']:
+        active = game['player1']
+    else:
+        active = game['player2']
+    if active['human?']:
+        move = human_move(game)
+    else:
+        move = menace_move(active[game['tokens']])
+    game['history'] += [{'player1?': game['player1_active'], 'move': move, 'tokens': game['tokens']}]
+    game['tokens'] -= move
+    game['player1_active'] = not game['player1_active'] 
+    
+def play_game(game):
+    while not game_finished(game):
+        make_move(game)
+
+def winning_moves(game):
+    moves = []
+    player1_won = game['history'][-1]['player1?']
+    for m in game['history']:
+        if m['player1?'] != player1_won:
+            moves += [m]
+    return moves
+
+def losing_moves(game):
+    moves = []
+    player1_won = game['history'][-1]['player1?']
+    for m in game['history']:
+        if m['player1?'] == player1_won:
+            moves += [m]
+    return moves
+
+def update_winner(game):
+    player = winner(game)
+    moves = winning_moves(game)
+    for m in moves:
+        player[m['tokens']][m['move']] += 1
+        
+def update_loser(game, allow_drop_move=False):
+    player = loser(game)
+    moves = losing_moves(game)
+    for m in moves:
+        if allow_drop_move:
+            if len(list(player[m['tokens']].elements())) > 1:
+                player[m['tokens']][m['move']] -= 1
+        else:
+            if player[m['tokens']][m['move']] > 1:
+                player[m['tokens']][m['move']] -= 1
+
+
+def game_with_players(p1, p2, report_result_for=None):
+    if random.choice([True, False]):
+        g = new_game(p1, p2)
+    else:
+        g = new_game(p2, p1)
+    play_game(g)
+    if report_result_for:
+        if winner(g) == report_result_for:
+            print('You won')
+        else:
+            print('You lost')
+    return g
+
+def train_players(p1, p2, rounds=10000, allow_drop_move=False):
+    for _ in range(rounds):
+        g = game_with_players(p1, p2)
+        update_winner(g)
+        update_loser(g, allow_drop_move=allow_drop_move)
+    return p1, p2
+    
\ No newline at end of file