--- /dev/null
+{
+ "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
+}