Skip to content

Instantly share code, notes, and snippets.

@mattdutson
Last active June 21, 2019 20:47
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 mattdutson/e533bad6932f6c12e02d54f07ea07b45 to your computer and use it in GitHub Desktop.
Save mattdutson/e533bad6932f6c12e02d54f07ea07b45 to your computer and use it in GitHub Desktop.
How Many Soldiers Do You Need To Beat The Night King?
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# How Many Soldiers Do You Need To Beat The Night King? "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This is my solution to [this](https://fivethirtyeight.com/features/how-many-soldiers-do-you-need-to-beat-the-night-king/) FiveThirtyEight Riddler problem.\n",
"\n",
"## Prompt\n",
"\n",
"From Greg Burnham, it had to happen eventually, at long last and not a moment too soon, The Riddler meets \"Game of Thrones\":\n",
"\n",
"At a pivotal moment in an epic battle between the living and the dead, the Night King, head of the army of the dead, raises all the fallen (formerly) living soldiers to join his ranks. This ability obviously presents a huge military advantage, but how big an advantage exactly?\n",
"\n",
"Forget the Battle of Winterfell and model our battle as follows. Each army lines up single file, facing the other army. One soldier steps forward from each line and the pair duels — half the time the living soldier wins, half the time the dead soldier wins. If the living soldier wins, he goes to the back of his army’s line, and the dead soldier is out (the living army uses dragonglass weapons, so the dead soldier is dead forever this time). If the dead soldier wins, he goes to the back of their army’s line, but this time the (formerly) living soldier joins him there. (Reanimation is instantaneous for this Night King.) The battle continues until one army is entirely eliminated.\n",
"\n",
"What starting sizes of the armies, living and dead, give each army a 50-50 chance of winning?"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Solution\n",
"\n",
"Although I'm sure there's an analytic solution, I chose to solve this problem with dynamic programming. The following functions compute the probability of the living army winning given `live` `dead` living and dead soldiers."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"def p_recursive(live, dead, mem):\n",
" if not np.isnan(mem[live, dead]):\n",
" return mem[live, dead]\n",
" elif live == 0:\n",
" mem[live, dead] = 0\n",
" elif dead == 0:\n",
" mem[live, dead] = 1\n",
" else:\n",
" live_win = p_recursive(live, dead - 1, mem)\n",
" dead_win = p_recursive(live - 1, dead + 1, mem)\n",
" mem[live, dead] = 0.5 * (live_win + dead_win)\n",
" return mem[live, dead]\n",
" \n",
"def p_live_win(live, dead):\n",
" mem = np.full((live + 1, dead + live + 1), np.nan, dtype=np.float64)\n",
" return p_recursive(live, dead, mem), mem"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now let's visualize this 2D function of army sizes."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"max_size = 50\n",
"p, mem = p_live_win(max_size, max_size)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"scrolled": true
},
"outputs": [
{
"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": [
"plt.imshow(mem.T)\n",
"plt.title('Probability Living Army Wins')\n",
"plt.xlabel('Living Army Size')\n",
"plt.ylabel('Dead Army Size')\n",
"plt.xlim(0.5, max_size + 0.5)\n",
"plt.ylim(0.5, max_size + 0.5)\n",
"plt.colorbar()\n",
"plt.savefig('colormap.pdf')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Looks like the dead have a clear advantage!\n",
"\n",
"The prompt technically asked us to identify cases where the living army has a 50% chance of winning. For each living army size, let's find the dead army size which gives the probability nearest 0.5."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"max_size = 400\n",
"p, mem = p_live_win(max_size, max_size)\n",
"x = np.arange(1, max_size + 1)\n",
"y = np.nanargmin(np.abs(mem - 0.5), axis=1)[1:]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's see if we can identify a power function."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"array([0.49221899, 0.01078205])"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.polyfit(np.log(x), np.log(y), 1)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([0.95532763, 0.19390659])"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.polyfit(np.sqrt(x), y, 1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"So the living army needs to be roughly the size of the dead army *squared*.\n",
"\n",
"Let's plot both our square root approximation and the actual closest matchups."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.plot(x, y, label='Optimal Matchup')\n",
"plt.plot(x, np.sqrt(x), label='Square Root')\n",
"plt.title('Most Equal Matchups')\n",
"plt.xlabel('Living Army Size')\n",
"plt.ylabel('Dead Army Size')\n",
"plt.legend()\n",
"plt.savefig('equal_match.pdf')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Not a perfect fit (there might be a linear term we're missing)."
]
}
],
"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.1"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment