From 55f602f3ca4d1297233e471706caaad9c7a99b5e Mon Sep 17 00:00:00 2001 From: Neil Smith Date: Fri, 21 Jul 2017 10:43:06 +0100 Subject: [PATCH] Various changes to day 4 --- .../04-lines.txt | 0 .../04-small.txt | 0 .../amidakuji-creation.ipynb | 0 .../amidakuji-solution-1-slow.ipynb | 0 .../amidakuji-solution-1.ipynb | 254 ++++++- .../amidakuji-solution-2.ipynb | 145 +++- {04-08-amidakuji => 04-amidakuji}/day4.clj | 0 04-amidakuji/packing-variants.svg | 675 ++++++++++++++++++ 04-amidakuji/packing-variants.svg.png | Bin 0 -> 14504 bytes 04-amidakuji/permutations.txt | 23 + .../small-expanded-trace.svg | 0 .../small-expanded-trace.svg.png | Bin .../small-expanded.svg | 0 .../small-expanded.svg.png | Bin .../small-packed.svg | 0 .../small-packed.svg.png | Bin .../small-unpaired.svg | 0 .../small-untriple-1.svg | 0 .../small-untriple-1.svg.png | Bin .../small-untriple-2.svg | 0 .../untriple-general.svg | 0 .../untriple-general.svg.png | Bin 22 files changed, 1039 insertions(+), 58 deletions(-) rename {04-08-amidakuji => 04-amidakuji}/04-lines.txt (100%) rename {04-08-amidakuji => 04-amidakuji}/04-small.txt (100%) rename {04-08-amidakuji => 04-amidakuji}/amidakuji-creation.ipynb (100%) rename {04-08-amidakuji => 04-amidakuji}/amidakuji-solution-1-slow.ipynb (100%) rename {04-08-amidakuji => 04-amidakuji}/amidakuji-solution-1.ipynb (62%) rename {04-08-amidakuji => 04-amidakuji}/amidakuji-solution-2.ipynb (94%) rename {04-08-amidakuji => 04-amidakuji}/day4.clj (100%) create mode 100644 04-amidakuji/packing-variants.svg create mode 100644 04-amidakuji/packing-variants.svg.png create mode 100644 04-amidakuji/permutations.txt rename {04-08-amidakuji => 04-amidakuji}/small-expanded-trace.svg (100%) rename {04-08-amidakuji => 04-amidakuji}/small-expanded-trace.svg.png (100%) rename {04-08-amidakuji => 04-amidakuji}/small-expanded.svg (100%) rename {04-08-amidakuji => 04-amidakuji}/small-expanded.svg.png (100%) rename {04-08-amidakuji => 04-amidakuji}/small-packed.svg (100%) rename {04-08-amidakuji => 04-amidakuji}/small-packed.svg.png (100%) rename {04-08-amidakuji => 04-amidakuji}/small-unpaired.svg (100%) rename {04-08-amidakuji => 04-amidakuji}/small-untriple-1.svg (100%) rename {04-08-amidakuji => 04-amidakuji}/small-untriple-1.svg.png (100%) rename {04-08-amidakuji => 04-amidakuji}/small-untriple-2.svg (100%) rename {04-08-amidakuji => 04-amidakuji}/untriple-general.svg (100%) rename {04-08-amidakuji => 04-amidakuji}/untriple-general.svg.png (100%) diff --git a/04-08-amidakuji/04-lines.txt b/04-amidakuji/04-lines.txt similarity index 100% rename from 04-08-amidakuji/04-lines.txt rename to 04-amidakuji/04-lines.txt diff --git a/04-08-amidakuji/04-small.txt b/04-amidakuji/04-small.txt similarity index 100% rename from 04-08-amidakuji/04-small.txt rename to 04-amidakuji/04-small.txt diff --git a/04-08-amidakuji/amidakuji-creation.ipynb b/04-amidakuji/amidakuji-creation.ipynb similarity index 100% rename from 04-08-amidakuji/amidakuji-creation.ipynb rename to 04-amidakuji/amidakuji-creation.ipynb diff --git a/04-08-amidakuji/amidakuji-solution-1-slow.ipynb b/04-amidakuji/amidakuji-solution-1-slow.ipynb similarity index 100% rename from 04-08-amidakuji/amidakuji-solution-1-slow.ipynb rename to 04-amidakuji/amidakuji-solution-1-slow.ipynb diff --git a/04-08-amidakuji/amidakuji-solution-1.ipynb b/04-amidakuji/amidakuji-solution-1.ipynb similarity index 62% rename from 04-08-amidakuji/amidakuji-solution-1.ipynb rename to 04-amidakuji/amidakuji-solution-1.ipynb index 7f149b4..df69a1f 100644 --- a/04-08-amidakuji/amidakuji-solution-1.ipynb +++ b/04-amidakuji/amidakuji-solution-1.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 27, + "execution_count": 44, "metadata": { "collapsed": true }, @@ -16,7 +16,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 45, "metadata": { "collapsed": true }, @@ -27,7 +27,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 46, "metadata": { "collapsed": true }, @@ -39,7 +39,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 47, "metadata": { "collapsed": true }, @@ -51,23 +51,26 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 48, "metadata": { "collapsed": true }, "outputs": [], "source": [ - "def read_net(filename):\n", + "def read_net(filename, rev=False):\n", " with open(filename) as f:\n", " pairs = [re.split('\\D+', p.strip()) for p in f.readlines()]\n", - " lrs = [(int(lr[1]), int(lr[2])) for lr in pairs]\n", + " if rev:\n", + " lrs = [(int(lr[1]), int(lr[2])) for lr in reversed(pairs)]\n", + " else:\n", + " lrs = [(int(lr[1]), int(lr[2])) for lr in pairs]\n", " return [Link(h, l, r) \n", " for h, (l, r) in enumerate(lrs)]" ] }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -90,7 +93,7 @@ " Link(height=14, left=1, right=4)]" ] }, - "execution_count": 32, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -102,7 +105,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -111,7 +114,7 @@ "10135" ] }, - "execution_count": 33, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } @@ -123,7 +126,49 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "23" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "permnet = read_net('permutations.txt')\n", + "len(permnet)" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "23" + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "rpermnet = read_net('permutations.txt', rev=True)\n", + "len(rpermnet)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, "metadata": { "collapsed": true }, @@ -135,7 +180,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 19, "metadata": { "collapsed": true }, @@ -147,7 +192,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 20, "metadata": { "collapsed": true }, @@ -166,7 +211,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 21, "metadata": { "collapsed": true }, @@ -185,7 +230,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 22, "metadata": {}, "outputs": [ { @@ -194,7 +239,7 @@ "14" ] }, - "execution_count": 38, + "execution_count": 22, "metadata": {}, "output_type": "execute_result" } @@ -205,7 +250,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 23, "metadata": {}, "outputs": [ { @@ -214,7 +259,7 @@ "10" ] }, - "execution_count": 39, + "execution_count": 23, "metadata": {}, "output_type": "execute_result" } @@ -225,7 +270,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 24, "metadata": {}, "outputs": [ { @@ -234,7 +279,7 @@ "10134" ] }, - "execution_count": 40, + "execution_count": 24, "metadata": {}, "output_type": "execute_result" } @@ -245,7 +290,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 25, "metadata": { "collapsed": true }, @@ -256,7 +301,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 26, "metadata": {}, "outputs": [ { @@ -265,7 +310,7 @@ "2286" ] }, - "execution_count": 42, + "execution_count": 26, "metadata": {}, "output_type": "execute_result" } @@ -276,7 +321,7 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 27, "metadata": { "collapsed": true }, @@ -288,7 +333,7 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 28, "metadata": { "collapsed": true }, @@ -305,7 +350,7 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 29, "metadata": {}, "outputs": [ { @@ -314,7 +359,7 @@ "'acfbed'" ] }, - "execution_count": 45, + "execution_count": 29, "metadata": {}, "output_type": "execute_result" } @@ -325,14 +370,91 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 69, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " 0 ['0', '1', '2', '3', '4', '5']\n", + " 1 (2, 5) ['0', '1', '5', '3', '4', '2']\n", + " 2 (1, 4) ['0', '4', '5', '3', '1', '2']\n", + " 3 (0, 3) ['3', '4', '5', '0', '1', '2']\n", + " 4 (0, 3) ['0', '4', '5', '3', '1', '2']\n", + " 5 (0, 5) ['2', '4', '5', '3', '1', '0']\n", + " 6 (3, 5) ['2', '4', '5', '0', '1', '3']\n", + " 7 (0, 2) ['5', '4', '2', '0', '1', '3']\n", + " 8 (3, 4) ['5', '4', '2', '1', '0', '3']\n", + " 9 (2, 4) ['5', '4', '0', '1', '2', '3']\n", + "10 (1, 2) ['5', '0', '4', '1', '2', '3']\n", + "11 (0, 4) ['2', '0', '4', '1', '5', '3']\n", + "12 (1, 2) ['2', '4', '0', '1', '5', '3']\n", + "13 (2, 4) ['2', '4', '5', '1', '0', '3']\n", + "14 (0, 4) ['0', '4', '5', '1', '2', '3']\n", + "15 (1, 4) ['0', '2', '5', '1', '4', '3']\n" + ] + } + ], + "source": [ + "for i in range(len(small_net)+1):\n", + " pre_net = small_net[:i]\n", + " if i == 0:\n", + " print('{:2}'.format(i), \n", + " \" \".format(small_net[i-1].left, small_net[i-1].right),\n", + " follow_many(\"012345\", pre_net))\n", + " else:\n", + " print('{:2}'.format(i), \n", + " \"({}, {})\".format(small_net[i-1].left, small_net[i-1].right),\n", + " follow_many(\"012345\", pre_net))\n", + "\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[Link(height=0, left=2, right=5),\n", + " Link(height=1, left=1, right=4),\n", + " Link(height=2, left=0, right=3),\n", + " Link(height=3, left=0, right=3),\n", + " Link(height=4, left=0, right=5),\n", + " Link(height=5, left=3, right=5),\n", + " Link(height=6, left=0, right=2),\n", + " Link(height=7, left=3, right=4),\n", + " Link(height=8, left=2, right=4),\n", + " Link(height=9, left=1, right=2),\n", + " Link(height=10, left=0, right=4),\n", + " Link(height=11, left=1, right=2),\n", + " Link(height=12, left=2, right=4),\n", + " Link(height=13, left=0, right=4),\n", + " Link(height=14, left=1, right=4)]" + ] + }, + "execution_count": 66, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "small_net[:15]" + ] + }, + { + "cell_type": "code", + "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "10000 loops, best of 3: 39.5 µs per loop\n" + "10000 loops, best of 3: 42 µs per loop\n" ] } ], @@ -343,7 +465,7 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 37, "metadata": {}, "outputs": [ { @@ -352,7 +474,7 @@ "'doqzmbishkwunvltpcexyjgfra'" ] }, - "execution_count": 47, + "execution_count": 37, "metadata": {}, "output_type": "execute_result" } @@ -363,14 +485,74 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'zfrasxwigvjoembqcyhplnktud'" + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "''.join(follow_many(string.ascii_lowercase, permnet))" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'doqzmbishkwunvltpcexyjgfra'" + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "''.join(follow_many(string.ascii_lowercase, rpermnet))" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "follow_many(string.ascii_lowercase, net) == follow_many(string.ascii_lowercase, rpermnet)" + ] + }, + { + "cell_type": "code", + "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "10 loops, best of 3: 19.7 ms per loop\n" + "10 loops, best of 3: 19.3 ms per loop\n" ] } ], @@ -381,14 +563,14 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 33, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "100 loops, best of 3: 18.6 ms per loop\n" + "100 loops, best of 3: 18.7 ms per loop\n" ] } ], diff --git a/04-08-amidakuji/amidakuji-solution-2.ipynb b/04-amidakuji/amidakuji-solution-2.ipynb similarity index 94% rename from 04-08-amidakuji/amidakuji-solution-2.ipynb rename to 04-amidakuji/amidakuji-solution-2.ipynb index 3bc37db..3745c3c 100644 --- a/04-08-amidakuji/amidakuji-solution-2.ipynb +++ b/04-amidakuji/amidakuji-solution-2.ipynb @@ -57,10 +57,29 @@ }, "outputs": [], "source": [ - "def read_net(filename):\n", + "# def read_net(filename):\n", + "# with open(filename) as f:\n", + "# pairs = [re.split('\\D+', p.strip()) for p in f.readlines()]\n", + "# lrs = [(int(lr[1]), int(lr[2])) for lr in pairs]\n", + "# return [Link(h, l, r) \n", + "# for h, (l, r) in enumerate(lrs)]" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def read_net(filename, rev=False):\n", " with open(filename) as f:\n", " pairs = [re.split('\\D+', p.strip()) for p in f.readlines()]\n", - " lrs = [(int(lr[1]), int(lr[2])) for lr in pairs]\n", + " if rev:\n", + " lrs = [(int(lr[1]), int(lr[2])) for lr in reversed(pairs)]\n", + " else:\n", + " lrs = [(int(lr[1]), int(lr[2])) for lr in pairs]\n", " return [Link(h, l, r) \n", " for h, (l, r) in enumerate(lrs)]" ] @@ -123,7 +142,49 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "23" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "permnet = read_net('permutations.txt')\n", + "len(permnet)" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "23" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "rpermnet = read_net('permutations.txt', rev=True)\n", + "len(rpermnet)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, "metadata": { "collapsed": true }, @@ -135,7 +196,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 10, "metadata": { "collapsed": true }, @@ -147,7 +208,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 11, "metadata": { "collapsed": true }, @@ -166,7 +227,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 12, "metadata": { "collapsed": true }, @@ -185,7 +246,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -194,7 +255,7 @@ "14" ] }, - "execution_count": 12, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -205,7 +266,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 14, "metadata": {}, "outputs": [ { @@ -214,7 +275,7 @@ "10" ] }, - "execution_count": 13, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } @@ -225,7 +286,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -234,7 +295,7 @@ "10134" ] }, - "execution_count": 14, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -245,7 +306,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -254,7 +315,7 @@ "2286" ] }, - "execution_count": 15, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } @@ -265,7 +326,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 17, "metadata": { "collapsed": true }, @@ -277,7 +338,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 18, "metadata": { "collapsed": true }, @@ -294,7 +355,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 19, "metadata": {}, "outputs": [ { @@ -303,7 +364,7 @@ "'acfbedghij'" ] }, - "execution_count": 18, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } @@ -314,14 +375,14 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "10000 loops, best of 3: 38.1 µs per loop\n" + "10000 loops, best of 3: 40.1 µs per loop\n" ] } ], @@ -332,7 +393,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 24, "metadata": {}, "outputs": [ { @@ -341,7 +402,7 @@ "'doqzmbishkwunvltpcexyjgfra'" ] }, - "execution_count": 20, + "execution_count": 24, "metadata": {}, "output_type": "execute_result" } @@ -350,6 +411,46 @@ "''.join(follow_many(string.ascii_lowercase, net))" ] }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'zfrasxwigvjoembqcyhplnktud'" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "''.join(follow_many(string.ascii_lowercase, permnet))" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'doqzmbishkwunvltpcexyjgfra'" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "''.join(follow_many(string.ascii_lowercase, rpermnet))" + ] + }, { "cell_type": "code", "execution_count": 21, diff --git a/04-08-amidakuji/day4.clj b/04-amidakuji/day4.clj similarity index 100% rename from 04-08-amidakuji/day4.clj rename to 04-amidakuji/day4.clj diff --git a/04-amidakuji/packing-variants.svg b/04-amidakuji/packing-variants.svg new file mode 100644 index 0000000..07c4963 --- /dev/null +++ b/04-amidakuji/packing-variants.svg @@ -0,0 +1,675 @@ + +image/svg+xml1 +2 +3 +4 +5 +1 +2 +3 +4 +5 +1 +2 +3 +4 +5 + \ No newline at end of file diff --git a/04-amidakuji/packing-variants.svg.png b/04-amidakuji/packing-variants.svg.png new file mode 100644 index 0000000000000000000000000000000000000000..a696960c2496c32498dcca0e50632f62d09165b8 GIT binary patch literal 14504 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