Skip to content

Instantly share code, notes, and snippets.

@trent2
Last active March 13, 2020 18:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save trent2/f4f76547076e821afefb78744508a74c to your computer and use it in GitHub Desktop.
Save trent2/f4f76547076e821afefb78744508a74c to your computer and use it in GitHub Desktop.
Solution to "The Riddler" playing Guess Who
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"#/usr/bin/python\n",
"from math import ceil\n",
"from sys import argv\n",
"from decimal import Decimal, getcontext\n",
"# \"me\" plays first\n",
"# \"opp\" plays second\n",
"\n",
"def computeBestMoves(n):\n",
" d = Decimal('1.'+'0'*195)\n",
" one = Decimal(1)\n",
" B = {}\n",
" M = {}\n",
" for k in range(1,n+1):\n",
" M[1,k] = one # my turn, only one to chose\n",
" M[k,1] = one/k # my turn, opponent will win next\n",
" B[1,k] = 0 # best is to guess\n",
" B[k,1] = 0 # best is to guess\n",
"\n",
" for k in range(2,n+1):\n",
" for l in range(k,n+1):\n",
" t = [one/k] + [Decimal(i)/k*(one-M[l,i])+Decimal(k-i)/k*(one-M[l,k-i]) for i in range(1,ceil(k/2)+1)]\n",
" tt = [ t[i].quantize(d) for i in range(len(t))]\n",
" B[k,l] = tt.index(max(tt))\n",
" M[k,l] = t[B[k,l]]\n",
" B[k,l] /= k\n",
" if(l != k):\n",
" t = [one/l] + [Decimal(i)/l*(one-M[k,i])+Decimal(l-i)/l*(one-M[k,l-i]) for i in range(1,ceil(l/2)+1)]\n",
" tt = [ t[i].quantize(d) for i in range(len(t))]\n",
" B[l,k] = tt.index(max(tt))\n",
" M[l,k] = t[B[l,k]]\n",
" B[l,k] /= l\n",
" return B"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.colorbar.Colorbar at 0x7efd97317110>"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"import matplotlib\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"\n",
"getcontext().prec = 200\n",
"# number of games\n",
"n = 256\n",
"B = computeBestMoves(n)\n",
"Barray = [[B[n-k,l+1] for l in range(n)] for k in range(n)]\n",
"fig, axs = plt.subplots()\n",
"axs.set(ylabel=\"# of my cards\", xlabel=\"# of opponent cards\")\n",
"axs.set_title('ratio of minimal number of cards to ask for in an optimal strategy')\n",
"im = axs.imshow(Barray)\n",
"axs.figure.colorbar(im)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.6"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
numpy==1.16.*
matplotlib==3.*
seaborn==0.8.1
python-3.6
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment