{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from ipywidgets import interact"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "def nowa_plansza(H, W, pola=None):\n",
    "    \"\"\"Funkcja tworzy nową planszę na podstawie współrzędnych \n",
    "    z listy 'pola'. Elementy zwracanej macierzy (numpy.array()) \n",
    "    mają wartość '1' na miejscach z listy 'pola' oraz '0' dla \n",
    "    posotałych współrzędnych.\n",
    "    \n",
    "    Argumenty:\n",
    "        H {int} -- wysokość planszy\n",
    "        W {int} -- szerokość planszy\n",
    "        pola {list with tuples} -- współrzędne niezerowych\n",
    "        elementów dla początkowej macierzy.\n",
    "\n",
    "    Jeżeli pola=None wtedy funkcja zwraca macierz wypełnioną zerami. \n",
    "    \"\"\"    \n",
    "    plansza = np.zeros((H, W))\n",
    "    if pola:\n",
    "        for i, j in pola:\n",
    "            plansza[i, j] = 1\n",
    "    return plansza\n",
    "\n",
    "def sąsiedzi(plansza, i, j):\n",
    "    \"\"\"Funkcja oblicza liczbę niezerowych sąsiadów\n",
    "    dla elementu o współrzędnych '(i,j)' w macierzy \n",
    "    'plansza'.\n",
    "    \n",
    "    Argumenty:\n",
    "        plansza {numpy.array} -- plansza (macierz)\n",
    "        i {int} -- numer wiersza rozpatrywanego elementu\n",
    "        j {int} -- numer kolumny rozpatrywanego elementu\n",
    "    \"\"\"   \n",
    "    kwadrat = np.sum(plansza[max(i-1,0):i+2, max(j-1,0):j+2] > 0)\n",
    "    return kwadrat - 1 if plansza[i, j] > 0 else kwadrat\n",
    "    \n",
    "def krok(plansza):\n",
    "    \"\"\"Funkcja odpowiednio zmienia macierz 'plansza', \n",
    "    zgodnie z zasadami zadania i zwraca zmienioną macierz.\n",
    "    \n",
    "    Argumenty:\n",
    "        plansza {numpy.array} -- plansza (macierz),\n",
    "        którą chcemy przekształcić w 'nową' planszę\n",
    "    \"\"\"\n",
    "    (H, W) = plansza.shape\n",
    "    nowa = np.zeros((H, W))\n",
    "    \n",
    "    for i in range(H):\n",
    "        for j in range(W):\n",
    "            liczba_sasiadow = sąsiedzi(plansza, i, j)\n",
    "            if plansza[i, j] == 0:\n",
    "                if liczba_sasiadow == 3:\n",
    "                    nowa[i, j] = 1\n",
    "            elif liczba_sasiadow in {2, 3}:\n",
    "                nowa[i, j] = plansza[i, j]/2\n",
    "    return nowa\n",
    "\n",
    "def symulacja(plansza, n=100):\n",
    "    wyniki = [plansza]\n",
    "    for k in range(n):\n",
    "        wyniki.append(krok(wyniki[-1]))\n",
    "    return wyniki"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "673b7faade494be9b849e88cba347400",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "interactive(children=(IntSlider(value=0, description='n'), Output()), _dom_classes=('widget-interact',))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "szybowiec = nowa_plansza(50, 50, [(25, 30), (25, 31), (25, 32), (26, 30), (27, 31)])\n",
    "lista = symulacja(szybowiec, 100)\n",
    " \n",
    "@interact(n=(0, 100))\n",
    "def animuj(n=0):\n",
    "    plt.matshow(lista[n])\n",
    "    plt.axis(\"off\")"
   ]
  },
  {
   "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.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
