Skip to content

Instantly share code, notes, and snippets.

@ELC
Last active November 25, 2019 18:34
Show Gist options
  • Save ELC/c70f818eb3afab743f2d84e1d5b8e49e to your computer and use it in GitHub Desktop.
Save ELC/c70f818eb3afab743f2d84e1d5b8e49e to your computer and use it in GitHub Desktop.
Pascal Triangle Visualization
channels:
- defaults
- conda-forge
dependencies:
- ipython
- ipywidgets
- matplotlib
- numpy
- scipy
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"from matplotlib import animation\n",
"from IPython.display import HTML\n",
"\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"def memoize(f):\n",
" memo = {}\n",
" def helper(x):\n",
" if x not in memo:\n",
" memo[x] = f(x)\n",
" return memo[x]\n",
" return helper"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"@memoize\n",
"def pascal_triangle(n):\n",
" if n == 0:\n",
" return [np.array([1])]\n",
" prev = pascal_triangle(n - 1)[-1]\n",
" middle = np.add(prev[:-1], prev[1:])\n",
" return pascal_triangle(n - 1) + [np.array([1, *middle, 1], dtype=np.ulonglong)]\n",
"\n",
"@memoize\n",
"def pascal_last_row(n):\n",
" return pascal_triangle(n)[-1]"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"def animate(i, length, ax, width):\n",
" if i == 0:\n",
" im = ax.imshow([[0],[0]], cmap='Greys', aspect='equal', extent=(0, width - 2, 0, length), animated=True)\n",
" return im,\n",
"\n",
" elements = pascal_last_row(i)\n",
" \n",
" extra_space = [0] * ((width - len(elements) - 1) // 2)\n",
" \n",
" elements = extra_space + list(elements) + extra_space\n",
"\n",
" real_width = len(elements)\n",
"\n",
" if real_width % 2 == 1:\n",
" real_width -= 1\n",
" \n",
" binary_elements = []\n",
"\n",
" for j in elements:\n",
" row = []\n",
" for k in bin(j)[2:].zfill(length):\n",
" row.append(int(k))\n",
" \n",
" binary_elements.append(row)\n",
" \n",
" im = ax.imshow(np.transpose(binary_elements), cmap='Greys', aspect='equal', extent=(0, real_width, 0, length), animated=True)\n",
" \n",
" return im,"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"text/html": [
"<video width=\"576\" height=\"466\" controls autoplay loop>\n",
" <source type=\"video/mp4\" src=\"data:video/mp4;base64,AAAAHGZ0eXBNNFYgAAACAGlzb21pc28yYXZjMQAAAAhmcmVlAAA9EG1kYXQAAAKuBgX//6rcRem9\n",
"5tlIt5Ys2CDZI+7veDI2NCAtIGNvcmUgMTUyIHIyODU0IGU5YTU5MDMgLSBILjI2NC9NUEVHLTQg\n",
"QVZDIGNvZGVjIC0gQ29weWxlZnQgMjAwMy0yMDE3IC0gaHR0cDovL3d3dy52aWRlb2xhbi5vcmcv\n",
"eDI2NC5odG1sIC0gb3B0aW9uczogY2FiYWM9MSByZWY9MyBkZWJsb2NrPTE6MDowIGFuYWx5c2U9\n",
"MHgzOjB4MTEzIG1lPWhleCBzdWJtZT03IHBzeT0xIHBzeV9yZD0xLjAwOjAuMDAgbWl4ZWRfcmVm\n",
"PTEgbWVfcmFuZ2U9MTYgY2hyb21hX21lPTEgdHJlbGxpcz0xIDh4OGRjdD0xIGNxbT0wIGRlYWR6\n",
"b25lPTIxLDExIGZhc3RfcHNraXA9MSBjaHJvbWFfcXBfb2Zmc2V0PS0yIHRocmVhZHM9MTIgbG9v\n",
"a2FoZWFkX3RocmVhZHM9MiBzbGljZWRfdGhyZWFkcz0wIG5yPTAgZGVjaW1hdGU9MSBpbnRlcmxh\n",
"Y2VkPTAgYmx1cmF5X2NvbXBhdD0wIGNvbnN0cmFpbmVkX2ludHJhPTAgYmZyYW1lcz0zIGJfcHly\n",
"YW1pZD0yIGJfYWRhcHQ9MSBiX2JpYXM9MCBkaXJlY3Q9MSB3ZWlnaHRiPTEgb3Blbl9nb3A9MCB3\n",
"ZWlnaHRwPTIga2V5aW50PTI1MCBrZXlpbnRfbWluPTEgc2NlbmVjdXQ9NDAgaW50cmFfcmVmcmVz\n",
"aD0wIHJjX2xvb2thaGVhZD00MCByYz1jcmYgbWJ0cmVlPTEgY3JmPTIzLjAgcWNvbXA9MC42MCBx\n",
"cG1pbj0wIHFwbWF4PTY5IHFwc3RlcD00IGlwX3JhdGlvPTEuNDAgYXE9MToxLjAwAIAAAADLZYiE\n",
"ABf//vfUt8yy7VMn77af/r//UAcVTV3w+9arU1kRkRdhGrxFDa/90q/y6+4qo4pHJS3qQShrG4mw\n",
"AAADAAADAAH6ZO3IeG5kc8aK4Pwt9EMxA8tfw9YoqYVYDeC2BMer2Lt9PPHlfQAAAwHuACTBiBOx\n",
"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\n",
"\">\n",
" Your browser does not support the video tag.\n",
"</video>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"frames = 20\n",
"last_row = pascal_last_row(frames)\n",
"length = len(bin(max(last_row))[2:]) - 1\n",
"width = len(last_row)\n",
"\n",
"aspect_ratio = width / length\n",
"\n",
"frame_width = 8\n",
"\n",
"fig, ax = plt.subplots(figsize=(frame_width, frame_width / aspect_ratio))\n",
"\n",
"fig.subplots_adjust(left=0, bottom=0.01, right=1, top=1)\n",
"\n",
"ax.set_xticks([]) \n",
"ax.set_yticks([]) \n",
"\n",
"if frames % 2 == 0:\n",
" width += 1\n",
"\n",
"anim = animation.FuncAnimation(fig, animate, frames=frames, interval=1000, blit=True, fargs=(length, ax, width))\n",
"\n",
"plt.close() # Avoid extra picture\n",
"\n",
"HTML(anim.to_html5_video())"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"Writer = animation.writers['ffmpeg']\n",
"writer = Writer(fps=1, metadata=dict(artist='Me'), bitrate=1800)\n",
"\n",
"anim.save('im.mp4', writer=writer)"
]
}
],
"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.7"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment