From add62f4e95d90eda2c2907937dd9852643140ef0 Mon Sep 17 00:00:00 2001 From: Neil Smith Date: Thu, 11 May 2017 17:39:23 +0100 Subject: [PATCH 1/1] Initial files --- menace-nac.ipynb | 17265 ++++++++++++++++ menace-nim-project.ipynb | 1197 ++ menace-nim.ipynb | 1588 ++ nac-trinket/__pycache__/menace.cpython-35.pyc | Bin 0 -> 6086 bytes nac-trinket/__pycache__/nac.cpython-35.pyc | Bin 0 -> 5921 bytes nac-trinket/main.py | 23 + nac-trinket/menace.py | 191 + nac-trinket/nac.py | 141 + nim-trinket/__pycache__/menace.cpython-35.pyc | Bin 0 -> 4241 bytes nim-trinket/main.py | 20 + nim-trinket/menace.py | 139 + 11 files changed, 20564 insertions(+) create mode 100644 menace-nac.ipynb create mode 100644 menace-nim-project.ipynb create mode 100644 menace-nim.ipynb create mode 100644 nac-trinket/__pycache__/menace.cpython-35.pyc create mode 100644 nac-trinket/__pycache__/nac.cpython-35.pyc create mode 100644 nac-trinket/main.py create mode 100644 nac-trinket/menace.py create mode 100644 nac-trinket/nac.py create mode 100644 nim-trinket/__pycache__/menace.cpython-35.pyc create mode 100644 nim-trinket/main.py create mode 100644 nim-trinket/menace.py diff --git a/menace-nac.ipynb b/menace-nac.ipynb new file mode 100644 index 0000000..8d7b208 --- /dev/null +++ b/menace-nac.ipynb @@ -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": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + "\n", + "
  Player 1
  Floor 1Floor 0NewbiePart trainedFloor 1, million train
Player 2Floor 1 983 / 17376 / 137360 / 105331 / 110924 / 75
Floor 0 21 / 977725 / 275243 / 161232 / 186503 / 496
Newbie 978 / 18680 / 115880 / 120586 / 131983 / 17
Part trained 978 / 20654 / 129573 / 148875 / 125992 / 8
Floor 1, million train 973 / 26390 / 131271 / 135264 / 122903 / 97
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "result_table = '\\n'\n", + "result_table += '\\n'.format(len(players))\n", + "result_table += ''\n", + "for i in range(len(players)):\n", + " result_table += ''.format(player_names[i])\n", + "result_table += '\\n'\n", + "\n", + "for i in range(len(players)):\n", + " result_table += '\\n'\n", + " if i == 0:\n", + " result_table += '\\n'.format(len(players))\n", + " result_table += ''.format(player_names[i])\n", + " for j in range(len(players)):\n", + " result_table += ' \\n'.format(results[j, i][0], results[j, i][1])\n", + " result_table += '\\n'\n", + "result_table += \"
  Player 1
  {}
Player 2{}{} / {}
\"\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 index 0000000..2709a0d --- /dev/null +++ b/menace-nim-project.ipynb @@ -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 index 0000000..8ed2bb2 --- /dev/null +++ b/menace-nim.ipynb @@ -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": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + "
  Player 1
  Floor 1Floor 0Floor 0 stableNewbiePart trainedIdeal
Player 2Floor 1 22122472126
Floor 0 1265157522817837810
Floor 0 stable 511014443754620
Newbie 864676848532515379018837
Part trained 444962223239128637207529
Ideal 000000
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "result_table = '\\n'\n", + "result_table += '\\n'.format(len(players))\n", + "result_table += ''\n", + "for i in range(len(players)):\n", + " result_table += ''.format(player_names[i])\n", + "result_table += '\\n'\n", + "\n", + "for i in range(len(players)):\n", + " result_table += '\\n'\n", + " if i == 0:\n", + " result_table += '\\n'.format(len(players))\n", + " result_table += ''.format(player_names[i])\n", + " for j in range(len(players)):\n", + " result_table += ' \\n'.format(results[j, i])\n", + " result_table += '\\n'\n", + "result_table += \"
  Player 1
  {}
