Done puzzle 2
[ou-summer-of-code-2017.git] / 02-lifts / lifts-generator.ipynb
diff --git a/02-lifts/lifts-generator.ipynb b/02-lifts/lifts-generator.ipynb
new file mode 100644 (file)
index 0000000..2bc8fc3
--- /dev/null
@@ -0,0 +1,385 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "import random"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "['^', '^', '^', 'v', 'v', 'v', '=']"
+      ]
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "instructions = list('^^^vvv=')\n",
+    "instructions"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 59,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def build_sequence(instructions, length=100):\n",
+    "    non_exits = [i for i in instructions if i != '=']\n",
+    "    seq = [random.choice(non_exits)]\n",
+    "    last_was_exit = False\n",
+    "    for _ in range(length-2):\n",
+    "        if last_was_exit:\n",
+    "            seq.append(random.choice(non_exits))\n",
+    "            last_was_exit = False\n",
+    "        else:\n",
+    "            i = random.choice(instructions)\n",
+    "            last_was_exit = (i == '=')\n",
+    "            seq.append(i)\n",
+    "    seq.append(instructions[-1])\n",
+    "    return ''.join(seq)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 62,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'v=^^^vv^=='"
+      ]
+     },
+     "execution_count": 62,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "build_sequence(instructions, 10)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 66,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'vvv^v^^^^v^v=^vvv=v^vvv^=v^^v=v^^^^vv^=v^vvv^v^^vv^^vvvvv^^vv^v=^v=v^^^vvv^v^vv=v^vv^^=^vv^^vvvv=^^='"
+      ]
+     },
+     "execution_count": 66,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "seq = build_sequence(instructions)\n",
+    "seq"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 15,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def value(instr):\n",
+    "    if instr == '^':\n",
+    "        return 1\n",
+    "    elif instr == 'v':\n",
+    "        return -1\n",
+    "    else:\n",
+    "        return 0    "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 16,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def final(sequence):\n",
+    "    return sum(value(i) for i in sequence)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 22,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "-1"
+      ]
+     },
+     "execution_count": 22,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "final(seq)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 23,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def running(sequence):\n",
+    "    current = 0\n",
+    "    currents = []\n",
+    "    exits = []\n",
+    "    for i in sequence:\n",
+    "        if value(i) == 0:\n",
+    "            exits.append(current)\n",
+    "        else:\n",
+    "            current += value(i)\n",
+    "            currents.append(current)\n",
+    "    return currents, exits"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 24,
+   "metadata": {
+    "scrolled": true
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "([1,\n",
+       "  2,\n",
+       "  3,\n",
+       "  2,\n",
+       "  3,\n",
+       "  4,\n",
+       "  5,\n",
+       "  4,\n",
+       "  5,\n",
+       "  4,\n",
+       "  5,\n",
+       "  4,\n",
+       "  3,\n",
+       "  4,\n",
+       "  3,\n",
+       "  2,\n",
+       "  3,\n",
+       "  4,\n",
+       "  3,\n",
+       "  2,\n",
+       "  3,\n",
+       "  4,\n",
+       "  5,\n",
+       "  6,\n",
+       "  5,\n",
+       "  4,\n",
+       "  3,\n",
+       "  4,\n",
+       "  3,\n",
+       "  2,\n",
+       "  1,\n",
+       "  2,\n",
+       "  3,\n",
+       "  4,\n",
+       "  3,\n",
+       "  4,\n",
+       "  3,\n",
+       "  2,\n",
+       "  1,\n",
+       "  2,\n",
+       "  1,\n",
+       "  2,\n",
+       "  3,\n",
+       "  2,\n",
+       "  3,\n",
+       "  4,\n",
+       "  3,\n",
+       "  2,\n",
+       "  1,\n",
+       "  0,\n",
+       "  -1,\n",
+       "  -2,\n",
+       "  -3,\n",
+       "  -4,\n",
+       "  -3,\n",
+       "  -2,\n",
+       "  -1,\n",
+       "  -2,\n",
+       "  -3,\n",
+       "  -4,\n",
+       "  -3,\n",
+       "  -2,\n",
+       "  -1,\n",
+       "  -2,\n",
+       "  -3,\n",
+       "  -2,\n",
+       "  -3,\n",
+       "  -4,\n",
+       "  -5,\n",
+       "  -4,\n",
+       "  -3,\n",
+       "  -4,\n",
+       "  -5,\n",
+       "  -4,\n",
+       "  -5,\n",
+       "  -4,\n",
+       "  -3,\n",
+       "  -2,\n",
+       "  -1,\n",
+       "  0,\n",
+       "  -1,\n",
+       "  0,\n",
+       "  -1,\n",
+       "  -2,\n",
+       "  -3,\n",
+       "  -2,\n",
+       "  -1,\n",
+       "  0,\n",
+       "  -1],\n",
+       " [5, 4, 2, 1, -2, -2, -3, -5, -5, -1, -1])"
+      ]
+     },
+     "execution_count": 24,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "running(seq)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 33,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "^vvv^^v^=vv=v^v=^vvvv^=^vv^vvv^=v=v^^v=^^v=v^=v^^vv^^==v^^v^v=vvv^^^^=vvv^^v=v=vv^^^^v^v=vv^v^=^^^^v=v=v^^^vv^vv^v^^vvv^v==^vv=^vv^vv^^vv=^=v=vv^vv^=v^^^^vvvvv=vv^^^v=^=^=vv^v=v^^^^vv=^^^^vv^^v=vv^^v^^v^vv^^==^v^=^^^^v=^v^v^v=vv^=vvv^v=^v^^^^vv^v^v^^v^v^v^^^vv^^v^^v=v^v^v^v^^v^vvvv^=^v=^^vvvv^^vv^vv^v=^v=^vvvvv^vv=vv^=v^=^^^^^=^vvvvv^=^v^=^^^v^^v^=v^^^vv^v^^vv^=^v^^^vvv=^v^^v^v^^vvvvv^vvv=^v=^^vv^^v^^vvvv=v^=v^vvvvvvv=^==^vv=v=vv=^^^^=vv^vvv^^v^vv^^^v^^v=v^^=^^^^vv^v==v^v^^v^^v^=^^^==v^^^vv^==vvvvvvv^=vv^=vv^^=v^^vvv^^^vvv^^vv=v=^^vvv^^^^v=^^vv^v^^=^v=v=^vv^^vvv^^^^vv^=v^^v^^v^v=v^^^^vvv^^=vv^=vv^^v^v^^v=v^^vv^=^v^^^=v^^v=v^vv^=^v^^v=vv^=^v^^^v^=v==v^vvvvv^vvvv^^v=^^vv^^v^^^^^=^v=^v^=^vv^v=^^^vvvv^^vv^^==^==^^^^v=v^vvvv=^v^=^vv^^v^^vvvvv=^v^^==^=^^v==v=vv^vv^^vvv=^vvvv=v=^vv=^v^^vv==vvv^^^=vv^^^vv=v=^vvv^^v^v=v^^v=^=v^vvvvvvvv===^=^vvv^vv^^vvvv^=^v^^^=^^^vvvvv^==v^^v=vvv^v=vv^vv^vv=vvv^vv^=^^^v^vv^vvv=v^vv^v^vvvvvv^^v^^^^vv^v=^=^v=v^^vvv^vv^^=^v^vv^v^=v=v^v^vvv=^^=^vv^vvv==^^v^^vvv^v^=\n",
+      "Final:  -48\n",
+      "Highest 1, lowest -49, final -48.\n",
+      "Highest exit 0, lowest exit -49.\n"
+     ]
+    }
+   ],
+   "source": [
+    "seq = build_sequence(instructions, 1000)\n",
+    "print(seq)\n",
+    "print('Final: ', final(seq))\n",
+    "fs, es = running(seq)\n",
+    "print('Highest {}, lowest {}, final {}.'.format(max(fs), min(fs), fs[-1]))\n",
+    "print('Highest exit {}, lowest exit {}.'.format(max(es), min(es)))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 67,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Highest 216, lowest -6, final 209.\n",
+      "Highest exit 215, lowest exit -5.\n"
+     ]
+    }
+   ],
+   "source": [
+    "valid_seq = False\n",
+    "while not valid_seq:\n",
+    "    seq = build_sequence(instructions, 10000)\n",
+    "    fs, es = running(seq)\n",
+    "    if min(fs) > -10 and fs[-1] > 0:\n",
+    "        valid_seq = True\n",
+    "\n",
+    "open('02-lifts.txt', 'w').write(seq)\n",
+    "print('Highest {}, lowest {}, final {}.'.format(max(fs), min(fs), fs[-1]))\n",
+    "print('Highest exit {}, lowest exit {}.'.format(max(es), min(es)))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 80,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "('v^^^^^v=v=', ([-1, 0, 1, 2, 3, 4, 3, 2], [3, 2]))"
+      ]
+     },
+     "execution_count": 80,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "small_seq = build_sequence(instructions, 10)\n",
+    "small_seq, running(small_seq)"
+   ]
+  },
+  {
+   "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.6.1"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}