{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"
' + size * '{}')\n",
" return ('').format(*squares)\n",
" \n",
"def square_html(sq) -> str:\n",
" \"An HTML representation of a square.\"\n",
" color, size, text = (bonus_colors[sq] if sq in EMPTY else ('gold', 120, sq))\n",
" return ('''{}{}'''\n",
" .format(color, size, text, POINTS[text] or ''))\n",
"\n",
"bonus_colors = {\n",
" DL: ('lightblue', 66, 'DL'),\n",
" TL: ('lightgreen', 66, 'TL'),\n",
" DW: ('lightcoral', 66, 'DW'),\n",
" TW: ('orange', 66, 'TW'),\n",
" SL: ('whitesmoke', 66, ''),\n",
" STAR: ('violet', 99, '✭')}"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"We'll define the standard boards for Words with Friends® and Scrabble®:"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/html": [
" | | | TW | | | TL | | TL | | | TW | | | | | | DL | | | DW | | | | DW | | | DL | | | | DL | | | DL | | | | | | DL | | | DL | | TW | | | TL | | | | DW | | | | TL | | | TW | | | DL | | | | DL | | DL | | | | DL | | | | DW | | | | TL | | | | TL | | | | DW | | TL | | | | DL | | | | | | DL | | | | TL | | | | DW | | | | ✭ | | | | DW | | | | TL | | | | DL | | | | | | DL | | | | TL | | DW | | | | TL | | | | TL | | | | DW | | | | DL | | | | DL | | DL | | | | DL | | | TW | | | TL | | | | DW | | | | TL | | | TW | | DL | | | DL | | | | | | DL | | | DL | | | | DL | | | DW | | | | DW | | | DL | | | | | | TW | | | TL | | TL | | | TW | | | | "
],
"text/plain": [
"['█',\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",
" '.',\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",
" '=',\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",
" '.',\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",
" '∴',\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",
" '.',\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",
" '█']"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"WWF = Board(\"\"\"\n",
"█ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █\n",
"█ . . . ≡ . . ∴ . ∴ . . ≡ . . . █\n",
"█ . . : . . = . . . = . . : . . █\n",
"█ . : . . : . . . . . : . . : . █\n",
"█ ≡ . . ∴ . . . = . . . ∴ . . ≡ █\n",
"█ . . : . . . : . : . . . : . . █\n",
"█ . = . . . ∴ . . . ∴ . . . = . █\n",
"█ ∴ . . . : . . . . . : . . . ∴ █\n",
"█ . . . = . . . * . . . = . . . █\n",
"█ ∴ . . . : . . . . . : . . . ∴ █\n",
"█ . = . . . ∴ . . . ∴ . . . = . █\n",
"█ . . : . . . : . : . . . : . . █\n",
"█ ≡ . . ∴ . . . = . . . ∴ . . ≡ █\n",
"█ . : . . : . . . . . : . . : . █\n",
"█ . . : . . = . . . = . . : . . █\n",
"█ . . . ≡ . . ∴ . ∴ . . ≡ . . . █\n",
"█ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █\n",
"\"\"\".split(), bingo=35)\n",
"\n",
"WWF"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"TW | | | DL | | | | TW | | | | DL | | | TW | | DW | | | | TL | | | | TL | | | | DW | | | | DW | | | | DL | | DL | | | | DW | | | DL | | | DW | | | | DL | | | | DW | | | DL | | | | | DW | | | | | | DW | | | | | | TL | | | | TL | | | | TL | | | | TL | | | | DL | | | | DL | | DL | | | | DL | | | TW | | | DL | | | | ✭ | | | | DL | | | TW | | | DL | | | | DL | | DL | | | | DL | | | | TL | | | | TL | | | | TL | | | | TL | | | | | | DW | | | | | | DW | | | | | DL | | | DW | | | | DL | | | | DW | | | DL | | | DW | | | | DL | | DL | | | | DW | | | | DW | | | | TL | | | | TL | | | | DW | | TW | | | DL | | | | TW | | | | DL | | | TW | "
],
"text/plain": [
"['█',\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",
" '.',\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",
" '∴',\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",
" ':',\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",
" '=',\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",
" '.',\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",
" '█']"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"SCRABBLE = Board(\"\"\"\n",
"█ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █\n",
"█ ≡ . . : . . . ≡ . . . : . . ≡ █\n",
"█ . = . . . ∴ . . . ∴ . . . = . █\n",
"█ . . = . . . : . : . . . = . . █\n",
"█ : . . = . . . : . . . = . . : █\n",
"█ . . . . = . . . . . = . . . . █\n",
"█ . ∴ . . . ∴ . . . ∴ . . . ∴ . █\n",
"█ . . : . . . : . : . . . : . . █\n",
"█ ≡ . . : . . . * . . . : . . ≡ █\n",
"█ . . : . . . : . : . . . : . . █\n",
"█ . ∴ . . . ∴ . . . ∴ . . . ∴ . █\n",
"█ . . . . = . . . . . = . . . . █\n",
"█ : . . = . . . : . . . = . . : █\n",
"█ . . = . . . : . : . . . = . . █\n",
"█ . = . . . ∴ . . . ∴ . . . = . █\n",
"█ ≡ . . : . . . ≡ . . . : . . ≡ █\n",
"█ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █\n",
"\"\"\".split(), bingo=50)\n",
"\n",
"SCRABBLE"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"# Plays\n",
"\n",
"A `Play` describes the placement of tiles on the board. We will implement `Play` as a named tuple of four components:\n",
"- `start`: the index number of the square that holds the first letter in the word.\n",
"- `dir`: the direction, with 1 indicating `ACROSS` and `board.down` (normally, 17) indicating `DOWN`.\n",
"- `letters`: the letters of the word, in order, as a `str`. Blanks are lowercase. Some letters are from the rack; some may have been on the board.\n",
"- `rack`: the letters that would remain in the player's rack after making this play. Not strictly necessary as part of the play, but useful information.\n",
"\n",
"The function `make_play` returns a new board with the play made on it. It does not do any checking to see if the play is legal."
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"button": false,
"collapsed": true,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"source": [
"Play = namedtuple('Play', 'start, dir, letters, rack')\n",
"\n",
"def make_play(board, play) -> Board:\n",
" \"Make the play on a copy of board and return the copy.\"\n",
" copy = Board(board)\n",
" end = play.start + len(play.letters) * play.dir\n",
" copy[play.start:end:play.dir] = play.letters\n",
" return copy"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"# Example Board\n",
"\n",
"Let's test out what we've done so far. I'll take some words from a previous game and put them on `board`:"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/html": [
" | | | TW | | | TL | | TL | | | TW | | | | | | DL | | | DW | | | | DW | | | DL | | | | DL | | | DL | | | | | | DL | | | DL | | TW | | | TL | | | | DW | | | | TL | | | TW | | | DL | | | | DL | | DL | | | | DL | | | | DW | | | | TL | | | | TL | | | | DW | B3 | TL | | | | DL | | | | | | DL | T1 | O1 | U1 | R1 | | G2 | | DW | | | | B3 | E1 | | C3 | DW | | | I1 | TL | A1 | | | M3 | | | | N1 | | H4 | E1 | A1 | R1 | D2 | | V4 | I1 | R1 | U1 | L1 | e | N1 | T1 | TL | I1 | | | DW | L1 | | E1 | DL | | S1 | | DL | | E1 | | L1 | | DL | | E1 | TW | | | TL | E1 | | | DW | R1 | E1 | D2 | TL | | | S1 | | DL | | | S1 | | | | | | R1 | | | DL | | | | DL | | | DW | | | | DW | E1 | | DL | | | | | | TW | | | TL | | TL | | N1 | TW | | | | "
],
"text/plain": [
"['█',\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",
" '.',\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",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" 'B',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'T',\n",
" 'O',\n",
" 'U',\n",
" 'R',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" 'G',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'B',\n",
" 'E',\n",
" '.',\n",
" 'C',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" 'I',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" 'A',\n",
" '.',\n",
" '.',\n",
" 'M',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'N',\n",
" '.',\n",
" 'H',\n",
" 'E',\n",
" 'A',\n",
" 'R',\n",
" 'D',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" 'V',\n",
" 'I',\n",
" 'R',\n",
" 'U',\n",
" 'L',\n",
" 'e',\n",
" 'N',\n",
" 'T',\n",
" '∴',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" 'L',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" 'E',\n",
" ':',\n",
" '.',\n",
" 'S',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'E',\n",
" '.',\n",
" 'L',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'E',\n",
" '█',\n",
" '█',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" 'E',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" 'R',\n",
" 'E',\n",
" 'D',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" 'S',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" 'S',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'R',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" 'E',\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",
" '█']"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"DOWN = WWF.down\n",
"plays = {Play(145, DOWN, 'ENTER', ''),\n",
" Play(144, ACROSS, 'BE', ''),\n",
" Play(138, DOWN, 'GAVE', ''),\n",
" Play(158, DOWN, 'MUSES', ''),\n",
" Play(172, ACROSS, 'VIRULeNT', ''),\n",
" Play(213, ACROSS, 'RED', ''),\n",
" Play(147, DOWN, 'CHILDREN', ''),\n",
" Play(164, ACROSS, 'HEARD', ''),\n",
" Play(117, DOWN, 'BRIDLES', ''),\n",
" Play(131, ACROSS, 'TOUR', '')}\n",
"\n",
"board = Board(WWF)\n",
"for play in plays:\n",
" board = make_play(board, play)\n",
"board"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"# Strategy for Finding All Legal Plays\n",
"\n",
"This is our strategy for finding all possible legal plays on a board:\n",
"\n",
"1. Find all *anchor squares* on the board. An anchor square is an empty square that is adjacent to a letter on the board—every legal move must place a letter on an anchor square. (One exception: on the game's first play, there are no letters on the board, and the `STAR` square in the center counts as the only anchor square.)\n",
"2. Using just the letters in the rack, find all *prefixes* of words in the dictionary. For example, with the rack `ABC`, we find that `B`, `BA`, and `BAC` are all prefixes of the word `BACK` (and the rack contains other prefixes of other words as well, such as `CA` and `CAB`).\n",
"3. For each anchor square and for both directions (across and down):\n",
" - Try each prefix before the anchor (that is, to the left or above the anchor). Don't allow a prefix to extend to another anchor or off the board. That means we won't have to worry about *cross words* for the prefix. If there are already letters on the board before the anchor point, use them as the (only possible) prefix rather than using the prefixes from the rack. For each prefix that fits:\n",
" - Starting at the anchor, march across (or down) one square at a time, trying to fill empty squares with each possible letter from the rack that forms a valid prefix of a word in the dictionary. If the march hits letters that are already on the board, make sure they form a valid prefix too. Also check that any cross words are valid words. When we make a complete word (with an empty or `OFF` square ahead), yield the play that made the word.\n",
" \n",
"So, each legal play will have zero or more prefix letters (which either all come from the rack or all were already on the board), followed by one letter from the rack covering an anchor square, followed by zero or more additional letters (which can be a mix of letters from the rack and letters already on the board). A legal play must be proceeded and followed by either an empty or `OFF` square."
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"# Anchor Squares\n",
"\n",
"An anchor square is either the star in the middle of the board, or an empty square that is adjacent to a letter:"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"source": [
"def is_anchor(board, s) -> bool:\n",
" \"Is this square next to a letter already on the board? (Or is it a '*')?\"\n",
" return (board[s] == STAR or\n",
" board[s] in EMPTY and any(board[s + d].isalpha() for d in board.directions))\n",
"\n",
"def all_anchors(board) -> list:\n",
" \"A list of all anchor squares on the board.\"\n",
" return [s for s in range(len(board)) if is_anchor(board, s)]"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"[144]"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# The only anchor on an empty board is the star in the middle\n",
"all_anchors(WWF) "
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"# Prefixes\n",
"\n",
"Here we define the set of all prefixes of all words in the dictionary, and investigate the set:"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"button": false,
"collapsed": true,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"source": [
"def dict_prefixes(dictionary) -> set:\n",
" \"The set of all prefixes of each word in a dictionary.\"\n",
" return {word[:i] for word in dictionary for i in range(len(word))}\n",
"\n",
"PREFIXES = dict_prefixes(DICTIONARY)"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"276374"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(PREFIXES)"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"['REDRAWER',\n",
" 'TRIVE',\n",
" 'MENT',\n",
" 'CORPO',\n",
" 'TALESME',\n",
" 'DAVENPO',\n",
" 'TEMPORIZATIO',\n",
" 'PLURA',\n",
" 'CRUP',\n",
" 'SPOOR']"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"random.sample(PREFIXES, 10)"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Here are all the prefixes from a tiny dictionary of three words. Note that the empty string is a prefix, and `HELP` is included because it is a prefix of `HELPER`, but `HELPER` is not included because there is no letter we can add to `HELPER` to make a word in this dictionary:"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"{'', 'H', 'HE', 'HEL', 'HELL', 'HELP', 'HELPE'}"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dict_prefixes({'HELLO', 'HELP', 'HELPER'})"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"The function `rack_prefixes` gives the set of prefixes that can be made just from the letters in the rack (returning them in shortest-first order). Most of the work is done by `extend_prefixes`, which accumulates a set of prefixes into `results`. The function `remove(tiles, rack)` removes letters from a rack (after they have been played)."
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"button": false,
"collapsed": true,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"source": [
"def rack_prefixes(rack) -> set: \n",
" \"All word prefixes that can be made by the rack.\"\n",
" return sorted(set(extend_prefixes('', rack, set())), key=len)\n",
"\n",
"def extend_prefixes(prefix, rack, results) -> set:\n",
" \"Add possible prefixes to `results`.\"\n",
" if prefix.upper() in PREFIXES:\n",
" results.add(prefix)\n",
" for L in letters(rack):\n",
" extend_prefixes(prefix+L, remove(L, rack), results)\n",
" return results\n",
"\n",
"def remove(tiles, rack) -> str:\n",
" \"Return a copy of rack with the given tile(s) removed.\"\n",
" for tile in tiles:\n",
" if tile.islower(): tile = BLANK\n",
" rack = rack.replace(tile, '', 1)\n",
" return rack"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"['', 'A', 'B', 'C', 'BA', 'AB', 'CA', 'AC', 'CAB', 'BAC']"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"rack = 'ABC'\n",
"rack_prefixes(rack)"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"The number of prefixes in a rack is usually on the order of a hundred or two:"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"155"
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(rack_prefixes('LETTERS'))"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"196"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(rack_prefixes('ERYINNA'))"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"178"
]
},
"execution_count": 28,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(rack_prefixes('XNMNAIE'))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Unless there is a blank in the rack, in which case it is more like a thousand or two:"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"1590"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(rack_prefixes('LETTER_'))"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"1809"
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(rack_prefixes('ERYINN_'))"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"# Plays on Example Board\n",
"\n",
"Let's work through the process of finding plays on the example `board`. First, we'll find all the anchors:"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"54"
]
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"anchors = all_anchors(board)\n",
"len(anchors)"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"To visualize these anchors, we'll make each one be a star, on a copy of `board`:"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/html": [
" | | | TW | | | TL | | TL | | | TW | | | | | | DL | | | DW | | | | DW | | | DL | | | | DL | | | DL | | | | | | DL | | | DL | | TW | | | TL | | | | DW | | | | TL | | | TW | | | DL | | | | DL | | DL | | | | DL | | ✭ | | DW | | | | TL | | | | TL | | ✭ | ✭ | ✭ | B3 | TL | ✭ | | | DL | | | ✭ | ✭ | | ✭ | T1 | O1 | U1 | R1 | ✭ | G2 | ✭ | DW | ✭ | | ✭ | B3 | E1 | ✭ | C3 | ✭ | ✭ | ✭ | I1 | ✭ | A1 | ✭ | ✭ | M3 | ✭ | ✭ | ✭ | N1 | ✭ | H4 | E1 | A1 | R1 | D2 | ✭ | V4 | I1 | R1 | U1 | L1 | e | N1 | T1 | ✭ | I1 | ✭ | ✭ | ✭ | L1 | ✭ | E1 | ✭ | ✭ | S1 | ✭ | ✭ | ✭ | E1 | ✭ | L1 | ✭ | DL | ✭ | E1 | TW | ✭ | | ✭ | E1 | ✭ | | ✭ | R1 | E1 | D2 | ✭ | | ✭ | S1 | | DL | | ✭ | S1 | ✭ | | | ✭ | ✭ | R1 | ✭ | | DL | ✭ | | | DL | | ✭ | DW | | | | ✭ | E1 | ✭ | DL | | | | | | TW | | | TL | | TL | ✭ | N1 | ✭ | | | | "
],
"text/plain": [
"['█',\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",
" '.',\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",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '*',\n",
" '*',\n",
" '*',\n",
" 'B',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" '*',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '*',\n",
" '*',\n",
" '.',\n",
" '*',\n",
" 'T',\n",
" 'O',\n",
" 'U',\n",
" 'R',\n",
" '█',\n",
" '█',\n",
" '*',\n",
" 'G',\n",
" '*',\n",
" '=',\n",
" '*',\n",
" '.',\n",
" '*',\n",
" 'B',\n",
" 'E',\n",
" '*',\n",
" 'C',\n",
" '*',\n",
" '*',\n",
" '*',\n",
" 'I',\n",
" '█',\n",
" '█',\n",
" '*',\n",
" 'A',\n",
" '*',\n",
" '*',\n",
" 'M',\n",
" '*',\n",
" '*',\n",
" '*',\n",
" 'N',\n",
" '*',\n",
" 'H',\n",
" 'E',\n",
" 'A',\n",
" 'R',\n",
" 'D',\n",
" '█',\n",
" '█',\n",
" '*',\n",
" 'V',\n",
" 'I',\n",
" 'R',\n",
" 'U',\n",
" 'L',\n",
" 'e',\n",
" 'N',\n",
" 'T',\n",
" '*',\n",
" 'I',\n",
" '*',\n",
" '*',\n",
" '*',\n",
" 'L',\n",
" '█',\n",
" '█',\n",
" '*',\n",
" 'E',\n",
" '*',\n",
" '*',\n",
" 'S',\n",
" '*',\n",
" '*',\n",
" '*',\n",
" 'E',\n",
" '*',\n",
" 'L',\n",
" '*',\n",
" ':',\n",
" '*',\n",
" 'E',\n",
" '█',\n",
" '█',\n",
" '≡',\n",
" '*',\n",
" '.',\n",
" '*',\n",
" 'E',\n",
" '*',\n",
" '.',\n",
" '*',\n",
" 'R',\n",
" 'E',\n",
" 'D',\n",
" '*',\n",
" '.',\n",
" '*',\n",
" 'S',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '*',\n",
" 'S',\n",
" '*',\n",
" '.',\n",
" '.',\n",
" '*',\n",
" '*',\n",
" 'R',\n",
" '*',\n",
" '.',\n",
" ':',\n",
" '*',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '*',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '*',\n",
" 'E',\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",
" '█']"
]
},
"execution_count": 32,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"board2 = Board(board)\n",
"for a in anchors:\n",
" board2[a] = STAR\n",
" \n",
"board2"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Now we'll define a rack, and find all the prefixes for the rack:"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"88"
]
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"rack = 'ABCHKNQ'\n",
"\n",
"prefixes = rack_prefixes(rack)\n",
"len(prefixes)"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"' C H Q K A B N BA CA BH KH CN KB KA KN AB AQ CH NA AC HA AN AH AK QA CHA KAC KAN HAK KNA KAB BAH BHA CAB ANK AHC ABH HAC ANC KBA KAH CAK CAH NAC ACQ BAK ACN KHA NAK BAC CAN HAN ANH ACK NAB HAB ABN QAN BAN ACH ACKN HANK BANC KANB CHAN CHAK CANK NACH KACH BACH KNAC HANC KHAN HACK BACK BHAN ANCH ANKH CHAB BANQ BANK CHAQ BHAK HACKB BANKC BACKH HACKN'"
]
},
"execution_count": 34,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"' '.join(prefixes)"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"We won't go through all the anchor/prefix combinations; we'll just pick one: the anchor above the `M` in `MUSES`:"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/html": [
" | | | TW | | | TL | | TL | | | TW | | | | | | DL | | | DW | | | | DW | | | DL | | | | DL | | | DL | | | | | | DL | | | DL | | TW | | | TL | | | | DW | | | | TL | | | TW | | | DL | | | | DL | | DL | | | | DL | | | | DW | | | | TL | | | | TL | | | | DW | B3 | TL | | | | DL | | | | | | DL | T1 | O1 | U1 | R1 | | G2 | | DW | ✭ | | | B3 | E1 | | C3 | DW | | | I1 | TL | A1 | | | M3 | | | | N1 | | H4 | E1 | A1 | R1 | D2 | | V4 | I1 | R1 | U1 | L1 | e | N1 | T1 | TL | I1 | | | DW | L1 | | E1 | DL | | S1 | | DL | | E1 | | L1 | | DL | | E1 | TW | | | TL | E1 | | | DW | R1 | E1 | D2 | TL | | | S1 | | DL | | | S1 | | | | | | R1 | | | DL | | | | DL | | | DW | | | | DW | E1 | | DL | | | | | | TW | | | TL | | TL | | N1 | TW | | | | "
],
"text/plain": [
"['█',\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",
" '.',\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",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" 'B',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'T',\n",
" 'O',\n",
" 'U',\n",
" 'R',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" 'G',\n",
" '.',\n",
" '=',\n",
" '*',\n",
" '.',\n",
" '.',\n",
" 'B',\n",
" 'E',\n",
" '.',\n",
" 'C',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" 'I',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" 'A',\n",
" '.',\n",
" '.',\n",
" 'M',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'N',\n",
" '.',\n",
" 'H',\n",
" 'E',\n",
" 'A',\n",
" 'R',\n",
" 'D',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" 'V',\n",
" 'I',\n",
" 'R',\n",
" 'U',\n",
" 'L',\n",
" 'e',\n",
" 'N',\n",
" 'T',\n",
" '∴',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" 'L',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" 'E',\n",
" ':',\n",
" '.',\n",
" 'S',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'E',\n",
" '.',\n",
" 'L',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'E',\n",
" '█',\n",
" '█',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" 'E',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" 'R',\n",
" 'E',\n",
" 'D',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" 'S',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" 'S',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'R',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" 'E',\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",
" '█']"
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"board3 = Board(board)\n",
"anchor = 141\n",
"board3[anchor] = STAR\n",
"board3"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"There's only room for prefixes of length 0 or 1, because anything longer than that would hit the anchor to the right of the `G` in `GAVE`; to avoid duplication of effort, we only allow words to run into other anchors on the right, not the left. Let's try the 1-letter prefix `B` first:"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/html": [
" | | | TW | | | TL | | TL | | | TW | | | | | | DL | | | DW | | | | DW | | | DL | | | | DL | | | DL | | | | | | DL | | | DL | | TW | | | TL | | | | DW | | | | TL | | | TW | | | DL | | | | DL | | DL | | | | DL | | | | DW | | | | TL | | | | TL | | | | DW | B3 | TL | | | | DL | | | | | | DL | T1 | O1 | U1 | R1 | | G2 | | B3 | ✭ | | | B3 | E1 | | C3 | DW | | | I1 | TL | A1 | | | M3 | | | | N1 | | H4 | E1 | A1 | R1 | D2 | | V4 | I1 | R1 | U1 | L1 | e | N1 | T1 | TL | I1 | | | DW | L1 | | E1 | DL | | S1 | | DL | | E1 | | L1 | | DL | | E1 | TW | | | TL | E1 | | | DW | R1 | E1 | D2 | TL | | | S1 | | DL | | | S1 | | | | | | R1 | | | DL | | | | DL | | | DW | | | | DW | E1 | | DL | | | | | | TW | | | TL | | TL | | N1 | TW | | | | "
],
"text/plain": [
"['█',\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",
" '.',\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",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" 'B',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'T',\n",
" 'O',\n",
" 'U',\n",
" 'R',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" 'G',\n",
" '.',\n",
" 'B',\n",
" '*',\n",
" '.',\n",
" '.',\n",
" 'B',\n",
" 'E',\n",
" '.',\n",
" 'C',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" 'I',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" 'A',\n",
" '.',\n",
" '.',\n",
" 'M',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'N',\n",
" '.',\n",
" 'H',\n",
" 'E',\n",
" 'A',\n",
" 'R',\n",
" 'D',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" 'V',\n",
" 'I',\n",
" 'R',\n",
" 'U',\n",
" 'L',\n",
" 'e',\n",
" 'N',\n",
" 'T',\n",
" '∴',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" 'L',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" 'E',\n",
" ':',\n",
" '.',\n",
" 'S',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'E',\n",
" '.',\n",
" 'L',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'E',\n",
" '█',\n",
" '█',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" 'E',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" 'R',\n",
" 'E',\n",
" 'D',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" 'S',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" 'S',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'R',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" 'E',\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",
" '█']"
]
},
"execution_count": 36,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"board3[140] = 'B'\n",
"board3"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Now we can start to march forward. On the anchor square we can place any letter from the rack that makes a valid prefix, and that also turns `\".MUSES\"` into a valid word. There's only one such letter, `A`:"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/html": [
" | | | TW | | | TL | | TL | | | TW | | | | | | DL | | | DW | | | | DW | | | DL | | | | DL | | | DL | | | | | | DL | | | DL | | TW | | | TL | | | | DW | | | | TL | | | TW | | | DL | | | | DL | | DL | | | | DL | | | | DW | | | | TL | | | | TL | | | | DW | B3 | TL | | | | DL | | | | | | DL | T1 | O1 | U1 | R1 | | G2 | | B3 | A1 | | | B3 | E1 | | C3 | DW | | | I1 | TL | A1 | | | M3 | | | | N1 | | H4 | E1 | A1 | R1 | D2 | | V4 | I1 | R1 | U1 | L1 | e | N1 | T1 | TL | I1 | | | DW | L1 | | E1 | DL | | S1 | | DL | | E1 | | L1 | | DL | | E1 | TW | | | TL | E1 | | | DW | R1 | E1 | D2 | TL | | | S1 | | DL | | | S1 | | | | | | R1 | | | DL | | | | DL | | | DW | | | | DW | E1 | | DL | | | | | | TW | | | TL | | TL | | N1 | TW | | | | "
],
"text/plain": [
"['█',\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",
" '.',\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",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" 'B',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'T',\n",
" 'O',\n",
" 'U',\n",
" 'R',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" 'G',\n",
" '.',\n",
" 'B',\n",
" 'A',\n",
" '.',\n",
" '.',\n",
" 'B',\n",
" 'E',\n",
" '.',\n",
" 'C',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" 'I',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" 'A',\n",
" '.',\n",
" '.',\n",
" 'M',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'N',\n",
" '.',\n",
" 'H',\n",
" 'E',\n",
" 'A',\n",
" 'R',\n",
" 'D',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" 'V',\n",
" 'I',\n",
" 'R',\n",
" 'U',\n",
" 'L',\n",
" 'e',\n",
" 'N',\n",
" 'T',\n",
" '∴',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" 'L',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" 'E',\n",
" ':',\n",
" '.',\n",
" 'S',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'E',\n",
" '.',\n",
" 'L',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'E',\n",
" '█',\n",
" '█',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" 'E',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" 'R',\n",
" 'E',\n",
" 'D',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" 'S',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" 'S',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'R',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" 'E',\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",
" '█']"
]
},
"execution_count": 37,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"board3[141] = 'A'\n",
"assert 'BA' in PREFIXES and is_word('A' + 'MUSES')\n",
"board3"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"We can continue marching forward, trying letters from the rack that form valid prefixes. Let's try the combination `CK`:"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/html": [
" | | | TW | | | TL | | TL | | | TW | | | | | | DL | | | DW | | | | DW | | | DL | | | | DL | | | DL | | | | | | DL | | | DL | | TW | | | TL | | | | DW | | | | TL | | | TW | | | DL | | | | DL | | DL | | | | DL | | | | DW | | | | TL | | | | TL | | | | DW | B3 | TL | | | | DL | | | | | | DL | T1 | O1 | U1 | R1 | | G2 | | B3 | A1 | C3 | K5 | B3 | E1 | | C3 | DW | | | I1 | TL | A1 | | | M3 | | | | N1 | | H4 | E1 | A1 | R1 | D2 | | V4 | I1 | R1 | U1 | L1 | e | N1 | T1 | TL | I1 | | | DW | L1 | | E1 | DL | | S1 | | DL | | E1 | | L1 | | DL | | E1 | TW | | | TL | E1 | | | DW | R1 | E1 | D2 | TL | | | S1 | | DL | | | S1 | | | | | | R1 | | | DL | | | | DL | | | DW | | | | DW | E1 | | DL | | | | | | TW | | | TL | | TL | | N1 | TW | | | | "
],
"text/plain": [
"['█',\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",
" '.',\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",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" 'B',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'T',\n",
" 'O',\n",
" 'U',\n",
" 'R',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" 'G',\n",
" '.',\n",
" 'B',\n",
" 'A',\n",
" 'C',\n",
" 'K',\n",
" 'B',\n",
" 'E',\n",
" '.',\n",
" 'C',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" 'I',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" 'A',\n",
" '.',\n",
" '.',\n",
" 'M',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'N',\n",
" '.',\n",
" 'H',\n",
" 'E',\n",
" 'A',\n",
" 'R',\n",
" 'D',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" 'V',\n",
" 'I',\n",
" 'R',\n",
" 'U',\n",
" 'L',\n",
" 'e',\n",
" 'N',\n",
" 'T',\n",
" '∴',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" 'L',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" 'E',\n",
" ':',\n",
" '.',\n",
" 'S',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'E',\n",
" '.',\n",
" 'L',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'E',\n",
" '█',\n",
" '█',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" 'E',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" 'R',\n",
" 'E',\n",
" 'D',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" 'S',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" 'S',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'R',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" 'E',\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",
" '█']"
]
},
"execution_count": 38,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"board3[142:144] = 'CK'\n",
"assert 'BACKBE' in PREFIXES\n",
"board3"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"We've spelled the word `BACK`, but we can't count it as a legal play, because there isn't an empty square to the right of `BACK`; there are two existing letters, `BE`. Fortunately, `BACKBE` is a valid prefix, so we can continue to the next empty square, where we can choose an `N`:"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/html": [
" | | | TW | | | TL | | TL | | | TW | | | | | | DL | | | DW | | | | DW | | | DL | | | | DL | | | DL | | | | | | DL | | | DL | | TW | | | TL | | | | DW | | | | TL | | | TW | | | DL | | | | DL | | DL | | | | DL | | | | DW | | | | TL | | | | TL | | | | DW | B3 | TL | | | | DL | | | | | | DL | T1 | O1 | U1 | R1 | | G2 | | B3 | A1 | C3 | K5 | B3 | E1 | N1 | C3 | DW | | | I1 | TL | A1 | | | M3 | | | | N1 | | H4 | E1 | A1 | R1 | D2 | | V4 | I1 | R1 | U1 | L1 | e | N1 | T1 | TL | I1 | | | DW | L1 | | E1 | DL | | S1 | | DL | | E1 | | L1 | | DL | | E1 | TW | | | TL | E1 | | | DW | R1 | E1 | D2 | TL | | | S1 | | DL | | | S1 | | | | | | R1 | | | DL | | | | DL | | | DW | | | | DW | E1 | | DL | | | | | | TW | | | TL | | TL | | N1 | TW | | | | "
],
"text/plain": [
"['█',\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",
" '.',\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",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" 'B',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'T',\n",
" 'O',\n",
" 'U',\n",
" 'R',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" 'G',\n",
" '.',\n",
" 'B',\n",
" 'A',\n",
" 'C',\n",
" 'K',\n",
" 'B',\n",
" 'E',\n",
" 'N',\n",
" 'C',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" 'I',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" 'A',\n",
" '.',\n",
" '.',\n",
" 'M',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'N',\n",
" '.',\n",
" 'H',\n",
" 'E',\n",
" 'A',\n",
" 'R',\n",
" 'D',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" 'V',\n",
" 'I',\n",
" 'R',\n",
" 'U',\n",
" 'L',\n",
" 'e',\n",
" 'N',\n",
" 'T',\n",
" '∴',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" 'L',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" 'E',\n",
" ':',\n",
" '.',\n",
" 'S',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'E',\n",
" '.',\n",
" 'L',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'E',\n",
" '█',\n",
" '█',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" 'E',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" 'R',\n",
" 'E',\n",
" 'D',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" 'S',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" 'S',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'R',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" 'E',\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",
" '█']"
]
},
"execution_count": 39,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"board3[146] = 'N'\n",
"assert 'BACKBENC' in PREFIXES\n",
"board3"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"We continue to the next square (a double word square), and place an `H`, which completes a word, `BACKBENCH` (with an empty square to the right), and simultaneously makes a cross word, `THE`:"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/html": [
" | | | TW | | | TL | | TL | | | TW | | | | | | DL | | | DW | | | | DW | | | DL | | | | DL | | | DL | | | | | | DL | | | DL | | TW | | | TL | | | | DW | | | | TL | | | TW | | | DL | | | | DL | | DL | | | | DL | | | | DW | | | | TL | | | | TL | | | | DW | B3 | TL | | | | DL | | | | | | DL | T1 | O1 | U1 | R1 | | G2 | | B3 | A1 | C3 | K5 | B3 | E1 | N1 | C3 | H4 | | | I1 | TL | A1 | | | M3 | | | | N1 | | H4 | E1 | A1 | R1 | D2 | | V4 | I1 | R1 | U1 | L1 | e | N1 | T1 | TL | I1 | | | DW | L1 | | E1 | DL | | S1 | | DL | | E1 | | L1 | | DL | | E1 | TW | | | TL | E1 | | | DW | R1 | E1 | D2 | TL | | | S1 | | DL | | | S1 | | | | | | R1 | | | DL | | | | DL | | | DW | | | | DW | E1 | | DL | | | | | | TW | | | TL | | TL | | N1 | TW | | | | "
],
"text/plain": [
"['█',\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",
" '.',\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",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" 'B',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'T',\n",
" 'O',\n",
" 'U',\n",
" 'R',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" 'G',\n",
" '.',\n",
" 'B',\n",
" 'A',\n",
" 'C',\n",
" 'K',\n",
" 'B',\n",
" 'E',\n",
" 'N',\n",
" 'C',\n",
" 'H',\n",
" '.',\n",
" '.',\n",
" 'I',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" 'A',\n",
" '.',\n",
" '.',\n",
" 'M',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'N',\n",
" '.',\n",
" 'H',\n",
" 'E',\n",
" 'A',\n",
" 'R',\n",
" 'D',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" 'V',\n",
" 'I',\n",
" 'R',\n",
" 'U',\n",
" 'L',\n",
" 'e',\n",
" 'N',\n",
" 'T',\n",
" '∴',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" 'L',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" 'E',\n",
" ':',\n",
" '.',\n",
" 'S',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'E',\n",
" '.',\n",
" 'L',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'E',\n",
" '█',\n",
" '█',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" 'E',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" 'R',\n",
" 'E',\n",
" 'D',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" 'S',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" 'S',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'R',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" 'E',\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",
" '█']"
]
},
"execution_count": 40,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"board3[148] = 'H'\n",
"assert is_word('BACKBENCH') and is_word('THE')\n",
"board3"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"We've found a valid play; we can now backtrack to consider other letters for this and other prefix/anchor combinations. Now let's code this up! \n",
"\n",
"# Code for Finding All Plays\n",
"\n",
"The function `all_plays` generates all legal plays by looking at every anchor square, trying all prefix plays, and then trying to extend each one, one letter at a time. (Note that it also generates the empty play, because a player always has the option of passing.)"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {
"button": false,
"collapsed": true,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"source": [
"def all_plays(board, rack):\n",
" \"\"\"Generate all plays that can be played on board with this rack.\n",
" Try placing every possible prefix before every anchor point; \n",
" then extend one letter at a time, looking for valid plays.\"\"\"\n",
" yield Play(0, ACROSS, '', rack) # The empty play (no letters, no points)\n",
" prefixes = rack_prefixes(rack)\n",
" for anchor in all_anchors(board):\n",
" for dir in (ACROSS, board.down):\n",
" for play in prefix_plays(prefixes, board, anchor, dir, rack):\n",
" yield from extend_play(board, play)"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Now for the function `prefix_plays`, which returns a list of all partial plays consisting of a prefix placed before the anchor. Note that these are not *legal* plays; they are *partial* plays, some of which will end up being extended into legal plays. \n",
"\n",
"There are two cases: if there are letters on the board immediately before the anchor, then those letters form the only allowable prefix. If not, we can use any prefix from the rack up to `maxlen`, which is the number of empty squares that do not run into another anchor, nor off the board."
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"source": [
"def prefix_plays(prefixes, board, anchor, dir, rack):\n",
" \"Return all Plays of a prefix to the left/above anchor.\"\n",
" if board[anchor-dir].isalpha(): # Prefix already on the board; only 1 prefix\n",
" start = scan_letters(board, anchor, -dir)\n",
" yield Play(start, dir, cat(board[start:anchor:dir]), rack)\n",
" else: # Prefixes from rack fit in space before anchor\n",
" maxlen = (anchor - scan_to_anchor(board, anchor, -dir)) // dir\n",
" for prefix in prefixes:\n",
" if len(prefix) > maxlen:\n",
" return\n",
" yield Play(anchor - len(prefix) * dir, dir, prefix, remove(prefix, rack))"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Now `extend_play` takes a partial play, determines the square, `s`, that is one square past the end of the play, and tries all possible letters there. If adding a letter forms a valid prefix (and also does not form an invalid cross word), then we continue on (by calling `extend_play` recursively). If adding the letter forms a valid word, we yield the play."
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {
"button": false,
"collapsed": true,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"source": [
"def extend_play(board, play):\n",
" \"Explore all ways of adding to end of play; return ones that form full words.\"\n",
" s = play.start + play.dir * len(play.letters)\n",
" if board[s] == OFF: return\n",
" cword = crossword(board, s, play.dir)\n",
" possible_letters = board[s].upper() if board[s].isalpha() else letters(play.rack)\n",
" for L in possible_letters:\n",
" prefix2 = play.letters + L\n",
" if prefix2.upper() in PREFIXES and valid_crossword(cword, L):\n",
" rack2 = play.rack if board[s].isalpha() else remove(L, play.rack)\n",
" play2 = Play(play.start, play.dir, prefix2, rack2)\n",
" if is_word(prefix2) and not board[s + play.dir].isalpha():\n",
" yield play2\n",
" yield from extend_play(board, play2)\n",
"\n",
"def scan_letters(board, s, dir) -> Square:\n",
" \"Return the last square number going from s in dir that is a letter.\"\n",
" while board[s + dir].isalpha():\n",
" s += dir\n",
" return s\n",
"\n",
"def scan_to_anchor(board, s, dir) -> Square:\n",
" \"Return the last square number going from s in dir that is not an anchor nor off board.\"\n",
" while board[s + dir] != OFF and not is_anchor(board, s + dir):\n",
" s += dir\n",
" return s"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"# Crosswords\n",
"\n",
"If adding a letter in, say, the `ACROSS` direction also adds on to a word in the `DOWN` direction, then we need to make sure that this *cross word* is also valid. The function `crossword` finds the cross word at square `s` and returns it with a `'.'` indicating the empty square where the new letter will be placed, so we would get `'.MUSES'` and `'T.E'` for the two crosswords in the `'BACKBENCH'` play."
]
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {
"button": false,
"collapsed": true,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"source": [
"def crossword(board, s, dir) -> str:\n",
" \"\"\"The word that intersects s in the other direction from dir.\n",
" Use '.' for the one square that is missing a letter.\"\"\"\n",
" def canonical(L): return L if L.isalpha() else '.'\n",
" d = other(dir, board)\n",
" start = scan_letters(board, s, -d)\n",
" end = scan_letters(board, s, d)\n",
" return cat(canonical(board[s]) for s in range(start, end+d, d))\n",
"\n",
"def valid_crossword(cword, L) -> bool:\n",
" \"Is placing letter L valid (with respective to the crossword)?\"\n",
" return len(cword) == 1 or is_word(cword.replace('.', L))\n",
"\n",
"def other(dir, board) -> Direction:\n",
" \"The other direction (across/down) on the board.\"\n",
" return board.down if dir == ACROSS else ACROSS"
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"'.MUSES'"
]
},
"execution_count": 45,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"crossword(board, 141, ACROSS)"
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"'T.E'"
]
},
"execution_count": 46,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"crossword(board, 148, ACROSS)"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"The function `valid_crossword` checks if replacing the empty square with a specific letter will form a valid word:"
]
},
{
"cell_type": "code",
"execution_count": 47,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 47,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"valid_crossword('.MUSES', 'A')"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"We can now see all the prefix plays for the anchor at 141 (just above `MUSES`):"
]
},
{
"cell_type": "code",
"execution_count": 48,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"{Play(start=140, dir=1, letters='A', rack='BCHKNQ'),\n",
" Play(start=140, dir=1, letters='B', rack='ACHKNQ'),\n",
" Play(start=140, dir=1, letters='C', rack='ABHKNQ'),\n",
" Play(start=140, dir=1, letters='H', rack='ABCKNQ'),\n",
" Play(start=140, dir=1, letters='K', rack='ABCHNQ'),\n",
" Play(start=140, dir=1, letters='N', rack='ABCHKQ'),\n",
" Play(start=140, dir=1, letters='Q', rack='ABCHKN'),\n",
" Play(start=141, dir=1, letters='', rack='ABCHKNQ')}"
]
},
"execution_count": 48,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"set(prefix_plays(rack_prefixes(rack), board, 141, 1, rack))"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"And we can see all the ways to extend the play of `'B'` there:"
]
},
{
"cell_type": "code",
"execution_count": 49,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"{Play(start=140, dir=1, letters='BA', rack='CHKNQ'),\n",
" Play(start=140, dir=1, letters='BACKBENCH', rack='Q'),\n",
" Play(start=140, dir=1, letters='BAH', rack='CKNQ'),\n",
" Play(start=140, dir=1, letters='BAN', rack='CHKQ')}"
]
},
"execution_count": 49,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"set(extend_play(board, Play(start=140, dir=1, letters='B', rack='ACHKNQ')))"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"# Scoring\n",
"\n",
"Now we'll show how to count up the points made by a play. The score is the sum of the word score for the play, plus the sum of the word scores for any cross words, plus a bingo score if all seven letters are used. The word score is the sum of the letter scores (where each letter score may be doubled or tripled by a bonus square when the letter is first played on the square), all multiplied by any word bonus(es) encountered by the newly-placed letters."
]
},
{
"cell_type": "code",
"execution_count": 50,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"source": [
"def score(board, play) -> int:\n",
" \"The number of points scored by making this play on the board.\"\n",
" return (word_score(board, play) \n",
" + bingo(board, play) \n",
" + sum(word_score(board, cplay) \n",
" for cplay in cross_plays(board, play)))\n",
"\n",
"def word_score(board, play) -> int:\n",
" \"Points for a single word, counting word- and letter-bonuses.\"\n",
" total, word_bonus = 0, 1\n",
" for (s, L) in enumerate_play(play):\n",
" sq = board[s]\n",
" word_bonus *= (3 if sq == TW else 2 if sq == DW else 1)\n",
" total += POINTS[L] * (3 if sq == TL else 2 if sq == DL else 1)\n",
" return word_bonus * total\n",
"\n",
"def bingo(board, play) -> int:\n",
" \"A bonus for using 7 letters from the rack.\"\n",
" return (board.bingo if (play.rack == '' and letters_played(board, play) == 7) \n",
" else 0)"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Here are the various helper functions:"
]
},
{
"cell_type": "code",
"execution_count": 51,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"source": [
"def letters_played(board, play) -> int:\n",
" \"The number of letters played from the rack.\"\n",
" return sum(board[s] in EMPTY for (s, L) in enumerate_play(play))\n",
" \n",
"def enumerate_play(play) -> list:\n",
" \"List (square_number, letter) pairs for each tile in the play.\"\n",
" return [(play.start + i * play.dir, play.letters[i]) \n",
" for i in range(len(play.letters))]\n",
" \n",
"def cross_plays(board, play):\n",
" \"Generate all plays for words that cross this play.\"\n",
" cross = other(play.dir, board)\n",
" for (s, L) in enumerate_play(play):\n",
" if board[s] in EMPTY and (board[s-cross].isalpha() or board[s+cross].isalpha()):\n",
" start, end = scan_letters(board, s, -cross), scan_letters(board, s, cross)\n",
" before, after = cat(board[start:s:cross]), cat(board[s+cross:end+cross:cross])\n",
" yield Play(start, cross, before + L + after, play.rack)"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"What should the `BACKBENCH` play score? The word covers two double-word bonuses, but no letter bonuses. The sum of the letter point values is 3+1+3+5+3+1+1+3+4 = 24, and 24×2×2 = 96. The cross word `AMUSES` scores 8, and `THE` is on a double word bonus, so it scores 6×2 = 12. There is one letter remaining in the rack, so no bingo, just a total score of 96 + 8 + 12 = 116."
]
},
{
"cell_type": "code",
"execution_count": 52,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"116"
]
},
"execution_count": 52,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"score(board, Play(start=140, dir=1, letters='BACKBENCH', rack='Q'))"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"We can find the highest scoring play by enumerating all plays and taking the one with the maximum score:"
]
},
{
"cell_type": "code",
"execution_count": 53,
"metadata": {
"button": false,
"collapsed": true,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"source": [
"def highest_scoring_play(board, rack) -> Play: \n",
" \"Return the Play that gives the most points.\"\n",
" return max(all_plays(board, rack), key=lambda play: score(board, play))"
]
},
{
"cell_type": "code",
"execution_count": 54,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"Play(start=140, dir=1, letters='BACKBENCH', rack='Q')"
]
},
"execution_count": 54,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"highest_scoring_play(board, rack)"
]
},
{
"cell_type": "code",
"execution_count": 55,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/html": [
" | | | TW | | | TL | | TL | | | TW | | | | | | DL | | | DW | | | | DW | | | DL | | | | DL | | | DL | | | | | | DL | | | DL | | TW | | | TL | | | | DW | | | | TL | | | TW | | | DL | | | | DL | | DL | | | | DL | | | | DW | | | | TL | | | | TL | | | | DW | B3 | TL | | | | DL | | | | | | DL | T1 | O1 | U1 | R1 | | G2 | | B3 | A1 | C3 | K5 | B3 | E1 | N1 | C3 | H4 | | | I1 | TL | A1 | | | M3 | | | | N1 | | H4 | E1 | A1 | R1 | D2 | | V4 | I1 | R1 | U1 | L1 | e | N1 | T1 | TL | I1 | | | DW | L1 | | E1 | DL | | S1 | | DL | | E1 | | L1 | | DL | | E1 | TW | | | TL | E1 | | | DW | R1 | E1 | D2 | TL | | | S1 | | DL | | | S1 | | | | | | R1 | | | DL | | | | DL | | | DW | | | | DW | E1 | | DL | | | | | | TW | | | TL | | TL | | N1 | TW | | | | "
],
"text/plain": [
"['█',\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",
" '.',\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",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" 'B',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'T',\n",
" 'O',\n",
" 'U',\n",
" 'R',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" 'G',\n",
" '.',\n",
" 'B',\n",
" 'A',\n",
" 'C',\n",
" 'K',\n",
" 'B',\n",
" 'E',\n",
" 'N',\n",
" 'C',\n",
" 'H',\n",
" '.',\n",
" '.',\n",
" 'I',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" 'A',\n",
" '.',\n",
" '.',\n",
" 'M',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'N',\n",
" '.',\n",
" 'H',\n",
" 'E',\n",
" 'A',\n",
" 'R',\n",
" 'D',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" 'V',\n",
" 'I',\n",
" 'R',\n",
" 'U',\n",
" 'L',\n",
" 'e',\n",
" 'N',\n",
" 'T',\n",
" '∴',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" 'L',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" 'E',\n",
" ':',\n",
" '.',\n",
" 'S',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'E',\n",
" '.',\n",
" 'L',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'E',\n",
" '█',\n",
" '█',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" 'E',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" 'R',\n",
" 'E',\n",
" 'D',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" 'S',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" 'S',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'R',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" 'E',\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",
" '█']"
]
},
"execution_count": 55,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"make_play(board, Play(start=140, dir=1, letters='BACKBENCH', rack='Q'))"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"# Playing a Game\n",
"\n",
"Now let's play a complete game. We start with a bag of tiles with the official Scrabble® distribution:"
]
},
{
"cell_type": "code",
"execution_count": 56,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"source": [
"BAG = 9*'A' + 12*'E' + 9*'I' + 8*'O' + 'BBCCDDDDFFGGGHHJKLLLLMMNNNNNNPPQRRRRRRSSSSTTTTTTUUUUVVWWXYYZ__'"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Then the function `play_game` will take a list of *player strategies* as input, and play those strategies against each other over the course of a game. A strategy is a function that takes a board and a rack as input and returns a play. For example, `highest_scoring_play` is a strategy. If the optional argument `verbose` is true, then the board is displayed after each play."
]
},
{
"cell_type": "code",
"execution_count": 57,
"metadata": {
"button": false,
"collapsed": true,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"source": [
"def play_game(strategies=[highest_scoring_play, highest_scoring_play], \n",
" board=WWF, verbose=True) -> list:\n",
" \"A number of players play a game; return a list of their scores.\"\n",
" board = Board(board)\n",
" bag = list(BAG)\n",
" random.shuffle(bag)\n",
" scores = [0 for _ in strategies]\n",
" racks = [replenish('', bag) for _ in strategies]\n",
" while True:\n",
" old_board = board\n",
" for (p, strategy) in enumerate(strategies):\n",
" board = make_one_play(board, p, strategy, scores, racks, bag, verbose)\n",
" if racks[p] == '':\n",
" # Player p has gone out; game over\n",
" return subtract_remaining_tiles(racks, scores, p)\n",
" if old_board == board:\n",
" # No player has a move; game over\n",
" return scores\n",
"\n",
"def make_one_play(board, p, strategy, scores, racks, bag, verbose) -> Board:\n",
" \"\"\"One player, player p, chooses a move according to the strategy.\n",
" We make the move, replenish the rack, update scores, and return the new Board.\"\"\"\n",
" rack = racks[p]\n",
" play = strategy(board, racks[p])\n",
" racks[p] = replenish(play.rack, bag)\n",
" points = score(board, play)\n",
" is_bingo = ('(BINGO!)' if bingo(board, play) else '')\n",
" scores[p]+= points\n",
" board = make_play(board, play)\n",
" if verbose:\n",
" display(HTML('Player {} with rack {} makes {} for {} points {}; draws: {}; scores: {}'\n",
" .format(p, rack, play, points, is_bingo, racks[p], scores)),\n",
" board)\n",
" return board\n",
"\n",
"def subtract_remaining_tiles(racks, scores, p) -> list:\n",
" \"Subtract point values from each player and give them to player p.\"\n",
" for i in range(len(racks)):\n",
" points = sum(POINTS[L] for L in racks[i])\n",
" scores[i] -= points\n",
" scores[p] += points\n",
" return scores\n",
"\n",
"def replenish(rack, bag) -> str:\n",
" \"Fill rack with 7 letters (as long as there are letters left in the bag).\"\n",
" while len(rack) < 7 and bag:\n",
" rack += bag.pop()\n",
" return rack"
]
},
{
"cell_type": "code",
"execution_count": 58,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"application/javascript": [
"IPython.OutputArea.auto_scroll_threshold = 9999;"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%%javascript\n",
"IPython.OutputArea.auto_scroll_threshold = 9999;"
]
},
{
"cell_type": "code",
"execution_count": 59,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/html": [
"Player 0 with rack EDOSOLB makes Play(start=144, dir=1, letters='BOODLE', rack='S') for 18 points ; draws: STOYNRR; scores: [18, 0]"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
" | | | TW | | | TL | | TL | | | TW | | | | | | DL | | | DW | | | | DW | | | DL | | | | DL | | | DL | | | | | | DL | | | DL | | TW | | | TL | | | | DW | | | | TL | | | TW | | | DL | | | | DL | | DL | | | | DL | | | | DW | | | | TL | | | | TL | | | | DW | | TL | | | | DL | | | | | | DL | | | | TL | | | | DW | | | | B3 | O1 | O1 | D2 | L1 | E1 | | | TL | | | | DL | | | | | | DL | | | | TL | | DW | | | | TL | | | | TL | | | | DW | | | | DL | | | | DL | | DL | | | | DL | | | TW | | | TL | | | | DW | | | | TL | | | TW | | DL | | | DL | | | | | | DL | | | DL | | | | DL | | | DW | | | | DW | | | DL | | | | | | TW | | | TL | | TL | | | TW | | | | "
],
"text/plain": [
"['█',\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",
" '.',\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",
" '=',\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",
" 'B',\n",
" 'O',\n",
" 'O',\n",
" 'D',\n",
" 'L',\n",
" 'E',\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",
" '.',\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",
" '.',\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",
" '█']"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"Player 1 with rack IUSI_IT makes Play(start=146, dir=17, letters='OUISTItI', rack='') for 53 points (BINGO!); draws: OHAKAQL; scores: [18, 53]"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
" | | | TW | | | TL | | TL | | | TW | | | | | | DL | | | DW | | | | DW | | | DL | | | | DL | | | DL | | | | | | DL | | | DL | | TW | | | TL | | | | DW | | | | TL | | | TW | | | DL | | | | DL | | DL | | | | DL | | | | DW | | | | TL | | | | TL | | | | DW | | TL | | | | DL | | | | | | DL | | | | TL | | | | DW | | | | B3 | O1 | O1 | D2 | L1 | E1 | | | TL | | | | DL | | | | | U1 | DL | | | | TL | | DW | | | | TL | | | | I1 | | | | DW | | | | DL | | | | DL | | DL | S1 | | | DL | | | TW | | | TL | | | | DW | | T1 | | TL | | | TW | | DL | | | DL | | | | | I1 | DL | | | DL | | | | DL | | | DW | | | | t | | | DL | | | | | | TW | | | TL | | TL | I1 | | TW | | | | "
],
"text/plain": [
"['█',\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",
" '.',\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",
" '=',\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",
" 'B',\n",
" 'O',\n",
" 'O',\n",
" 'D',\n",
" 'L',\n",
" 'E',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'U',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" ':',\n",
" 'S',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" 'T',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '≡',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'I',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 't',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '∴',\n",
" 'I',\n",
" '.',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█']"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"Player 0 with rack STOYNRR makes Play(start=264, dir=1, letters='YIRR', rack='STON') for 45 points ; draws: STONONE; scores: [63, 53]"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
" | | | TW | | | TL | | TL | | | TW | | | | | | DL | | | DW | | | | DW | | | DL | | | | DL | | | DL | | | | | | DL | | | DL | | TW | | | TL | | | | DW | | | | TL | | | TW | | | DL | | | | DL | | DL | | | | DL | | | | DW | | | | TL | | | | TL | | | | DW | | TL | | | | DL | | | | | | DL | | | | TL | | | | DW | | | | B3 | O1 | O1 | D2 | L1 | E1 | | | TL | | | | DL | | | | | U1 | DL | | | | TL | | DW | | | | TL | | | | I1 | | | | DW | | | | DL | | | | DL | | DL | S1 | | | DL | | | TW | | | TL | | | | DW | | T1 | | TL | | | TW | | DL | | | DL | | | | | I1 | DL | | | DL | | | | DL | | | DW | | | | t | | | DL | | | | | | TW | | | TL | | Y4 | I1 | R1 | R1 | | | | "
],
"text/plain": [
"['█',\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",
" '.',\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",
" '=',\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",
" 'B',\n",
" 'O',\n",
" 'O',\n",
" 'D',\n",
" 'L',\n",
" 'E',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'U',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" ':',\n",
" 'S',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" 'T',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '≡',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'I',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 't',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" 'Y',\n",
" 'I',\n",
" 'R',\n",
" 'R',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█']"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"Player 1 with rack OHAKAQL makes Play(start=212, dir=1, letters='LOTAH', rack='KAQ') for 32 points ; draws: KAQDEWU; scores: [63, 85]"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
" | | | TW | | | TL | | TL | | | TW | | | | | | DL | | | DW | | | | DW | | | DL | | | | DL | | | DL | | | | | | DL | | | DL | | TW | | | TL | | | | DW | | | | TL | | | TW | | | DL | | | | DL | | DL | | | | DL | | | | DW | | | | TL | | | | TL | | | | DW | | TL | | | | DL | | | | | | DL | | | | TL | | | | DW | | | | B3 | O1 | O1 | D2 | L1 | E1 | | | TL | | | | DL | | | | | U1 | DL | | | | TL | | DW | | | | TL | | | | I1 | | | | DW | | | | DL | | | | DL | | DL | S1 | | | DL | | | TW | | | TL | | | | L1 | O1 | T1 | A1 | H4 | | | TW | | DL | | | DL | | | | | I1 | DL | | | DL | | | | DL | | | DW | | | | t | | | DL | | | | | | TW | | | TL | | Y4 | I1 | R1 | R1 | | | | "
],
"text/plain": [
"['█',\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",
" '.',\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",
" '=',\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",
" 'B',\n",
" 'O',\n",
" 'O',\n",
" 'D',\n",
" 'L',\n",
" 'E',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'U',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" ':',\n",
" 'S',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'L',\n",
" 'O',\n",
" 'T',\n",
" 'A',\n",
" 'H',\n",
" '.',\n",
" '.',\n",
" '≡',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'I',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 't',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" 'Y',\n",
" 'I',\n",
" 'R',\n",
" 'R',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█']"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"Player 0 with rack STONONE makes Play(start=116, dir=17, letters='ONSET', rack='ON') for 30 points ; draws: ONROBEM; scores: [93, 85]"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
" | | | TW | | | TL | | TL | | | TW | | | | | | DL | | | DW | | | | DW | | | DL | | | | DL | | | DL | | | | | | DL | | | DL | | TW | | | TL | | | | DW | | | | TL | | | TW | | | DL | | | | DL | | DL | | | | DL | | | | DW | | | | TL | | | | TL | | | | O1 | | TL | | | | DL | | | | | | DL | | | N1 | TL | | | | DW | | | | B3 | O1 | O1 | D2 | L1 | E1 | S1 | | TL | | | | DL | | | | | U1 | DL | | | E1 | TL | | DW | | | | TL | | | | I1 | | | | T1 | | | | DL | | | | DL | | DL | S1 | | | DL | | | TW | | | TL | | | | L1 | O1 | T1 | A1 | H4 | | | TW | | DL | | | DL | | | | | I1 | DL | | | DL | | | | DL | | | DW | | | | t | | | DL | | | | | | TW | | | TL | | Y4 | I1 | R1 | R1 | | | | "
],
"text/plain": [
"['█',\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",
" '.',\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",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'O',\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",
" 'B',\n",
" 'O',\n",
" 'O',\n",
" 'D',\n",
" 'L',\n",
" 'E',\n",
" 'S',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'U',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" 'E',\n",
" '∴',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'T',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" ':',\n",
" 'S',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'L',\n",
" 'O',\n",
" 'T',\n",
" 'A',\n",
" 'H',\n",
" '.',\n",
" '.',\n",
" '≡',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'I',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 't',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" 'Y',\n",
" 'I',\n",
" 'R',\n",
" 'R',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█']"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"Player 1 with rack KAQDEWU makes Play(start=168, dir=17, letters='DAWK', rack='QEU') for 57 points ; draws: QEURLVI; scores: [93, 142]"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
" | | | TW | | | TL | | TL | | | TW | | | | | | DL | | | DW | | | | DW | | | DL | | | | DL | | | DL | | | | | | DL | | | DL | | TW | | | TL | | | | DW | | | | TL | | | TW | | | DL | | | | DL | | DL | | | | DL | | | | DW | | | | TL | | | | TL | | | | O1 | | TL | | | | DL | | | | | | DL | | | N1 | TL | | | | DW | | | | B3 | O1 | O1 | D2 | L1 | E1 | S1 | | TL | | | | DL | | | | | U1 | DL | | | E1 | D2 | | DW | | | | TL | | | | I1 | | | | T1 | A1 | | | DL | | | | DL | | DL | S1 | | | DL | | W4 | TW | | | TL | | | | L1 | O1 | T1 | A1 | H4 | | | K5 | | DL | | | DL | | | | | I1 | DL | | | DL | | | | DL | | | DW | | | | t | | | DL | | | | | | TW | | | TL | | Y4 | I1 | R1 | R1 | | | | "
],
"text/plain": [
"['█',\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",
" '.',\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",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'O',\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",
" 'B',\n",
" 'O',\n",
" 'O',\n",
" 'D',\n",
" 'L',\n",
" 'E',\n",
" 'S',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'U',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" 'E',\n",
" 'D',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'T',\n",
" 'A',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" ':',\n",
" 'S',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'W',\n",
" '█',\n",
" '█',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'L',\n",
" 'O',\n",
" 'T',\n",
" 'A',\n",
" 'H',\n",
" '.',\n",
" '.',\n",
" 'K',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'I',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 't',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" 'Y',\n",
" 'I',\n",
" 'R',\n",
" 'R',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█']"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"Player 0 with rack ONROBEM makes Play(start=66, dir=17, letters='BROMO', rack='NE') for 41 points ; draws: NEETN_A; scores: [134, 142]"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
" | | | TW | | | TL | | TL | | | TW | | | | | | DL | | | DW | | | | DW | | | DL | | | | DL | | | DL | | | | | | DL | | | DL | B3 | TW | | | TL | | | | DW | | | | TL | | | R1 | | | DL | | | | DL | | DL | | | | DL | | O1 | | DW | | | | TL | | | | TL | | | | O1 | M3 | TL | | | | DL | | | | | | DL | | | N1 | O1 | | | | DW | | | | B3 | O1 | O1 | D2 | L1 | E1 | S1 | | TL | | | | DL | | | | | U1 | DL | | | E1 | D2 | | DW | | | | TL | | | | I1 | | | | T1 | A1 | | | DL | | | | DL | | DL | S1 | | | DL | | W4 | TW | | | TL | | | | L1 | O1 | T1 | A1 | H4 | | | K5 | | DL | | | DL | | | | | I1 | DL | | | DL | | | | DL | | | DW | | | | t | | | DL | | | | | | TW | | | TL | | Y4 | I1 | R1 | R1 | | | | "
],
"text/plain": [
"['█',\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",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'B',\n",
" '█',\n",
" '█',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" 'R',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'O',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'O',\n",
" 'M',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" 'N',\n",
" 'O',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'B',\n",
" 'O',\n",
" 'O',\n",
" 'D',\n",
" 'L',\n",
" 'E',\n",
" 'S',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'U',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" 'E',\n",
" 'D',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'T',\n",
" 'A',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" ':',\n",
" 'S',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'W',\n",
" '█',\n",
" '█',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'L',\n",
" 'O',\n",
" 'T',\n",
" 'A',\n",
" 'H',\n",
" '.',\n",
" '.',\n",
" 'K',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'I',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 't',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" 'Y',\n",
" 'I',\n",
" 'R',\n",
" 'R',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█']"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"Player 1 with rack QEURLVI makes Play(start=80, dir=17, letters='QUELL', rack='RVI') for 34 points ; draws: RVIDTHA; scores: [134, 176]"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
" | | | TW | | | TL | | TL | | | TW | | | | | | DL | | | DW | | | | DW | | | DL | | | | DL | | | DL | | | | | | DL | | | DL | B3 | TW | | | TL | | | | DW | | | | Q10 | | | R1 | | | DL | | | | DL | | DL | | | U1 | DL | | O1 | | DW | | | | TL | | | | TL | | E1 | | O1 | M3 | TL | | | | DL | | | | | | DL | L1 | | N1 | O1 | | | | DW | | | | B3 | O1 | O1 | D2 | L1 | E1 | S1 | | TL | | | | DL | | | | | U1 | DL | | | E1 | D2 | | DW | | | | TL | | | | I1 | | | | T1 | A1 | | | DL | | | | DL | | DL | S1 | | | DL | | W4 | TW | | | TL | | | | L1 | O1 | T1 | A1 | H4 | | | K5 | | DL | | | DL | | | | | I1 | DL | | | DL | | | | DL | | | DW | | | | t | | | DL | | | | | | TW | | | TL | | Y4 | I1 | R1 | R1 | | | | "
],
"text/plain": [
"['█',\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",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'B',\n",
" '█',\n",
" '█',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'Q',\n",
" '.',\n",
" '.',\n",
" 'R',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" 'U',\n",
" ':',\n",
" '.',\n",
" 'O',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" 'E',\n",
" '.',\n",
" 'O',\n",
" 'M',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'L',\n",
" '.',\n",
" 'N',\n",
" 'O',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'B',\n",
" 'O',\n",
" 'O',\n",
" 'D',\n",
" 'L',\n",
" 'E',\n",
" 'S',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'U',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" 'E',\n",
" 'D',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'T',\n",
" 'A',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" ':',\n",
" 'S',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'W',\n",
" '█',\n",
" '█',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'L',\n",
" 'O',\n",
" 'T',\n",
" 'A',\n",
" 'H',\n",
" '.',\n",
" '.',\n",
" 'K',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'I',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 't',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" 'Y',\n",
" 'I',\n",
" 'R',\n",
" 'R',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█']"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"Player 0 with rack NEETN_A makes Play(start=190, dir=1, letters='NEATNEsS', rack='') for 47 points (BINGO!); draws: VEXEPIL; scores: [181, 176]"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
" | | | TW | | | TL | | TL | | | TW | | | | | | DL | | | DW | | | | DW | | | DL | | | | DL | | | DL | | | | | | DL | | | DL | B3 | TW | | | TL | | | | DW | | | | Q10 | | | R1 | | | DL | | | | DL | | DL | | | U1 | DL | | O1 | | DW | | | | TL | | | | TL | | E1 | | O1 | M3 | TL | | | | DL | | | | | | DL | L1 | | N1 | O1 | | | | DW | | | | B3 | O1 | O1 | D2 | L1 | E1 | S1 | | TL | | | | DL | | | | | U1 | DL | | | E1 | D2 | | DW | | | | TL | | | | I1 | | | | T1 | A1 | | | N1 | E1 | A1 | T1 | N1 | E1 | s | S1 | | | DL | | W4 | TW | | | TL | | | | L1 | O1 | T1 | A1 | H4 | | | K5 | | DL | | | DL | | | | | I1 | DL | | | DL | | | | DL | | | DW | | | | t | | | DL | | | | | | TW | | | TL | | Y4 | I1 | R1 | R1 | | | | "
],
"text/plain": [
"['█',\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",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'B',\n",
" '█',\n",
" '█',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'Q',\n",
" '.',\n",
" '.',\n",
" 'R',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" 'U',\n",
" ':',\n",
" '.',\n",
" 'O',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" 'E',\n",
" '.',\n",
" 'O',\n",
" 'M',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'L',\n",
" '.',\n",
" 'N',\n",
" 'O',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'B',\n",
" 'O',\n",
" 'O',\n",
" 'D',\n",
" 'L',\n",
" 'E',\n",
" 'S',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'U',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" 'E',\n",
" 'D',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'T',\n",
" 'A',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" 'N',\n",
" 'E',\n",
" 'A',\n",
" 'T',\n",
" 'N',\n",
" 'E',\n",
" 's',\n",
" 'S',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'W',\n",
" '█',\n",
" '█',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'L',\n",
" 'O',\n",
" 'T',\n",
" 'A',\n",
" 'H',\n",
" '.',\n",
" '.',\n",
" 'K',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'I',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 't',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" 'Y',\n",
" 'I',\n",
" 'R',\n",
" 'R',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█']"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"Player 1 with rack RVIDTHA makes Play(start=174, dir=17, letters='DEARTH', rack='VI') for 36 points ; draws: VINESTI; scores: [181, 212]"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
" | | | TW | | | TL | | TL | | | TW | | | | | | DL | | | DW | | | | DW | | | DL | | | | DL | | | DL | | | | | | DL | | | DL | B3 | TW | | | TL | | | | DW | | | | Q10 | | | R1 | | | DL | | | | DL | | DL | | | U1 | DL | | O1 | | DW | | | | TL | | | | TL | | E1 | | O1 | M3 | TL | | | | DL | | | | | | DL | L1 | | N1 | O1 | | | | DW | | | | B3 | O1 | O1 | D2 | L1 | E1 | S1 | | TL | | | | DL | | | | | U1 | DL | | | E1 | D2 | | DW | | D2 | | TL | | | | I1 | | | | T1 | A1 | | | N1 | E1 | A1 | T1 | N1 | E1 | s | S1 | | | DL | | W4 | TW | | | A1 | | | | L1 | O1 | T1 | A1 | H4 | | | K5 | | DL | | R1 | DL | | | | | I1 | DL | | | DL | | | | DL | T1 | | DW | | | | t | | | DL | | | | | | H4 | | | TL | | Y4 | I1 | R1 | R1 | | | | "
],
"text/plain": [
"['█',\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",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'B',\n",
" '█',\n",
" '█',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'Q',\n",
" '.',\n",
" '.',\n",
" 'R',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" 'U',\n",
" ':',\n",
" '.',\n",
" 'O',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" 'E',\n",
" '.',\n",
" 'O',\n",
" 'M',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'L',\n",
" '.',\n",
" 'N',\n",
" 'O',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'B',\n",
" 'O',\n",
" 'O',\n",
" 'D',\n",
" 'L',\n",
" 'E',\n",
" 'S',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'U',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" 'E',\n",
" 'D',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" 'D',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'T',\n",
" 'A',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" 'N',\n",
" 'E',\n",
" 'A',\n",
" 'T',\n",
" 'N',\n",
" 'E',\n",
" 's',\n",
" 'S',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'W',\n",
" '█',\n",
" '█',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" 'A',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'L',\n",
" 'O',\n",
" 'T',\n",
" 'A',\n",
" 'H',\n",
" '.',\n",
" '.',\n",
" 'K',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'R',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'I',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'T',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 't',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'H',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" 'Y',\n",
" 'I',\n",
" 'R',\n",
" 'R',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█']"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"Player 0 with rack VEXEPIL makes Play(start=230, dir=1, letters='PIXIE', rack='VEL') for 48 points ; draws: VELUCUI; scores: [229, 212]"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
" | | | TW | | | TL | | TL | | | TW | | | | | | DL | | | DW | | | | DW | | | DL | | | | DL | | | DL | | | | | | DL | | | DL | B3 | TW | | | TL | | | | DW | | | | Q10 | | | R1 | | | DL | | | | DL | | DL | | | U1 | DL | | O1 | | DW | | | | TL | | | | TL | | E1 | | O1 | M3 | TL | | | | DL | | | | | | DL | L1 | | N1 | O1 | | | | DW | | | | B3 | O1 | O1 | D2 | L1 | E1 | S1 | | TL | | | | DL | | | | | U1 | DL | | | E1 | D2 | | DW | | D2 | | TL | | | | I1 | | | | T1 | A1 | | | N1 | E1 | A1 | T1 | N1 | E1 | s | S1 | | | DL | | W4 | TW | | | A1 | | | | L1 | O1 | T1 | A1 | H4 | | | K5 | | DL | | R1 | DL | | | | P3 | I1 | X8 | I1 | E1 | DL | | | | DL | T1 | | DW | | | | t | | | DL | | | | | | H4 | | | TL | | Y4 | I1 | R1 | R1 | | | | "
],
"text/plain": [
"['█',\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",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'B',\n",
" '█',\n",
" '█',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'Q',\n",
" '.',\n",
" '.',\n",
" 'R',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" 'U',\n",
" ':',\n",
" '.',\n",
" 'O',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" 'E',\n",
" '.',\n",
" 'O',\n",
" 'M',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'L',\n",
" '.',\n",
" 'N',\n",
" 'O',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'B',\n",
" 'O',\n",
" 'O',\n",
" 'D',\n",
" 'L',\n",
" 'E',\n",
" 'S',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'U',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" 'E',\n",
" 'D',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" 'D',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'T',\n",
" 'A',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" 'N',\n",
" 'E',\n",
" 'A',\n",
" 'T',\n",
" 'N',\n",
" 'E',\n",
" 's',\n",
" 'S',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'W',\n",
" '█',\n",
" '█',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" 'A',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'L',\n",
" 'O',\n",
" 'T',\n",
" 'A',\n",
" 'H',\n",
" '.',\n",
" '.',\n",
" 'K',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'R',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'P',\n",
" 'I',\n",
" 'X',\n",
" 'I',\n",
" 'E',\n",
" ':',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'T',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 't',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'H',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" 'Y',\n",
" 'I',\n",
" 'R',\n",
" 'R',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█']"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"Player 1 with rack VINESTI makes Play(start=165, dir=1, letters='SNED', rack='VIETI') for 22 points ; draws: VIETIAA; scores: [229, 234]"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
" | | | TW | | | TL | | TL | | | TW | | | | | | DL | | | DW | | | | DW | | | DL | | | | DL | | | DL | | | | | | DL | | | DL | B3 | TW | | | TL | | | | DW | | | | Q10 | | | R1 | | | DL | | | | DL | | DL | | | U1 | DL | | O1 | | DW | | | | TL | | | | TL | | E1 | | O1 | M3 | TL | | | | DL | | | | | | DL | L1 | | N1 | O1 | | | | DW | | | | B3 | O1 | O1 | D2 | L1 | E1 | S1 | | TL | | | | DL | | | | | U1 | DL | S1 | N1 | E1 | D2 | | DW | | D2 | | TL | | | | I1 | | | | T1 | A1 | | | N1 | E1 | A1 | T1 | N1 | E1 | s | S1 | | | DL | | W4 | TW | | | A1 | | | | L1 | O1 | T1 | A1 | H4 | | | K5 | | DL | | R1 | DL | | | | P3 | I1 | X8 | I1 | E1 | DL | | | | DL | T1 | | DW | | | | t | | | DL | | | | | | H4 | | | TL | | Y4 | I1 | R1 | R1 | | | | "
],
"text/plain": [
"['█',\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",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'B',\n",
" '█',\n",
" '█',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'Q',\n",
" '.',\n",
" '.',\n",
" 'R',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" 'U',\n",
" ':',\n",
" '.',\n",
" 'O',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" 'E',\n",
" '.',\n",
" 'O',\n",
" 'M',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'L',\n",
" '.',\n",
" 'N',\n",
" 'O',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'B',\n",
" 'O',\n",
" 'O',\n",
" 'D',\n",
" 'L',\n",
" 'E',\n",
" 'S',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'U',\n",
" ':',\n",
" 'S',\n",
" 'N',\n",
" 'E',\n",
" 'D',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" 'D',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'T',\n",
" 'A',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" 'N',\n",
" 'E',\n",
" 'A',\n",
" 'T',\n",
" 'N',\n",
" 'E',\n",
" 's',\n",
" 'S',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'W',\n",
" '█',\n",
" '█',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" 'A',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'L',\n",
" 'O',\n",
" 'T',\n",
" 'A',\n",
" 'H',\n",
" '.',\n",
" '.',\n",
" 'K',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'R',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'P',\n",
" 'I',\n",
" 'X',\n",
" 'I',\n",
" 'E',\n",
" ':',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'T',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 't',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'H',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" 'Y',\n",
" 'I',\n",
" 'R',\n",
" 'R',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█']"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"Player 0 with rack VELUCUI makes Play(start=205, dir=1, letters='UVEA', rack='LCUI') for 23 points ; draws: LCUIEIF; scores: [252, 234]"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
" | | | TW | | | TL | | TL | | | TW | | | | | | DL | | | DW | | | | DW | | | DL | | | | DL | | | DL | | | | | | DL | | | DL | B3 | TW | | | TL | | | | DW | | | | Q10 | | | R1 | | | DL | | | | DL | | DL | | | U1 | DL | | O1 | | DW | | | | TL | | | | TL | | E1 | | O1 | M3 | TL | | | | DL | | | | | | DL | L1 | | N1 | O1 | | | | DW | | | | B3 | O1 | O1 | D2 | L1 | E1 | S1 | | TL | | | | DL | | | | | U1 | DL | S1 | N1 | E1 | D2 | | DW | | D2 | | TL | | | | I1 | | | | T1 | A1 | | | N1 | E1 | A1 | T1 | N1 | E1 | s | S1 | | | DL | | W4 | U1 | V4 | E1 | A1 | | | | L1 | O1 | T1 | A1 | H4 | | | K5 | | DL | | R1 | DL | | | | P3 | I1 | X8 | I1 | E1 | DL | | | | DL | T1 | | DW | | | | t | | | DL | | | | | | H4 | | | TL | | Y4 | I1 | R1 | R1 | | | | "
],
"text/plain": [
"['█',\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",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'B',\n",
" '█',\n",
" '█',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'Q',\n",
" '.',\n",
" '.',\n",
" 'R',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" 'U',\n",
" ':',\n",
" '.',\n",
" 'O',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" 'E',\n",
" '.',\n",
" 'O',\n",
" 'M',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'L',\n",
" '.',\n",
" 'N',\n",
" 'O',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'B',\n",
" 'O',\n",
" 'O',\n",
" 'D',\n",
" 'L',\n",
" 'E',\n",
" 'S',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'U',\n",
" ':',\n",
" 'S',\n",
" 'N',\n",
" 'E',\n",
" 'D',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" 'D',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'T',\n",
" 'A',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" 'N',\n",
" 'E',\n",
" 'A',\n",
" 'T',\n",
" 'N',\n",
" 'E',\n",
" 's',\n",
" 'S',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'W',\n",
" '█',\n",
" '█',\n",
" 'U',\n",
" 'V',\n",
" 'E',\n",
" 'A',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'L',\n",
" 'O',\n",
" 'T',\n",
" 'A',\n",
" 'H',\n",
" '.',\n",
" '.',\n",
" 'K',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'R',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'P',\n",
" 'I',\n",
" 'X',\n",
" 'I',\n",
" 'E',\n",
" ':',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'T',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 't',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'H',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" 'Y',\n",
" 'I',\n",
" 'R',\n",
" 'R',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█']"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"Player 1 with rack VIETIAA makes Play(start=159, dir=17, letters='VITIATE', rack='A') for 24 points ; draws: AZEOIMG; scores: [252, 258]"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
" | | | TW | | | TL | | TL | | | TW | | | | | | DL | | | DW | | | | DW | | | DL | | | | DL | | | DL | | | | | | DL | | | DL | B3 | TW | | | TL | | | | DW | | | | Q10 | | | R1 | | | DL | | | | DL | | DL | | | U1 | DL | | O1 | | DW | | | | TL | | | | TL | | E1 | | O1 | M3 | TL | | | | DL | | | | | | DL | L1 | | N1 | O1 | | | | DW | | | | B3 | O1 | O1 | D2 | L1 | E1 | S1 | | TL | | | | DL | V4 | | | | U1 | DL | S1 | N1 | E1 | D2 | | DW | | D2 | | I1 | | | | I1 | | | | T1 | A1 | | | N1 | E1 | A1 | T1 | N1 | E1 | s | S1 | | | DL | | W4 | U1 | V4 | E1 | A1 | | I1 | | L1 | O1 | T1 | A1 | H4 | | | K5 | | DL | | R1 | DL | A1 | | | P3 | I1 | X8 | I1 | E1 | DL | | | | DL | T1 | | T1 | | | | t | | | DL | | | | | | H4 | | E1 | TL | | Y4 | I1 | R1 | R1 | | | | "
],
"text/plain": [
"['█',\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",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'B',\n",
" '█',\n",
" '█',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'Q',\n",
" '.',\n",
" '.',\n",
" 'R',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" 'U',\n",
" ':',\n",
" '.',\n",
" 'O',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" 'E',\n",
" '.',\n",
" 'O',\n",
" 'M',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'L',\n",
" '.',\n",
" 'N',\n",
" 'O',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'B',\n",
" 'O',\n",
" 'O',\n",
" 'D',\n",
" 'L',\n",
" 'E',\n",
" 'S',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'V',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'U',\n",
" ':',\n",
" 'S',\n",
" 'N',\n",
" 'E',\n",
" 'D',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" 'D',\n",
" '.',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'T',\n",
" 'A',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" 'N',\n",
" 'E',\n",
" 'A',\n",
" 'T',\n",
" 'N',\n",
" 'E',\n",
" 's',\n",
" 'S',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'W',\n",
" '█',\n",
" '█',\n",
" 'U',\n",
" 'V',\n",
" 'E',\n",
" 'A',\n",
" '.',\n",
" 'I',\n",
" '.',\n",
" 'L',\n",
" 'O',\n",
" 'T',\n",
" 'A',\n",
" 'H',\n",
" '.',\n",
" '.',\n",
" 'K',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'R',\n",
" ':',\n",
" 'A',\n",
" '.',\n",
" '.',\n",
" 'P',\n",
" 'I',\n",
" 'X',\n",
" 'I',\n",
" 'E',\n",
" ':',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'T',\n",
" '.',\n",
" 'T',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 't',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'H',\n",
" '.',\n",
" 'E',\n",
" '∴',\n",
" '.',\n",
" 'Y',\n",
" 'I',\n",
" 'R',\n",
" 'R',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█']"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"Player 0 with rack LCUIEIF makes Play(start=245, dir=17, letters='IF', rack='LCUEI') for 28 points ; draws: LCUEIGD; scores: [280, 258]"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
" | | | TW | | | TL | | TL | | | TW | | | | | | DL | | | DW | | | | DW | | | DL | | | | DL | | | DL | | | | | | DL | | | DL | B3 | TW | | | TL | | | | DW | | | | Q10 | | | R1 | | | DL | | | | DL | | DL | | | U1 | DL | | O1 | | DW | | | | TL | | | | TL | | E1 | | O1 | M3 | TL | | | | DL | | | | | | DL | L1 | | N1 | O1 | | | | DW | | | | B3 | O1 | O1 | D2 | L1 | E1 | S1 | | TL | | | | DL | V4 | | | | U1 | DL | S1 | N1 | E1 | D2 | | DW | | D2 | | I1 | | | | I1 | | | | T1 | A1 | | | N1 | E1 | A1 | T1 | N1 | E1 | s | S1 | | | DL | | W4 | U1 | V4 | E1 | A1 | | I1 | | L1 | O1 | T1 | A1 | H4 | | | K5 | | DL | | R1 | DL | A1 | | | P3 | I1 | X8 | I1 | E1 | DL | | | | DL | T1 | | T1 | I1 | | | t | | | DL | | | | | | H4 | | E1 | F4 | | Y4 | I1 | R1 | R1 | | | | "
],
"text/plain": [
"['█',\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",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'B',\n",
" '█',\n",
" '█',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'Q',\n",
" '.',\n",
" '.',\n",
" 'R',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" 'U',\n",
" ':',\n",
" '.',\n",
" 'O',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" 'E',\n",
" '.',\n",
" 'O',\n",
" 'M',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'L',\n",
" '.',\n",
" 'N',\n",
" 'O',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'B',\n",
" 'O',\n",
" 'O',\n",
" 'D',\n",
" 'L',\n",
" 'E',\n",
" 'S',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'V',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'U',\n",
" ':',\n",
" 'S',\n",
" 'N',\n",
" 'E',\n",
" 'D',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" 'D',\n",
" '.',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'T',\n",
" 'A',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" 'N',\n",
" 'E',\n",
" 'A',\n",
" 'T',\n",
" 'N',\n",
" 'E',\n",
" 's',\n",
" 'S',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'W',\n",
" '█',\n",
" '█',\n",
" 'U',\n",
" 'V',\n",
" 'E',\n",
" 'A',\n",
" '.',\n",
" 'I',\n",
" '.',\n",
" 'L',\n",
" 'O',\n",
" 'T',\n",
" 'A',\n",
" 'H',\n",
" '.',\n",
" '.',\n",
" 'K',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'R',\n",
" ':',\n",
" 'A',\n",
" '.',\n",
" '.',\n",
" 'P',\n",
" 'I',\n",
" 'X',\n",
" 'I',\n",
" 'E',\n",
" ':',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'T',\n",
" '.',\n",
" 'T',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" 't',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'H',\n",
" '.',\n",
" 'E',\n",
" 'F',\n",
" '.',\n",
" 'Y',\n",
" 'I',\n",
" 'R',\n",
" 'R',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█']"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"Player 1 with rack AZEOIMG makes Play(start=76, dir=17, letters='GAZEBO', rack='IM') for 36 points ; draws: IMGRORY; scores: [280, 294]"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
" | | | TW | | | TL | | TL | | | TW | | | | | | DL | | | DW | | | | DW | | | DL | | | | DL | | | DL | | | | | | DL | | | DL | B3 | TW | | | TL | | | | G2 | | | | Q10 | | | R1 | | | DL | | | | DL | A1 | DL | | | U1 | DL | | O1 | | DW | | | | TL | | Z10 | | TL | | E1 | | O1 | M3 | TL | | | | DL | | | E1 | | | DL | L1 | | N1 | O1 | | | | DW | | | | B3 | O1 | O1 | D2 | L1 | E1 | S1 | | TL | | | | DL | V4 | | O1 | | U1 | DL | S1 | N1 | E1 | D2 | | DW | | D2 | | I1 | | | | I1 | | | | T1 | A1 | | | N1 | E1 | A1 | T1 | N1 | E1 | s | S1 | | | DL | | W4 | U1 | V4 | E1 | A1 | | I1 | | L1 | O1 | T1 | A1 | H4 | | | K5 | | DL | | R1 | DL | A1 | | | P3 | I1 | X8 | I1 | E1 | DL | | | | DL | T1 | | T1 | I1 | | | t | | | DL | | | | | | H4 | | E1 | F4 | | Y4 | I1 | R1 | R1 | | | | "
],
"text/plain": [
"['█',\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",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'B',\n",
" '█',\n",
" '█',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'G',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'Q',\n",
" '.',\n",
" '.',\n",
" 'R',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'A',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" 'U',\n",
" ':',\n",
" '.',\n",
" 'O',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" 'Z',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" 'E',\n",
" '.',\n",
" 'O',\n",
" 'M',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" 'E',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'L',\n",
" '.',\n",
" 'N',\n",
" 'O',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'B',\n",
" 'O',\n",
" 'O',\n",
" 'D',\n",
" 'L',\n",
" 'E',\n",
" 'S',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'V',\n",
" '.',\n",
" 'O',\n",
" '.',\n",
" 'U',\n",
" ':',\n",
" 'S',\n",
" 'N',\n",
" 'E',\n",
" 'D',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" 'D',\n",
" '.',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'T',\n",
" 'A',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" 'N',\n",
" 'E',\n",
" 'A',\n",
" 'T',\n",
" 'N',\n",
" 'E',\n",
" 's',\n",
" 'S',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'W',\n",
" '█',\n",
" '█',\n",
" 'U',\n",
" 'V',\n",
" 'E',\n",
" 'A',\n",
" '.',\n",
" 'I',\n",
" '.',\n",
" 'L',\n",
" 'O',\n",
" 'T',\n",
" 'A',\n",
" 'H',\n",
" '.',\n",
" '.',\n",
" 'K',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'R',\n",
" ':',\n",
" 'A',\n",
" '.',\n",
" '.',\n",
" 'P',\n",
" 'I',\n",
" 'X',\n",
" 'I',\n",
" 'E',\n",
" ':',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'T',\n",
" '.',\n",
" 'T',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" 't',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'H',\n",
" '.',\n",
" 'E',\n",
" 'F',\n",
" '.',\n",
" 'Y',\n",
" 'I',\n",
" 'R',\n",
" 'R',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█']"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"Player 0 with rack LCUEIGD makes Play(start=110, dir=1, letters='ZIG', rack='LCUED') for 17 points ; draws: LCUEDEA; scores: [297, 294]"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
" | | | TW | | | TL | | TL | | | TW | | | | | | DL | | | DW | | | | DW | | | DL | | | | DL | | | DL | | | | | | DL | | | DL | B3 | TW | | | TL | | | | G2 | | | | Q10 | | | R1 | | | DL | | | | DL | A1 | DL | | | U1 | DL | | O1 | | DW | | | | TL | | Z10 | I1 | G2 | | E1 | | O1 | M3 | TL | | | | DL | | | E1 | | | DL | L1 | | N1 | O1 | | | | DW | | | | B3 | O1 | O1 | D2 | L1 | E1 | S1 | | TL | | | | DL | V4 | | O1 | | U1 | DL | S1 | N1 | E1 | D2 | | DW | | D2 | | I1 | | | | I1 | | | | T1 | A1 | | | N1 | E1 | A1 | T1 | N1 | E1 | s | S1 | | | DL | | W4 | U1 | V4 | E1 | A1 | | I1 | | L1 | O1 | T1 | A1 | H4 | | | K5 | | DL | | R1 | DL | A1 | | | P3 | I1 | X8 | I1 | E1 | DL | | | | DL | T1 | | T1 | I1 | | | t | | | DL | | | | | | H4 | | E1 | F4 | | Y4 | I1 | R1 | R1 | | | | "
],
"text/plain": [
"['█',\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",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'B',\n",
" '█',\n",
" '█',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'G',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'Q',\n",
" '.',\n",
" '.',\n",
" 'R',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'A',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" 'U',\n",
" ':',\n",
" '.',\n",
" 'O',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" 'Z',\n",
" 'I',\n",
" 'G',\n",
" '.',\n",
" 'E',\n",
" '.',\n",
" 'O',\n",
" 'M',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" 'E',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'L',\n",
" '.',\n",
" 'N',\n",
" 'O',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'B',\n",
" 'O',\n",
" 'O',\n",
" 'D',\n",
" 'L',\n",
" 'E',\n",
" 'S',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'V',\n",
" '.',\n",
" 'O',\n",
" '.',\n",
" 'U',\n",
" ':',\n",
" 'S',\n",
" 'N',\n",
" 'E',\n",
" 'D',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" 'D',\n",
" '.',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'T',\n",
" 'A',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" 'N',\n",
" 'E',\n",
" 'A',\n",
" 'T',\n",
" 'N',\n",
" 'E',\n",
" 's',\n",
" 'S',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'W',\n",
" '█',\n",
" '█',\n",
" 'U',\n",
" 'V',\n",
" 'E',\n",
" 'A',\n",
" '.',\n",
" 'I',\n",
" '.',\n",
" 'L',\n",
" 'O',\n",
" 'T',\n",
" 'A',\n",
" 'H',\n",
" '.',\n",
" '.',\n",
" 'K',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'R',\n",
" ':',\n",
" 'A',\n",
" '.',\n",
" '.',\n",
" 'P',\n",
" 'I',\n",
" 'X',\n",
" 'I',\n",
" 'E',\n",
" ':',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'T',\n",
" '.',\n",
" 'T',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" 't',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'H',\n",
" '.',\n",
" 'E',\n",
" 'F',\n",
" '.',\n",
" 'Y',\n",
" 'I',\n",
" 'R',\n",
" 'R',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█']"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"Player 1 with rack IMGRORY makes Play(start=92, dir=1, letters='YAM', rack='IGROR') for 22 points ; draws: IGRORNJ; scores: [297, 316]"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
" | | | TW | | | TL | | TL | | | TW | | | | | | DL | | | DW | | | | DW | | | DL | | | | DL | | | DL | | | | | | DL | | | DL | B3 | TW | | | TL | | | | G2 | | | | Q10 | | | R1 | | | DL | | | | Y4 | A1 | M3 | | | U1 | DL | | O1 | | DW | | | | TL | | Z10 | I1 | G2 | | E1 | | O1 | M3 | TL | | | | DL | | | E1 | | | DL | L1 | | N1 | O1 | | | | DW | | | | B3 | O1 | O1 | D2 | L1 | E1 | S1 | | TL | | | | DL | V4 | | O1 | | U1 | DL | S1 | N1 | E1 | D2 | | DW | | D2 | | I1 | | | | I1 | | | | T1 | A1 | | | N1 | E1 | A1 | T1 | N1 | E1 | s | S1 | | | DL | | W4 | U1 | V4 | E1 | A1 | | I1 | | L1 | O1 | T1 | A1 | H4 | | | K5 | | DL | | R1 | DL | A1 | | | P3 | I1 | X8 | I1 | E1 | DL | | | | DL | T1 | | T1 | I1 | | | t | | | DL | | | | | | H4 | | E1 | F4 | | Y4 | I1 | R1 | R1 | | | | "
],
"text/plain": [
"['█',\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",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'B',\n",
" '█',\n",
" '█',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'G',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'Q',\n",
" '.',\n",
" '.',\n",
" 'R',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'Y',\n",
" 'A',\n",
" 'M',\n",
" '.',\n",
" '.',\n",
" 'U',\n",
" ':',\n",
" '.',\n",
" 'O',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" 'Z',\n",
" 'I',\n",
" 'G',\n",
" '.',\n",
" 'E',\n",
" '.',\n",
" 'O',\n",
" 'M',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" 'E',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'L',\n",
" '.',\n",
" 'N',\n",
" 'O',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'B',\n",
" 'O',\n",
" 'O',\n",
" 'D',\n",
" 'L',\n",
" 'E',\n",
" 'S',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'V',\n",
" '.',\n",
" 'O',\n",
" '.',\n",
" 'U',\n",
" ':',\n",
" 'S',\n",
" 'N',\n",
" 'E',\n",
" 'D',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" 'D',\n",
" '.',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'T',\n",
" 'A',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" 'N',\n",
" 'E',\n",
" 'A',\n",
" 'T',\n",
" 'N',\n",
" 'E',\n",
" 's',\n",
" 'S',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'W',\n",
" '█',\n",
" '█',\n",
" 'U',\n",
" 'V',\n",
" 'E',\n",
" 'A',\n",
" '.',\n",
" 'I',\n",
" '.',\n",
" 'L',\n",
" 'O',\n",
" 'T',\n",
" 'A',\n",
" 'H',\n",
" '.',\n",
" '.',\n",
" 'K',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'R',\n",
" ':',\n",
" 'A',\n",
" '.',\n",
" '.',\n",
" 'P',\n",
" 'I',\n",
" 'X',\n",
" 'I',\n",
" 'E',\n",
" ':',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'T',\n",
" '.',\n",
" 'T',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" 't',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'H',\n",
" '.',\n",
" 'E',\n",
" 'F',\n",
" '.',\n",
" 'Y',\n",
" 'I',\n",
" 'R',\n",
" 'R',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█']"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"Player 0 with rack LCUEDEA makes Play(start=24, dir=17, letters='DECAY', rack='LUE') for 18 points ; draws: LUETSAW; scores: [315, 316]"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
" | | | TW | | | D2 | | TL | | | TW | | | | | | DL | | | DW | E1 | | | DW | | | DL | | | | DL | | | DL | | C3 | | | | DL | | | DL | B3 | TW | | | TL | | | A1 | G2 | | | | Q10 | | | R1 | | | DL | | | | Y4 | A1 | M3 | | | U1 | DL | | O1 | | DW | | | | TL | | Z10 | I1 | G2 | | E1 | | O1 | M3 | TL | | | | DL | | | E1 | | | DL | L1 | | N1 | O1 | | | | DW | | | | B3 | O1 | O1 | D2 | L1 | E1 | S1 | | TL | | | | DL | V4 | | O1 | | U1 | DL | S1 | N1 | E1 | D2 | | DW | | D2 | | I1 | | | | I1 | | | | T1 | A1 | | | N1 | E1 | A1 | T1 | N1 | E1 | s | S1 | | | DL | | W4 | U1 | V4 | E1 | A1 | | I1 | | L1 | O1 | T1 | A1 | H4 | | | K5 | | DL | | R1 | DL | A1 | | | P3 | I1 | X8 | I1 | E1 | DL | | | | DL | T1 | | T1 | I1 | | | t | | | DL | | | | | | H4 | | E1 | F4 | | Y4 | I1 | R1 | R1 | | | | "
],
"text/plain": [
"['█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" 'D',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" 'E',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'C',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'B',\n",
" '█',\n",
" '█',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" 'A',\n",
" 'G',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'Q',\n",
" '.',\n",
" '.',\n",
" 'R',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'Y',\n",
" 'A',\n",
" 'M',\n",
" '.',\n",
" '.',\n",
" 'U',\n",
" ':',\n",
" '.',\n",
" 'O',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" 'Z',\n",
" 'I',\n",
" 'G',\n",
" '.',\n",
" 'E',\n",
" '.',\n",
" 'O',\n",
" 'M',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" 'E',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'L',\n",
" '.',\n",
" 'N',\n",
" 'O',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'B',\n",
" 'O',\n",
" 'O',\n",
" 'D',\n",
" 'L',\n",
" 'E',\n",
" 'S',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'V',\n",
" '.',\n",
" 'O',\n",
" '.',\n",
" 'U',\n",
" ':',\n",
" 'S',\n",
" 'N',\n",
" 'E',\n",
" 'D',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" 'D',\n",
" '.',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'T',\n",
" 'A',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" 'N',\n",
" 'E',\n",
" 'A',\n",
" 'T',\n",
" 'N',\n",
" 'E',\n",
" 's',\n",
" 'S',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'W',\n",
" '█',\n",
" '█',\n",
" 'U',\n",
" 'V',\n",
" 'E',\n",
" 'A',\n",
" '.',\n",
" 'I',\n",
" '.',\n",
" 'L',\n",
" 'O',\n",
" 'T',\n",
" 'A',\n",
" 'H',\n",
" '.',\n",
" '.',\n",
" 'K',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'R',\n",
" ':',\n",
" 'A',\n",
" '.',\n",
" '.',\n",
" 'P',\n",
" 'I',\n",
" 'X',\n",
" 'I',\n",
" 'E',\n",
" ':',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'T',\n",
" '.',\n",
" 'T',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" 't',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'H',\n",
" '.',\n",
" 'E',\n",
" 'F',\n",
" '.',\n",
" 'Y',\n",
" 'I',\n",
" 'R',\n",
" 'R',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█']"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"Player 1 with rack IGRORNJ makes Play(start=40, dir=1, letters='REJOIN', rack='GR') for 52 points ; draws: GRNPFEC; scores: [315, 368]"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
" | | | TW | | | D2 | | TL | | | TW | | | | | | DL | | | R1 | E1 | J8 | O1 | I1 | N1 | | DL | | | | DL | | | DL | | C3 | | | | DL | | | DL | B3 | TW | | | TL | | | A1 | G2 | | | | Q10 | | | R1 | | | DL | | | | Y4 | A1 | M3 | | | U1 | DL | | O1 | | DW | | | | TL | | Z10 | I1 | G2 | | E1 | | O1 | M3 | TL | | | | DL | | | E1 | | | DL | L1 | | N1 | O1 | | | | DW | | | | B3 | O1 | O1 | D2 | L1 | E1 | S1 | | TL | | | | DL | V4 | | O1 | | U1 | DL | S1 | N1 | E1 | D2 | | DW | | D2 | | I1 | | | | I1 | | | | T1 | A1 | | | N1 | E1 | A1 | T1 | N1 | E1 | s | S1 | | | DL | | W4 | U1 | V4 | E1 | A1 | | I1 | | L1 | O1 | T1 | A1 | H4 | | | K5 | | DL | | R1 | DL | A1 | | | P3 | I1 | X8 | I1 | E1 | DL | | | | DL | T1 | | T1 | I1 | | | t | | | DL | | | | | | H4 | | E1 | F4 | | Y4 | I1 | R1 | R1 | | | | "
],
"text/plain": [
"['█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" 'D',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" 'R',\n",
" 'E',\n",
" 'J',\n",
" 'O',\n",
" 'I',\n",
" 'N',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'C',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'B',\n",
" '█',\n",
" '█',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" 'A',\n",
" 'G',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'Q',\n",
" '.',\n",
" '.',\n",
" 'R',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'Y',\n",
" 'A',\n",
" 'M',\n",
" '.',\n",
" '.',\n",
" 'U',\n",
" ':',\n",
" '.',\n",
" 'O',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" 'Z',\n",
" 'I',\n",
" 'G',\n",
" '.',\n",
" 'E',\n",
" '.',\n",
" 'O',\n",
" 'M',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" 'E',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'L',\n",
" '.',\n",
" 'N',\n",
" 'O',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'B',\n",
" 'O',\n",
" 'O',\n",
" 'D',\n",
" 'L',\n",
" 'E',\n",
" 'S',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'V',\n",
" '.',\n",
" 'O',\n",
" '.',\n",
" 'U',\n",
" ':',\n",
" 'S',\n",
" 'N',\n",
" 'E',\n",
" 'D',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" 'D',\n",
" '.',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'T',\n",
" 'A',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" 'N',\n",
" 'E',\n",
" 'A',\n",
" 'T',\n",
" 'N',\n",
" 'E',\n",
" 's',\n",
" 'S',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'W',\n",
" '█',\n",
" '█',\n",
" 'U',\n",
" 'V',\n",
" 'E',\n",
" 'A',\n",
" '.',\n",
" 'I',\n",
" '.',\n",
" 'L',\n",
" 'O',\n",
" 'T',\n",
" 'A',\n",
" 'H',\n",
" '.',\n",
" '.',\n",
" 'K',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'R',\n",
" ':',\n",
" 'A',\n",
" '.',\n",
" '.',\n",
" 'P',\n",
" 'I',\n",
" 'X',\n",
" 'I',\n",
" 'E',\n",
" ':',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'T',\n",
" '.',\n",
" 'T',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" 't',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'H',\n",
" '.',\n",
" 'E',\n",
" 'F',\n",
" '.',\n",
" 'Y',\n",
" 'I',\n",
" 'R',\n",
" 'R',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█']"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"Player 0 with rack LUETSAW makes Play(start=26, dir=1, letters='WAES', rack='LUT') for 62 points ; draws: LUTA; scores: [377, 368]"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
" | | | TW | | | D2 | | W4 | A1 | E1 | S1 | | | | | | DL | | | R1 | E1 | J8 | O1 | I1 | N1 | | DL | | | | DL | | | DL | | C3 | | | | DL | | | DL | B3 | TW | | | TL | | | A1 | G2 | | | | Q10 | | | R1 | | | DL | | | | Y4 | A1 | M3 | | | U1 | DL | | O1 | | DW | | | | TL | | Z10 | I1 | G2 | | E1 | | O1 | M3 | TL | | | | DL | | | E1 | | | DL | L1 | | N1 | O1 | | | | DW | | | | B3 | O1 | O1 | D2 | L1 | E1 | S1 | | TL | | | | DL | V4 | | O1 | | U1 | DL | S1 | N1 | E1 | D2 | | DW | | D2 | | I1 | | | | I1 | | | | T1 | A1 | | | N1 | E1 | A1 | T1 | N1 | E1 | s | S1 | | | DL | | W4 | U1 | V4 | E1 | A1 | | I1 | | L1 | O1 | T1 | A1 | H4 | | | K5 | | DL | | R1 | DL | A1 | | | P3 | I1 | X8 | I1 | E1 | DL | | | | DL | T1 | | T1 | I1 | | | t | | | DL | | | | | | H4 | | E1 | F4 | | Y4 | I1 | R1 | R1 | | | | "
],
"text/plain": [
"['█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" 'D',\n",
" '.',\n",
" 'W',\n",
" 'A',\n",
" 'E',\n",
" 'S',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" 'R',\n",
" 'E',\n",
" 'J',\n",
" 'O',\n",
" 'I',\n",
" 'N',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'C',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'B',\n",
" '█',\n",
" '█',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" 'A',\n",
" 'G',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'Q',\n",
" '.',\n",
" '.',\n",
" 'R',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'Y',\n",
" 'A',\n",
" 'M',\n",
" '.',\n",
" '.',\n",
" 'U',\n",
" ':',\n",
" '.',\n",
" 'O',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" 'Z',\n",
" 'I',\n",
" 'G',\n",
" '.',\n",
" 'E',\n",
" '.',\n",
" 'O',\n",
" 'M',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" 'E',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'L',\n",
" '.',\n",
" 'N',\n",
" 'O',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'B',\n",
" 'O',\n",
" 'O',\n",
" 'D',\n",
" 'L',\n",
" 'E',\n",
" 'S',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'V',\n",
" '.',\n",
" 'O',\n",
" '.',\n",
" 'U',\n",
" ':',\n",
" 'S',\n",
" 'N',\n",
" 'E',\n",
" 'D',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" 'D',\n",
" '.',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'T',\n",
" 'A',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" 'N',\n",
" 'E',\n",
" 'A',\n",
" 'T',\n",
" 'N',\n",
" 'E',\n",
" 's',\n",
" 'S',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'W',\n",
" '█',\n",
" '█',\n",
" 'U',\n",
" 'V',\n",
" 'E',\n",
" 'A',\n",
" '.',\n",
" 'I',\n",
" '.',\n",
" 'L',\n",
" 'O',\n",
" 'T',\n",
" 'A',\n",
" 'H',\n",
" '.',\n",
" '.',\n",
" 'K',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'R',\n",
" ':',\n",
" 'A',\n",
" '.',\n",
" '.',\n",
" 'P',\n",
" 'I',\n",
" 'X',\n",
" 'I',\n",
" 'E',\n",
" ':',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'T',\n",
" '.',\n",
" 'T',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" 't',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'H',\n",
" '.',\n",
" 'E',\n",
" 'F',\n",
" '.',\n",
" 'Y',\n",
" 'I',\n",
" 'R',\n",
" 'R',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█']"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"Player 1 with rack GRNPFEC makes Play(start=60, dir=1, letters='ENG', rack='RPFC') for 21 points ; draws: RPFC; scores: [377, 389]"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
" | | | TW | | | D2 | | W4 | A1 | E1 | S1 | | | | | | DL | | | R1 | E1 | J8 | O1 | I1 | N1 | | DL | | | | DL | | | DL | | C3 | | E1 | N1 | G2 | | | DL | B3 | TW | | | TL | | | A1 | G2 | | | | Q10 | | | R1 | | | DL | | | | Y4 | A1 | M3 | | | U1 | DL | | O1 | | DW | | | | TL | | Z10 | I1 | G2 | | E1 | | O1 | M3 | TL | | | | DL | | | E1 | | | DL | L1 | | N1 | O1 | | | | DW | | | | B3 | O1 | O1 | D2 | L1 | E1 | S1 | | TL | | | | DL | V4 | | O1 | | U1 | DL | S1 | N1 | E1 | D2 | | DW | | D2 | | I1 | | | | I1 | | | | T1 | A1 | | | N1 | E1 | A1 | T1 | N1 | E1 | s | S1 | | | DL | | W4 | U1 | V4 | E1 | A1 | | I1 | | L1 | O1 | T1 | A1 | H4 | | | K5 | | DL | | R1 | DL | A1 | | | P3 | I1 | X8 | I1 | E1 | DL | | | | DL | T1 | | T1 | I1 | | | t | | | DL | | | | | | H4 | | E1 | F4 | | Y4 | I1 | R1 | R1 | | | | "
],
"text/plain": [
"['█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" 'D',\n",
" '.',\n",
" 'W',\n",
" 'A',\n",
" 'E',\n",
" 'S',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" 'R',\n",
" 'E',\n",
" 'J',\n",
" 'O',\n",
" 'I',\n",
" 'N',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'C',\n",
" '.',\n",
" 'E',\n",
" 'N',\n",
" 'G',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'B',\n",
" '█',\n",
" '█',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" 'A',\n",
" 'G',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'Q',\n",
" '.',\n",
" '.',\n",
" 'R',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'Y',\n",
" 'A',\n",
" 'M',\n",
" '.',\n",
" '.',\n",
" 'U',\n",
" ':',\n",
" '.',\n",
" 'O',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" 'Z',\n",
" 'I',\n",
" 'G',\n",
" '.',\n",
" 'E',\n",
" '.',\n",
" 'O',\n",
" 'M',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" 'E',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'L',\n",
" '.',\n",
" 'N',\n",
" 'O',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'B',\n",
" 'O',\n",
" 'O',\n",
" 'D',\n",
" 'L',\n",
" 'E',\n",
" 'S',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'V',\n",
" '.',\n",
" 'O',\n",
" '.',\n",
" 'U',\n",
" ':',\n",
" 'S',\n",
" 'N',\n",
" 'E',\n",
" 'D',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" 'D',\n",
" '.',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'T',\n",
" 'A',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" 'N',\n",
" 'E',\n",
" 'A',\n",
" 'T',\n",
" 'N',\n",
" 'E',\n",
" 's',\n",
" 'S',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'W',\n",
" '█',\n",
" '█',\n",
" 'U',\n",
" 'V',\n",
" 'E',\n",
" 'A',\n",
" '.',\n",
" 'I',\n",
" '.',\n",
" 'L',\n",
" 'O',\n",
" 'T',\n",
" 'A',\n",
" 'H',\n",
" '.',\n",
" '.',\n",
" 'K',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'R',\n",
" ':',\n",
" 'A',\n",
" '.',\n",
" '.',\n",
" 'P',\n",
" 'I',\n",
" 'X',\n",
" 'I',\n",
" 'E',\n",
" ':',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'T',\n",
" '.',\n",
" 'T',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" 't',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'H',\n",
" '.',\n",
" 'E',\n",
" 'F',\n",
" '.',\n",
" 'Y',\n",
" 'I',\n",
" 'R',\n",
" 'R',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█']"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"Player 0 with rack LUTA makes Play(start=172, dir=1, letters='TAD', rack='LU') for 11 points ; draws: LU; scores: [388, 389]"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
" | | | TW | | | D2 | | W4 | A1 | E1 | S1 | | | | | | DL | | | R1 | E1 | J8 | O1 | I1 | N1 | | DL | | | | DL | | | DL | | C3 | | E1 | N1 | G2 | | | DL | B3 | TW | | | TL | | | A1 | G2 | | | | Q10 | | | R1 | | | DL | | | | Y4 | A1 | M3 | | | U1 | DL | | O1 | | DW | | | | TL | | Z10 | I1 | G2 | | E1 | | O1 | M3 | TL | | | | DL | | | E1 | | | DL | L1 | | N1 | O1 | | | | DW | | | | B3 | O1 | O1 | D2 | L1 | E1 | S1 | | TL | | | | DL | V4 | | O1 | | U1 | DL | S1 | N1 | E1 | D2 | | T1 | A1 | D2 | | I1 | | | | I1 | | | | T1 | A1 | | | N1 | E1 | A1 | T1 | N1 | E1 | s | S1 | | | DL | | W4 | U1 | V4 | E1 | A1 | | I1 | | L1 | O1 | T1 | A1 | H4 | | | K5 | | DL | | R1 | DL | A1 | | | P3 | I1 | X8 | I1 | E1 | DL | | | | DL | T1 | | T1 | I1 | | | t | | | DL | | | | | | H4 | | E1 | F4 | | Y4 | I1 | R1 | R1 | | | | "
],
"text/plain": [
"['█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" 'D',\n",
" '.',\n",
" 'W',\n",
" 'A',\n",
" 'E',\n",
" 'S',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" 'R',\n",
" 'E',\n",
" 'J',\n",
" 'O',\n",
" 'I',\n",
" 'N',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'C',\n",
" '.',\n",
" 'E',\n",
" 'N',\n",
" 'G',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'B',\n",
" '█',\n",
" '█',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" 'A',\n",
" 'G',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'Q',\n",
" '.',\n",
" '.',\n",
" 'R',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'Y',\n",
" 'A',\n",
" 'M',\n",
" '.',\n",
" '.',\n",
" 'U',\n",
" ':',\n",
" '.',\n",
" 'O',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" 'Z',\n",
" 'I',\n",
" 'G',\n",
" '.',\n",
" 'E',\n",
" '.',\n",
" 'O',\n",
" 'M',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" 'E',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'L',\n",
" '.',\n",
" 'N',\n",
" 'O',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'B',\n",
" 'O',\n",
" 'O',\n",
" 'D',\n",
" 'L',\n",
" 'E',\n",
" 'S',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'V',\n",
" '.',\n",
" 'O',\n",
" '.',\n",
" 'U',\n",
" ':',\n",
" 'S',\n",
" 'N',\n",
" 'E',\n",
" 'D',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" 'T',\n",
" 'A',\n",
" 'D',\n",
" '.',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'T',\n",
" 'A',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" 'N',\n",
" 'E',\n",
" 'A',\n",
" 'T',\n",
" 'N',\n",
" 'E',\n",
" 's',\n",
" 'S',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'W',\n",
" '█',\n",
" '█',\n",
" 'U',\n",
" 'V',\n",
" 'E',\n",
" 'A',\n",
" '.',\n",
" 'I',\n",
" '.',\n",
" 'L',\n",
" 'O',\n",
" 'T',\n",
" 'A',\n",
" 'H',\n",
" '.',\n",
" '.',\n",
" 'K',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'R',\n",
" ':',\n",
" 'A',\n",
" '.',\n",
" '.',\n",
" 'P',\n",
" 'I',\n",
" 'X',\n",
" 'I',\n",
" 'E',\n",
" ':',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'T',\n",
" '.',\n",
" 'T',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" 't',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'H',\n",
" '.',\n",
" 'E',\n",
" 'F',\n",
" '.',\n",
" 'Y',\n",
" 'I',\n",
" 'R',\n",
" 'R',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█']"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"Player 1 with rack RPFC makes Play(start=96, dir=1, letters='CUP', rack='RF') for 10 points ; draws: RF; scores: [388, 399]"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
" | | | TW | | | D2 | | W4 | A1 | E1 | S1 | | | | | | DL | | | R1 | E1 | J8 | O1 | I1 | N1 | | DL | | | | DL | | | DL | | C3 | | E1 | N1 | G2 | | | DL | B3 | TW | | | TL | | | A1 | G2 | | | | Q10 | | | R1 | | | DL | | | | Y4 | A1 | M3 | | C3 | U1 | P3 | | O1 | | DW | | | | TL | | Z10 | I1 | G2 | | E1 | | O1 | M3 | TL | | | | DL | | | E1 | | | DL | L1 | | N1 | O1 | | | | DW | | | | B3 | O1 | O1 | D2 | L1 | E1 | S1 | | TL | | | | DL | V4 | | O1 | | U1 | DL | S1 | N1 | E1 | D2 | | T1 | A1 | D2 | | I1 | | | | I1 | | | | T1 | A1 | | | N1 | E1 | A1 | T1 | N1 | E1 | s | S1 | | | DL | | W4 | U1 | V4 | E1 | A1 | | I1 | | L1 | O1 | T1 | A1 | H4 | | | K5 | | DL | | R1 | DL | A1 | | | P3 | I1 | X8 | I1 | E1 | DL | | | | DL | T1 | | T1 | I1 | | | t | | | DL | | | | | | H4 | | E1 | F4 | | Y4 | I1 | R1 | R1 | | | | "
],
"text/plain": [
"['█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" 'D',\n",
" '.',\n",
" 'W',\n",
" 'A',\n",
" 'E',\n",
" 'S',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" 'R',\n",
" 'E',\n",
" 'J',\n",
" 'O',\n",
" 'I',\n",
" 'N',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'C',\n",
" '.',\n",
" 'E',\n",
" 'N',\n",
" 'G',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'B',\n",
" '█',\n",
" '█',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" 'A',\n",
" 'G',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'Q',\n",
" '.',\n",
" '.',\n",
" 'R',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'Y',\n",
" 'A',\n",
" 'M',\n",
" '.',\n",
" 'C',\n",
" 'U',\n",
" 'P',\n",
" '.',\n",
" 'O',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" 'Z',\n",
" 'I',\n",
" 'G',\n",
" '.',\n",
" 'E',\n",
" '.',\n",
" 'O',\n",
" 'M',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" 'E',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'L',\n",
" '.',\n",
" 'N',\n",
" 'O',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'B',\n",
" 'O',\n",
" 'O',\n",
" 'D',\n",
" 'L',\n",
" 'E',\n",
" 'S',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'V',\n",
" '.',\n",
" 'O',\n",
" '.',\n",
" 'U',\n",
" ':',\n",
" 'S',\n",
" 'N',\n",
" 'E',\n",
" 'D',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" 'T',\n",
" 'A',\n",
" 'D',\n",
" '.',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'T',\n",
" 'A',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" 'N',\n",
" 'E',\n",
" 'A',\n",
" 'T',\n",
" 'N',\n",
" 'E',\n",
" 's',\n",
" 'S',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'W',\n",
" '█',\n",
" '█',\n",
" 'U',\n",
" 'V',\n",
" 'E',\n",
" 'A',\n",
" '.',\n",
" 'I',\n",
" '.',\n",
" 'L',\n",
" 'O',\n",
" 'T',\n",
" 'A',\n",
" 'H',\n",
" '.',\n",
" '.',\n",
" 'K',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'R',\n",
" ':',\n",
" 'A',\n",
" '.',\n",
" '.',\n",
" 'P',\n",
" 'I',\n",
" 'X',\n",
" 'I',\n",
" 'E',\n",
" ':',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'T',\n",
" '.',\n",
" 'T',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" 't',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'H',\n",
" '.',\n",
" 'E',\n",
" 'F',\n",
" '.',\n",
" 'Y',\n",
" 'I',\n",
" 'R',\n",
" 'R',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█']"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"Player 0 with rack LU makes Play(start=127, dir=1, letters='EL', rack='U') for 8 points ; draws: U; scores: [396, 399]"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
" | | | TW | | | D2 | | W4 | A1 | E1 | S1 | | | | | | DL | | | R1 | E1 | J8 | O1 | I1 | N1 | | DL | | | | DL | | | DL | | C3 | | E1 | N1 | G2 | | | DL | B3 | TW | | | TL | | | A1 | G2 | | | | Q10 | | | R1 | | | DL | | | | Y4 | A1 | M3 | | C3 | U1 | P3 | | O1 | | DW | | | | TL | | Z10 | I1 | G2 | | E1 | | O1 | M3 | TL | | | | DL | | | E1 | L1 | | DL | L1 | | N1 | O1 | | | | DW | | | | B3 | O1 | O1 | D2 | L1 | E1 | S1 | | TL | | | | DL | V4 | | O1 | | U1 | DL | S1 | N1 | E1 | D2 | | T1 | A1 | D2 | | I1 | | | | I1 | | | | T1 | A1 | | | N1 | E1 | A1 | T1 | N1 | E1 | s | S1 | | | DL | | W4 | U1 | V4 | E1 | A1 | | I1 | | L1 | O1 | T1 | A1 | H4 | | | K5 | | DL | | R1 | DL | A1 | | | P3 | I1 | X8 | I1 | E1 | DL | | | | DL | T1 | | T1 | I1 | | | t | | | DL | | | | | | H4 | | E1 | F4 | | Y4 | I1 | R1 | R1 | | | | "
],
"text/plain": [
"['█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" 'D',\n",
" '.',\n",
" 'W',\n",
" 'A',\n",
" 'E',\n",
" 'S',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" 'R',\n",
" 'E',\n",
" 'J',\n",
" 'O',\n",
" 'I',\n",
" 'N',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'C',\n",
" '.',\n",
" 'E',\n",
" 'N',\n",
" 'G',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'B',\n",
" '█',\n",
" '█',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" 'A',\n",
" 'G',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'Q',\n",
" '.',\n",
" '.',\n",
" 'R',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'Y',\n",
" 'A',\n",
" 'M',\n",
" '.',\n",
" 'C',\n",
" 'U',\n",
" 'P',\n",
" '.',\n",
" 'O',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" 'Z',\n",
" 'I',\n",
" 'G',\n",
" '.',\n",
" 'E',\n",
" '.',\n",
" 'O',\n",
" 'M',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" 'E',\n",
" 'L',\n",
" '.',\n",
" ':',\n",
" 'L',\n",
" '.',\n",
" 'N',\n",
" 'O',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'B',\n",
" 'O',\n",
" 'O',\n",
" 'D',\n",
" 'L',\n",
" 'E',\n",
" 'S',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'V',\n",
" '.',\n",
" 'O',\n",
" '.',\n",
" 'U',\n",
" ':',\n",
" 'S',\n",
" 'N',\n",
" 'E',\n",
" 'D',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" 'T',\n",
" 'A',\n",
" 'D',\n",
" '.',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'T',\n",
" 'A',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" 'N',\n",
" 'E',\n",
" 'A',\n",
" 'T',\n",
" 'N',\n",
" 'E',\n",
" 's',\n",
" 'S',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'W',\n",
" '█',\n",
" '█',\n",
" 'U',\n",
" 'V',\n",
" 'E',\n",
" 'A',\n",
" '.',\n",
" 'I',\n",
" '.',\n",
" 'L',\n",
" 'O',\n",
" 'T',\n",
" 'A',\n",
" 'H',\n",
" '.',\n",
" '.',\n",
" 'K',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'R',\n",
" ':',\n",
" 'A',\n",
" '.',\n",
" '.',\n",
" 'P',\n",
" 'I',\n",
" 'X',\n",
" 'I',\n",
" 'E',\n",
" ':',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'T',\n",
" '.',\n",
" 'T',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" 't',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'H',\n",
" '.',\n",
" 'E',\n",
" 'F',\n",
" '.',\n",
" 'Y',\n",
" 'I',\n",
" 'R',\n",
" 'R',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█']"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"Player 1 with rack RF makes Play(start=234, dir=17, letters='EF', rack='R') for 9 points ; draws: R; scores: [396, 408]"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
" | | | TW | | | D2 | | W4 | A1 | E1 | S1 | | | | | | DL | | | R1 | E1 | J8 | O1 | I1 | N1 | | DL | | | | DL | | | DL | | C3 | | E1 | N1 | G2 | | | DL | B3 | TW | | | TL | | | A1 | G2 | | | | Q10 | | | R1 | | | DL | | | | Y4 | A1 | M3 | | C3 | U1 | P3 | | O1 | | DW | | | | TL | | Z10 | I1 | G2 | | E1 | | O1 | M3 | TL | | | | DL | | | E1 | L1 | | DL | L1 | | N1 | O1 | | | | DW | | | | B3 | O1 | O1 | D2 | L1 | E1 | S1 | | TL | | | | DL | V4 | | O1 | | U1 | DL | S1 | N1 | E1 | D2 | | T1 | A1 | D2 | | I1 | | | | I1 | | | | T1 | A1 | | | N1 | E1 | A1 | T1 | N1 | E1 | s | S1 | | | DL | | W4 | U1 | V4 | E1 | A1 | | I1 | | L1 | O1 | T1 | A1 | H4 | | | K5 | | DL | | R1 | DL | A1 | | | P3 | I1 | X8 | I1 | E1 | DL | | | | DL | T1 | | T1 | I1 | | | t | | | F4 | | | | | | H4 | | E1 | F4 | | Y4 | I1 | R1 | R1 | | | | "
],
"text/plain": [
"['█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" 'D',\n",
" '.',\n",
" 'W',\n",
" 'A',\n",
" 'E',\n",
" 'S',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" 'R',\n",
" 'E',\n",
" 'J',\n",
" 'O',\n",
" 'I',\n",
" 'N',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'C',\n",
" '.',\n",
" 'E',\n",
" 'N',\n",
" 'G',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'B',\n",
" '█',\n",
" '█',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" 'A',\n",
" 'G',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'Q',\n",
" '.',\n",
" '.',\n",
" 'R',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'Y',\n",
" 'A',\n",
" 'M',\n",
" '.',\n",
" 'C',\n",
" 'U',\n",
" 'P',\n",
" '.',\n",
" 'O',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" 'Z',\n",
" 'I',\n",
" 'G',\n",
" '.',\n",
" 'E',\n",
" '.',\n",
" 'O',\n",
" 'M',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" 'E',\n",
" 'L',\n",
" '.',\n",
" ':',\n",
" 'L',\n",
" '.',\n",
" 'N',\n",
" 'O',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'B',\n",
" 'O',\n",
" 'O',\n",
" 'D',\n",
" 'L',\n",
" 'E',\n",
" 'S',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'V',\n",
" '.',\n",
" 'O',\n",
" '.',\n",
" 'U',\n",
" ':',\n",
" 'S',\n",
" 'N',\n",
" 'E',\n",
" 'D',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" 'T',\n",
" 'A',\n",
" 'D',\n",
" '.',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'T',\n",
" 'A',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" 'N',\n",
" 'E',\n",
" 'A',\n",
" 'T',\n",
" 'N',\n",
" 'E',\n",
" 's',\n",
" 'S',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'W',\n",
" '█',\n",
" '█',\n",
" 'U',\n",
" 'V',\n",
" 'E',\n",
" 'A',\n",
" '.',\n",
" 'I',\n",
" '.',\n",
" 'L',\n",
" 'O',\n",
" 'T',\n",
" 'A',\n",
" 'H',\n",
" '.',\n",
" '.',\n",
" 'K',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'R',\n",
" ':',\n",
" 'A',\n",
" '.',\n",
" '.',\n",
" 'P',\n",
" 'I',\n",
" 'X',\n",
" 'I',\n",
" 'E',\n",
" ':',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'T',\n",
" '.',\n",
" 'T',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" 't',\n",
" '.',\n",
" '.',\n",
" 'F',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'H',\n",
" '.',\n",
" 'E',\n",
" 'F',\n",
" '.',\n",
" 'Y',\n",
" 'I',\n",
" 'R',\n",
" 'R',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█']"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"Player 0 with rack U makes Play(start=258, dir=1, letters='UH', rack='') for 5 points ; draws: ; scores: [401, 408]"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
" | | | TW | | | D2 | | W4 | A1 | E1 | S1 | | | | | | DL | | | R1 | E1 | J8 | O1 | I1 | N1 | | DL | | | | DL | | | DL | | C3 | | E1 | N1 | G2 | | | DL | B3 | TW | | | TL | | | A1 | G2 | | | | Q10 | | | R1 | | | DL | | | | Y4 | A1 | M3 | | C3 | U1 | P3 | | O1 | | DW | | | | TL | | Z10 | I1 | G2 | | E1 | | O1 | M3 | TL | | | | DL | | | E1 | L1 | | DL | L1 | | N1 | O1 | | | | DW | | | | B3 | O1 | O1 | D2 | L1 | E1 | S1 | | TL | | | | DL | V4 | | O1 | | U1 | DL | S1 | N1 | E1 | D2 | | T1 | A1 | D2 | | I1 | | | | I1 | | | | T1 | A1 | | | N1 | E1 | A1 | T1 | N1 | E1 | s | S1 | | | DL | | W4 | U1 | V4 | E1 | A1 | | I1 | | L1 | O1 | T1 | A1 | H4 | | | K5 | | DL | | R1 | DL | A1 | | | P3 | I1 | X8 | I1 | E1 | DL | | | | DL | T1 | | T1 | I1 | | | t | | | F4 | | | | | U1 | H4 | | E1 | F4 | | Y4 | I1 | R1 | R1 | | | | "
],
"text/plain": [
"['█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" 'D',\n",
" '.',\n",
" 'W',\n",
" 'A',\n",
" 'E',\n",
" 'S',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" 'R',\n",
" 'E',\n",
" 'J',\n",
" 'O',\n",
" 'I',\n",
" 'N',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'C',\n",
" '.',\n",
" 'E',\n",
" 'N',\n",
" 'G',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'B',\n",
" '█',\n",
" '█',\n",
" '≡',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" 'A',\n",
" 'G',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'Q',\n",
" '.',\n",
" '.',\n",
" 'R',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'Y',\n",
" 'A',\n",
" 'M',\n",
" '.',\n",
" 'C',\n",
" 'U',\n",
" 'P',\n",
" '.',\n",
" 'O',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '∴',\n",
" '.',\n",
" 'Z',\n",
" 'I',\n",
" 'G',\n",
" '.',\n",
" 'E',\n",
" '.',\n",
" 'O',\n",
" 'M',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" '.',\n",
" 'E',\n",
" 'L',\n",
" '.',\n",
" ':',\n",
" 'L',\n",
" '.',\n",
" 'N',\n",
" 'O',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '=',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'B',\n",
" 'O',\n",
" 'O',\n",
" 'D',\n",
" 'L',\n",
" 'E',\n",
" 'S',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '∴',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'V',\n",
" '.',\n",
" 'O',\n",
" '.',\n",
" 'U',\n",
" ':',\n",
" 'S',\n",
" 'N',\n",
" 'E',\n",
" 'D',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" 'T',\n",
" 'A',\n",
" 'D',\n",
" '.',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" 'T',\n",
" 'A',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" 'N',\n",
" 'E',\n",
" 'A',\n",
" 'T',\n",
" 'N',\n",
" 'E',\n",
" 's',\n",
" 'S',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'W',\n",
" '█',\n",
" '█',\n",
" 'U',\n",
" 'V',\n",
" 'E',\n",
" 'A',\n",
" '.',\n",
" 'I',\n",
" '.',\n",
" 'L',\n",
" 'O',\n",
" 'T',\n",
" 'A',\n",
" 'H',\n",
" '.',\n",
" '.',\n",
" 'K',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" ':',\n",
" '.',\n",
" 'R',\n",
" ':',\n",
" 'A',\n",
" '.',\n",
" '.',\n",
" 'P',\n",
" 'I',\n",
" 'X',\n",
" 'I',\n",
" 'E',\n",
" ':',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" ':',\n",
" 'T',\n",
" '.',\n",
" 'T',\n",
" 'I',\n",
" '.',\n",
" '.',\n",
" 't',\n",
" '.',\n",
" '.',\n",
" 'F',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '.',\n",
" '.',\n",
" 'U',\n",
" 'H',\n",
" '.',\n",
" 'E',\n",
" 'F',\n",
" '.',\n",
" 'Y',\n",
" 'I',\n",
" 'R',\n",
" 'R',\n",
" '.',\n",
" '.',\n",
" '.',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█',\n",
" '█']"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"[402, 407]"
]
},
"execution_count": 59,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"play_game()"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"That was an exciting high-scoring game, but it was just one game. Let's get statistics for both players over, say, 10 games:"
]
},
{
"cell_type": "code",
"execution_count": 60,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"min: 307, median: 373.5, mean: 382.8, max: 459\n",
"CPU times: user 33.2 s, sys: 324 ms, total: 33.5 s\n",
"Wall time: 36.2 s\n"
]
}
],
"source": [
"%%time\n",
"\n",
"games = 10\n",
"\n",
"scores = [score for game in range(games) \n",
" for score in play_game(verbose=False)]\n",
"\n",
"print('min: {}, median: {}, mean: {}, max: {}'.format(\n",
" min(scores), median(scores), mean(scores), max(scores)))"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"# Tests\n",
"\n",
"I *should* have a complete test suite. Instead, all I have this minimal suite, plus the confidence I gained from seeing the game play."
]
},
{
"cell_type": "code",
"execution_count": 61,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"'ok'"
]
},
"execution_count": 61,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"def sames(A, B): return sorted(A) == sorted(B)\n",
"\n",
"def test():\n",
" \"Unit tests.\"\n",
" assert is_word('WORD')\n",
" assert is_word('LETTERs')\n",
" assert is_word('ETHyLENEDIAMINETETRAACETATES')\n",
" assert not is_word('ALFABET')\n",
" \n",
" rack = 'ABCHKNQ'\n",
" \n",
" assert sames(letters(rack), rack)\n",
" assert sames(letters('ABAC_'), 'ABCabcdefghijklmnopqrstuvwxyz')\n",
" \n",
" assert dict_prefixes({'HELLO', 'HELP', 'HELPER'}) == {\n",
" '', 'H', 'HE', 'HEL', 'HELL', 'HELP', 'HELPE'}\n",
" \n",
" assert set(rack_prefixes('ABC')) == {'', 'C', 'B', 'A', 'AB', 'CA', 'AC', 'BA', 'BAC', 'CAB'}\n",
" assert len(rack_prefixes('LETTERS')) == 155\n",
" assert len(rack_prefixes('LETTER_')) == 1590\n",
" \n",
" assert remove('SET', 'EELRTTS') == 'ELRT'\n",
" remove('TREaT', 'EELRTT_') == 'EL'\n",
" \n",
" assert len(WWF) == len(SCRABBLE) == 17 * 17\n",
" assert all(sq in EMPTY or sq == OFF for sq in WWF + SCRABBLE)\n",
" \n",
" DOWN = WWF.down\n",
" plays = {\n",
" Play(145, DOWN, 'ENTER', ''),\n",
" Play(144, ACROSS, 'BE', ''),\n",
" Play(138, DOWN, 'GAVE', ''),\n",
" Play(158, DOWN, 'MUSES', ''),\n",
" Play(172, ACROSS, 'VIRULeNT', ''),\n",
" Play(213, ACROSS, 'RED', ''),\n",
" Play(147, DOWN, 'CHILDREN', ''),\n",
" Play(164, ACROSS, 'HEARD', ''),\n",
" Play(117, DOWN, 'BRIDLES', ''),\n",
" Play(131, ACROSS, 'TOUR', '')}\n",
"\n",
" board = Board(WWF)\n",
" for play in plays:\n",
" board = make_play(board, play)\n",
" \n",
" assert len(WWF) == len(board) == 17 * 17\n",
" assert all_anchors(WWF) == [144]\n",
" assert all_anchors(board) == [\n",
" 100, 114, 115, 116, 121, 127, 128, 130, 137, 139, 141, 143, \n",
" 146, 148, 149, 150, 154, 156, 157, 159, 160, 161, 163, 171, \n",
" 180, 182, 183, 184, 188, 190, 191, 193, 194, 195, 197, 199, \n",
" 201, 206, 208, 210, 212, 216, 218, 225, 227, 230, 231, 233, \n",
" 236, 243, 248, 250, 265, 267]\n",
" \n",
" assert crossword(board, 141, ACROSS) == '.MUSES'\n",
" assert crossword(board, 148, ACROSS) == 'T.E'\n",
" assert valid_crossword('.MUSES', 'A')\n",
" assert not valid_crossword('.MUSES', 'B')\n",
" \n",
" assert sames(prefix_plays(rack_prefixes(rack), board, 141, 1, rack),\n",
" [Play(start=141, dir=1, letters='', rack='ABCHKNQ'),\n",
" Play(start=140, dir=1, letters='C', rack='ABHKNQ'),\n",
" Play(start=140, dir=1, letters='K', rack='ABCHNQ'),\n",
" Play(start=140, dir=1, letters='B', rack='ACHKNQ'),\n",
" Play(start=140, dir=1, letters='A', rack='BCHKNQ'),\n",
" Play(start=140, dir=1, letters='H', rack='ABCKNQ'),\n",
" Play(start=140, dir=1, letters='N', rack='ABCHKQ'),\n",
" Play(start=140, dir=1, letters='Q', rack='ABCHKN')])\n",
" \n",
" assert sames(extend_play(board, Play(start=140, dir=1, letters='B', rack='ACHKNQ')),\n",
" {Play(start=140, dir=1, letters='BA', rack='CHKNQ'),\n",
" Play(start=140, dir=1, letters='BACKBENCH', rack='Q'),\n",
" Play(start=140, dir=1, letters='BAH', rack='CKNQ'),\n",
" Play(start=140, dir=1, letters='BAN', rack='CHKQ')})\n",
"\n",
" assert len(BAG) == 100\n",
" \n",
" assert replenish('RACK', ['X', 'B', 'A', 'G']) == 'RACKGAB'\n",
" assert replenish('RACK', []) == 'RACK'\n",
" assert replenish('RACK', ['A', 'B']) == 'RACKBA'\n",
" \n",
" assert score(WWF, Play(144, ACROSS, 'BE', '')) == (3 + 1)\n",
" assert score(board, Play(140, ACROSS, 'BACKBENCH', 'Q')) == 116\n",
" \n",
" return 'ok'\n",
"\n",
"test()"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"# Conclusion: How Did We Do?\n",
"\n",
"We can break that into four questions:\n",
" \n",
"1. **Is the code easy to follow?** \n",
" - I'm biased, but I think this code is easy to understand, test, and modify.\n",
"2. **Does the strategy score well?** \n",
" - Yes: the mean and median scores are both over 350, which is enough for [the elite club](https://www.facebook.com/WWF350Club) of high scorers. \n",
" - No: this is not quite world-champion caliber.\n",
"3. **Is the code fast enough?** \n",
" - It takes less than 3 seconds to play a complete game for both players; that's fast enough for me. If desired, the code could be made about 100 times faster, by using multiprocessing, by caching more information, by not building explicit lists for intermediate results (although those intermediate results make the code easier to test), by using PyPy or Cython, or by porting to another language.\n",
"4. **What's left to do?**\n",
" - We could give players the option of trading in tiles.\n",
" - We could explore better strategies. A better strategy might:\n",
" - Plan ahead to use high-scoring letters only with bonuses.\n",
" - Use blank tiles strategically, not greedily.\n",
" - Manage letters to increase the chance of a bingo.\n",
" - Play defensively to avoid giving the opponent good chances at high scores.\n",
" - Think ahead in the end game to go out before the opponent (or at least avoid being stuck with high-scoring letters in the rack).\n",
" - In the end game, know which tiles have not been played and thus which ones the opponent could have.\n",
" - The game could be interfaced to an online game server.\n",
" - More complete unit tests would be great.\n",
" - We could compare this program to those of the [giants](https://www.cs.cmu.edu/afs/cs/academic/class/15451-s06/www/lectures/scrabble.pdf) whose [shoulders](http://ericsink.com/downloads/faster-scrabble-gordon.pdf) we [stood](http://web.archive.org/web/20040116175427/http://www.math-info.univ-paris5.fr/~bouzy/ProjetUE3/Scrabble.pdf) [upon](http://www.gtoal.com/wordgames/scrabble.html).\n",
" \n",
"Thanks to Markus Dobler for correcting one bug and making another useful suggestion.\n",
"\n",
" \n",
"*[Peter Norvig](http://norvig.com)*"
]
}
],
"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.6.0"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
|