+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "['.#.#.#', '...##.', '#....#', '..#...', '#.#..#', '####..']"
+ ]
+ },
+ "execution_count": 1,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "pi18 = \"\"\".#.#.#\n",
+ "...##.\n",
+ "#....#\n",
+ "..#...\n",
+ "#.#..#\n",
+ "####..\n",
+ "\"\"\".splitlines()\n",
+ "pi18"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(6, 6)"
+ ]
+ },
+ "execution_count": 2,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "rows = len(pi18)\n",
+ "columns = len(pi18[0])\n",
+ "rows, columns"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "def read_grid(lines):\n",
+ " grid = {}\n",
+ " for i, r in enumerate(lines):\n",
+ " for j, c in enumerate(r):\n",
+ " if c == '#':\n",
+ " grid[i, j] = True\n",
+ " return grid "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{(0, 1): True,\n",
+ " (0, 3): True,\n",
+ " (0, 5): True,\n",
+ " (1, 3): True,\n",
+ " (1, 4): True,\n",
+ " (2, 0): True,\n",
+ " (2, 5): True,\n",
+ " (3, 2): True,\n",
+ " (4, 0): True,\n",
+ " (4, 2): True,\n",
+ " (4, 5): True,\n",
+ " (5, 0): True,\n",
+ " (5, 1): True,\n",
+ " (5, 2): True,\n",
+ " (5, 3): True}"
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "g = read_grid(pi18)\n",
+ "g"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "def print_grid(grid, rows, columns):\n",
+ " for r in range(rows):\n",
+ " for c in range(columns):\n",
+ " if (r, c) in grid:\n",
+ " print('#', end='')\n",
+ " else:\n",
+ " print('.', end='')\n",
+ " print('')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ ".#.#.#\n",
+ "...##.\n",
+ "#....#\n",
+ "..#...\n",
+ "#.#..#\n",
+ "####..\n"
+ ]
+ }
+ ],
+ "source": [
+ "print_grid(g, rows, columns)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [],
+ "source": [
+ "def do_generation(grid, rows, columns):\n",
+ " new_grid = {}\n",
+ " for r in range(rows):\n",
+ " for c in range(columns):\n",
+ " live_neighbours = sum(1\n",
+ " for dr in [-1, 0, 1]\n",
+ " for dc in [-1, 0, 1]\n",
+ " if not (dr == 0 and dc == 0)\n",
+ " if (r+dr, c+dc) in grid)\n",
+ " if (r, c) in grid:\n",
+ " if live_neighbours in [2, 3]:\n",
+ " new_grid[r, c] = True\n",
+ " else:\n",
+ " if live_neighbours == 3:\n",
+ " new_grid[r, c] = True\n",
+ " return new_grid"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "..##..\n",
+ "..##.#\n",
+ "...##.\n",
+ "......\n",
+ "#.....\n",
+ "#.##..\n"
+ ]
+ }
+ ],
+ "source": [
+ "print_grid(do_generation(g, 6, 6), 6, 6)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ ".#.#.#\n",
+ "...##.\n",
+ "#....#\n",
+ "..#...\n",
+ "#.#..#\n",
+ "####..\n"
+ ]
+ }
+ ],
+ "source": [
+ "print_grid(g, 6, 6)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "def many_generations(grid, rows, columns, generations):\n",
+ " for _ in range(generations):\n",
+ " grid = do_generation(grid, rows, columns)\n",
+ " return grid"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "......\n",
+ "......\n",
+ "..##..\n",
+ "..##..\n",
+ "......\n",
+ "......\n"
+ ]
+ }
+ ],
+ "source": [
+ "print_grid(many_generations(g, 6, 6, 4), 6, 6)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(100, 100)"
+ ]
+ },
+ "execution_count": 12,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "pi18 = [l.strip() for l in open('advent18.txt').readlines()]\n",
+ "rows = len(pi18)\n",
+ "columns = len(pi18[0])\n",
+ "rows, columns"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "5076"
+ ]
+ },
+ "execution_count": 13,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "g = read_grid(pi18)\n",
+ "len(g)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "1061"
+ ]
+ },
+ "execution_count": 14,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "g = many_generations(g, rows, columns, 100)\n",
+ "len(g)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "def set_corners_on(grid, rows, columns):\n",
+ " grid[0, 0] = True\n",
+ " grid[0, columns-1] = True\n",
+ " grid[rows-1, 0] = True\n",
+ " grid[rows-1, columns-1] = True\n",
+ " return grid"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "def do_generation_2(grid, rows, columns):\n",
+ " grid = do_generation(grid, rows, columns)\n",
+ " grid = set_corners_on(grid, rows, columns)\n",
+ " return grid"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "def many_generations_2(grid, rows, columns, generations):\n",
+ " for _ in range(generations):\n",
+ " grid = do_generation_2(grid, rows, columns)\n",
+ " return grid"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "##.#.#\n",
+ "...##.\n",
+ "#....#\n",
+ "..#...\n",
+ "#.#..#\n",
+ "####.#\n"
+ ]
+ }
+ ],
+ "source": [
+ "pi18 = \"\"\".#.#.#\n",
+ "...##.\n",
+ "#....#\n",
+ "..#...\n",
+ "#.#..#\n",
+ "####..\n",
+ "\"\"\".splitlines()\n",
+ "rows = len(pi18)\n",
+ "columns = len(pi18[0])\n",
+ "g = read_grid(pi18)\n",
+ "g = set_corners_on(g, rows, columns)\n",
+ "print_grid(g, rows, columns)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "#.##.#\n",
+ "####.#\n",
+ "...##.\n",
+ "......\n",
+ "#...#.\n",
+ "#.####\n"
+ ]
+ }
+ ],
+ "source": [
+ "g = do_generation_2(g, 6, 6)\n",
+ "print_grid(g, 6, 6)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "#..#.#\n",
+ "#....#\n",
+ ".#.##.\n",
+ "...##.\n",
+ ".#..##\n",
+ "##.###\n"
+ ]
+ }
+ ],
+ "source": [
+ "g = do_generation_2(g, 6, 6)\n",
+ "print_grid(g, 6, 6)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 21,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "##.#.#\n",
+ "...##.\n",
+ "#....#\n",
+ "..#...\n",
+ "#.#..#\n",
+ "####.#\n"
+ ]
+ }
+ ],
+ "source": [
+ "pi18 = \"\"\".#.#.#\n",
+ "...##.\n",
+ "#....#\n",
+ "..#...\n",
+ "#.#..#\n",
+ "####..\n",
+ "\"\"\".splitlines()\n",
+ "rows = len(pi18)\n",
+ "columns = len(pi18[0])\n",
+ "g = read_grid(pi18)\n",
+ "g = set_corners_on(g, rows, columns)\n",
+ "print_grid(g, rows, columns)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "##.###\n",
+ ".##..#\n",
+ ".##...\n",
+ ".##...\n",
+ "#.#...\n",
+ "##...#\n"
+ ]
+ }
+ ],
+ "source": [
+ "print_grid(many_generations_2(g, 6, 6, 5), 6, 6)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 23,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(100, 100)"
+ ]
+ },
+ "execution_count": 23,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "pi18 = [l.strip() for l in open('advent18.txt').readlines()]\n",
+ "rows = len(pi18)\n",
+ "columns = len(pi18[0])\n",
+ "rows, columns"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 24,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "5078"
+ ]
+ },
+ "execution_count": 24,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "g = read_grid(pi18)\n",
+ "g = set_corners_on(g, rows, columns)\n",
+ "len(g)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "1006"
+ ]
+ },
+ "execution_count": 25,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "g = many_generations_2(g, rows, columns, 100)\n",
+ "len(g)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "collapsed": true
+ },
+ "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.4.3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 0
+}