Player 2{}{}
\"\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 index 0000000000000000000000000000000000000000..3015c5800a5504ce0c8539009702514b2fa51df4 GIT binary patch literal 6086 zcmcgwOLHSv6+XB1mhF-4c|~E8Q67_wGKnWIDj_)Y$T&k1fQo^RV4M*xsSg0p6@*G zJv%c~?fvM~hwG!t=yQ-ODiuv zS_EGBQ%YCFpB8^cX*8Y?zozt*__N~ADUAX1;-6G{ zM*LIapH>=!&xn6k>6-YDh+kJ4FFq>%SCpO;|D5=bDUC@U7yrEY4fzC2ofQ8G@t@Q# z%!#h2#D7}5PK$p*{Aa{}R;ySATwfHwsnxUMKd0j_iT}KO0!*;9C%2j}JRqn|lbGk0 zALKxGJT~CN|0li&o99{-#yTT`Tc zS2-?_DJKkF_8F|2N~EqbId4vzd1Ei4y@MzFWadI`&(w5Mt5zn~Ic5?Ss(|X=WxPE$ z$tLK|*kRBNGE?{mDl|aI%|1i0n__m+W7tMW~_+3h4A~ zyD0Y0jBA+v&fj!)aaErZw5+y{d}6v7!dRBnx7^nk!5c~(cY z52Kw1W!_lt+IYAynpxQl8tUX5-S`bv%A2EEjI#QEfLa>_xDQ_{u^ya%J?$@=pKbz&65Y*l0KIwtHP)H@q-9^X*>Hj)MjuK!3Xt z>cE8u|H7wPP6`9WqG3{vH>2HDsZV1`n#f>hm=tL*?O~GNin?J^>Be|Hu-#6Q!&}XQ z8c=IW*VE0#i+vtWxk=&`GE>n{!%mSwY>tLA60MmCTcHdcx^>W2fhW zDs>aD7o<>!A*2hy1fb#2cGk;M@8)E~$ZNSph7Z@|q6Yk(t1qT+PP_j_pRuE|tWNJR z0FFb6Q{Qr$l3aE0k=tfo5l}~Bsc*L7S{X81MHeI8@C)oc?lJo9?LcMq9(va zCVOIP2C_M}I1Nlid<}$?+eF4w7K`*0a1vRFobHLP%)YA77t*Ywh=1K%*(E^=v3(9R zjt+6AtJKWSz6c8YW>o!x?VlKjc_*b+j7)R4GbRsbkF4bDXgdPqm&XZnBd1sYos*ef z6f<9Oj06v1Wbt8)kQw!PpNg!*_iK{%6A>gAv^IKp=6D$Z)FA?VlJC8Y0%=6JtR#D#Q~WHXHABg|;*~?U;5c@{vhGEmlCxHX5iaZ06L=lbM}?-yQ~B`4?99PeIL>$mvbXSM~p&=L14k9OS2m&?>GxwPetu`w-f)9)1w`;g(7YEwDt6n?Z|g!-)NTdK6+7fC#iz z5eNy$;|H|2^J4$1CnEIiSDgr6R}rKyppjzX!1E6u=mPDetnAxh+DWTw>9OrK7DuIJ zZ?cVYN^-p*v^=I`35acKLc=LL`wbQkk(_;p9bYK28|eKMPy7gqVi#na`Qgz|2_;p8J@JoGKqyGQSmtG~r{dJxjHT5d=uuQfN(0BK6{Y~B(}N0fE{Fp% zBibU{$PhlFwnO<}!(4ajdaBpKh(C-mbu}P%=h%H4`hoH5>75Ckw$omw3(Z1Oz+rMD z(5o5ER@8r}fiz2rH+Tup%dG#&aWkA;~sa zOmwSRUS7F5s#R}x!*;JRKpMhZ62*E{yxt&aqY{s4yHPkQlYloK;_QA73|roNObFp6 zR+(2EiUWe!M9Tb4HolJ{nX|zlvcokS#5=tqFBR-EJ2lW{(JqYAYV?c~5 z7Gv(r=tUDmsOsn~TgD*7toQJzOKOB^7ALqYT3j;uv5vIg;<$$~IRn4l4aW@r0mEXZ zRD$cH8W^)Hpquqp4wsfV{NVsOjG|tgRMvOGj*^y{oD&7_P4;U$2;( eE=}k0RPfDDpPjCuEGu286{oAUleL-J$$tZ3EmrFQ literal 0 HcmV?d00001 diff --git a/nac-trinket/__pycache__/nac.cpython-35.pyc b/nac-trinket/__pycache__/nac.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2df5c35cb17383892f30bdbc01525d08b41b03bd GIT binary patch literal 5921 zcmbtY&2t+`74M#rWJ{Jm5+|{hWV24P$wpyg=VO;F8xyh>LjeUYC~s{FEiNO^j2*?2 zM(L3g$CVtGWMSd9@K;b<6bFj`f+MH7a`K5IREh(?-|Lx{7X%(JT;TtMECtWOgQ-up6I;Ndh;RT_=?V<|b5*piGQsHHx z!TD_!UJ)8w*Hw5`Xh`x66}}@hw!WsqMWLb3k_xX2T~px=72XsY@@TbIzjZ)Mt_Coj zd@szo#o@0iuZe!x(S^1-&_y=e) z?`^Eb9}h4M16v;UEv_1Fnd-d*dyoI1>V>qp88=OsdV5Lg#Yw6IQ^YK3UVpIkFz!T4 z-Kf=GT8V?*PSouuOFa{Bn`Woe>TWM#q#0mFGq~0_t?o|LC%xEvmX7bm8$rC=?U$(6 z3>u|N_)hAoTvOUiV9dcl2s~T@!*vjSMb+U7Klg|S6tc?90~x5=TXKDm{k6Jp6*S~j zx7_Q#;r3>X%{UvUoT;FjPCRM0Tj7RaKp7KSL+Rt%RB;d3$vZ=+$T~B%1d_SKDKzDpK=w}>?mP0A$up{%whB*9IMldhq;QASdam%5c zbNHjouMBbctBhb?#=-SRwZIlui+|+vofcC%(>CMa`WXiRzzI%^8!{gvISxOO5zNat zxPHa~n2`e%w=yI$e^`s($q43U99(}?3n#;0zQW;eG6I`r99(}?2FKx_G9S1(Elzn9 zav+22lLO;qVkl7@&~Xe7Sam@6IiN!y(De?OI1ZRN4qW1>dy-Dlsi&=O7wK=K*KR(G z%#hPcc$fHhWZuBq5H z2{BUbVAMeSJ(7-6aQEKlygOh7z{RW)~ zE(1T?g0;kVekEsPAC-a>4zPXZ0$9yz=yM#1C=;BH+>kon;zkTtT7Q<-$4q-l)@s)H zT&ZFBblk-KX1^6PTBxR}qk%&(a;#~nr+FLAk8$O;ugS7#=xlUm_stcqm`0QO?Wmg- zEvfFNdcz``u_tF7q7)$dA(=BXF}sMF8JQnB5UCpjQb4>70y{^nF~(Sv0i2p!O2=r%zX7B0|1mtqE7~P=#YRGN~8r zZY*1k$T08*r(jy{Be0XL*mNFX-XMp*hu(-7Tq0tSRVIe)>%@S;;PJ5NJdH+yyj2Ng z_zndU(Ne#;nS4FbCQzs6!hM4E1L5d7E?$^5i4iY}m&2|k=Wgaitc=}Ct{B5L%awQ0 zY};UaH%qn9X4^yJKQB?O=#J2iXajR0wtV%4uaM|jtJb~meFPH|xh&f>e1t{n!_v9w z9q@Q4QtB7DM60q!wR(XSrPFvg8M}(r!l}i_hFRvcc-GV?pN)JIreE_d^c(<$j*fkw zQ&?_5<41x4;1cukgaY%6_9osdDmXpTViLqALQuLA_yf=*TR7LrJeXc9k!=$s&d68n zYI$t&ccNz_t7#<(K^ExN@vyFzOGq6cAvdk-hQDdHY{DBzIKJF&b~eN2-G`Wy;8Oc% zf@U}Fw(vkO6v){uJZAWv=AIyx<9bNvvRe+1aeC8(09!fgr^xKx9UPy0Pxbj zQ4lSTNdBVmJ6M*v_OXnuJ+am!pOP0{sSq|08;^_x;%lKJIs)MEC>Gbhg7E})S}X3Rf=(`N3kcX zH|+KJPX3l+9urW+n}2=X{k}YMzp?+Z-a@57!BZImHyBw9<#@Y@<|w`Q-` zezwtxpG2Q=UwQ=uTR}TwBicy>WAMW+sAyoRHN-_;Ls<`_T?9$w&xux&JwI;TID~FG z(~oze?gnawYzof9LFrQP%y-eRpD`zKOUqlk-N3#^nF!)`R%|6G6r0^J?pWvLLxH?s zvZ-W&-Ain)vROov7V$c!lQd>p-6xSrqK&-JHMcm$6+3e38rB7px8*pH1ZeJYjQ%T@ z6O=^IA?;{E`{r$Yxq~-8?dUGCOUS*7H-q?k)k?L1Z?Sq3ZFO1Kip$>g*mNly^{alh JR6T~C{~!E(!_)u( literal 0 HcmV?d00001 diff --git a/nac-trinket/main.py b/nac-trinket/main.py new file mode 100644 index 0000000..44d0774 --- /dev/null +++ b/nac-trinket/main.py @@ -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 index 0000000..f8adde2 --- /dev/null +++ b/nac-trinket/menace.py @@ -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 index 0000000..64cf504 --- /dev/null +++ b/nac-trinket/nac.py @@ -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 index 0000000000000000000000000000000000000000..294c6b746d9aca20c0c31085efeee634b4d407cf GIT binary patch literal 4241 zcmcIn&2JmW6@RnKU4DoZ^=X@m6Ekt*noTWLM%$!?9apuaz-_|>ky(W8^Fn7y7f4SDjlm-6lF)h5)1=EngJFjBtk6@W=Sa^B4dw;Xi$a%3Um<-} zXe_)&x*~L$^b+Y;gvLv*lYUj`S<~;a3DL1fF-B~PF=*4(Q;XJjKB5yv zu|-d9Iwd->=y-L+1+$H~uG5K4FBHA7>A)egNwGsOEbiVr+@!}$63^c|tfEJdF;gG7 z`~7Y!c(8eiU;ALAx%H^AkxaG2PRDDo$ zV$USG57vIy++O?DMlv^A@{5hN_2$D5e^cMCWg5 zoIyjXsFsHJw3=3i2ivR|U;Jc0h}kP3VCSb|R@fr7?5QIBw`!_h%Oox=p~G(Cw)aE7 z?IoFxAH_+|>v$q+O_?HIBFdyq8Qo+mm8sbcpLuf_h%7Xu%p%%0lcS5rMU(=FF#@(~ z_Sh%e6Ypk|P3)3q?ZtEa-q9XcK#$dBgpE=51v=0Y+f+I6I)iV@iY+#!+=Tr&UQ0LM!Y|0Uv-M4ZF6bf!n0$5^~oo2e(+eYhqx&j+Os zd%Z9KlB#hS9vF_aB*U&4WP85X_M+uM`IE3;?R8qutGm95;^jepd*3r&wPn1-jl%;k zhz7-!x!Un|2OiG(;;GaN_pt2xXk%c@Ry@rNVLEW$lYQdUU zu9a7dh@7ITsJvCO5Ib*xqb=YC!B57i0G4Nf90o@Ugw%PGz>&K5hKE$>oP-ZsK9yg(-_FNH0i9+<_g@K~CXpWq!u^ z!!TzNi-H9{FZt|C&09%_x#yBo8748#b~#Q`@W7DKw`ot&JNCV_?^H1RZrTHPkwow}@99?T zHPghli}exLcU;;PRY{q$#cB$vbl+cX(Wy;#>SF_P;*e7 zfo6v#cE=0MJa-q+V2Z;#DYrVE@TjRx*b^X|RptoCZrg} zp7hbhA#CuWgHOGbgR4$--~d#e;NsZd-W+7PRzoxoa!f#nxaOK!NMtxS%8@S_DaF|< z7(?A|^;U7;O=gYP3r*ZKUexczO;lHj+PfG%vvR;6`SE@;MW%d^4O8!;nzPDCy__I8 z3FFW~Z8L-1*=8H@#o!x9(=X9EzAqRQE3NOWFx=9h8d}N`GocdZ@){O`){^^9l~RW# z`7Q(JE*B|Q-TVk|MCkAivbn%tyahx2gh$^&gHIKFjp<0(6V)_7<(cVmBPC!dHZ4CG zY56H8hZWR3@;a(OW$t6FwrH}vPK?aTNr`IsjFzt{Im--xXrxEmEv8@)N?jo6u_ZNs(t23q>2hE5$5Y7j3DSDdzBV I%f)i(zds=KIsgCw literal 0 HcmV?d00001 diff --git a/nim-trinket/main.py b/nim-trinket/main.py new file mode 100644 index 0000000..94a3f5a --- /dev/null +++ b/nim-trinket/main.py @@ -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 index 0000000..e3b6bbb --- /dev/null +++ b/nim-trinket/menace.py @@ -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 -- 2.34.1