Add files via upload

This commit is contained in:
Peter Norvig
2017-12-02 09:14:12 -08:00
committed by GitHub
parent 6b9063551c
commit c8c4dee589

View File

@@ -1,18 +1,30 @@
{ {
"cells": [ "cells": [
{ {
"cell_type": "code", "cell_type": "markdown",
"execution_count": 89, "metadata": {},
"metadata": { "source": [
"collapsed": false "# December 2017: Advent of Code Solutions\n",
"\n",
"<div align=right>Peter Norvig, December 2017</div>\n",
"\n",
"I'm doing the [Advent of Code](https://adventofcode.com) puzzles, just like [last year](https://github.com/norvig/pytudes/blob/master/ipynb/Advent%20of%20Code.ipynb). But this time, I won't repeat the write up my version of the puzzle description each time; you'll have to follow the links in the section headers (e.g. **[Day 1](https://adventofcode.com/2017/day/1)**) to read those. I just show my solutions.\n",
"\n",
"First, a set of imports and utility functions that might prove useful:"
]
}, },
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
"# Python 3.x\n", "# Python 3.x Utility Functions\n",
"\n", "\n",
"import re\n", "import re\n",
"import numpy as np\n", "import numpy as np\n",
"import math\n", "import math\n",
"import random\n",
"import urllib.request\n", "import urllib.request\n",
"\n", "\n",
"from collections import Counter, defaultdict, namedtuple, deque\n", "from collections import Counter, defaultdict, namedtuple, deque\n",
@@ -37,6 +49,20 @@
" except FileNotFoundError:\n", " except FileNotFoundError:\n",
" return urllib.request.urlopen(\"http://norvig.com/ipython/\" + filename)\n", " return urllib.request.urlopen(\"http://norvig.com/ipython/\" + filename)\n",
" \n", " \n",
"def array(lines):\n",
" \"Convert an iterable of lines into a 2-D array. If lines is a str, do splitlines.\"\n",
" if isinstance(lines, str): lines = lines.splitlines()\n",
" return [mapt(atom, line.split()) for line in lines]\n",
"\n",
"def atom(token):\n",
" try:\n",
" return int(token)\n",
" except ValueError:\n",
" try:\n",
" return float(token)\n",
" except ValueError:\n",
" return token\n",
"\n",
"################ Functions on Iterables\n", "################ Functions on Iterables\n",
"\n", "\n",
"def first(iterable, default=None): return next(iter(iterable), default)\n", "def first(iterable, default=None): return next(iter(iterable), default)\n",
@@ -124,6 +150,10 @@
" typ = (typ or (cat if isinstance(items, str) else tuple))\n", " typ = (typ or (cat if isinstance(items, str) else tuple))\n",
" return typ(sorted(items))\n", " return typ(sorted(items))\n",
"\n", "\n",
"def mapt(fn, *args): \n",
" \"Do a map, and make the results into a tuple.\"\n",
" return tuple(map(fn, *args))\n",
" \n",
"################ Math\n", "################ Math\n",
" \n", " \n",
"def transpose(matrix): return tuple(zip(*matrix))\n", "def transpose(matrix): return tuple(zip(*matrix))\n",
@@ -219,13 +249,157 @@
] ]
}, },
{ {
"cell_type": "code", "cell_type": "markdown",
"execution_count": null, "metadata": {},
"metadata": { "source": [
"collapsed": true "# [Day 1](https://adventofcode.com/2017/day/1): Inverse Captcha\n"
]
}, },
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [], "outputs": [],
"source": [] "source": [
"raw = '3294199471327195994824832197564859876682638188889768298894243832665654681412886862234525991553276578641265589959178414218389329361496673991614673626344552179413995562266818138372393213966143124914469397692587251112663217862879233226763533911128893354536353213847122251463857894159819828724827969576432191847787772732881266875469721189331882228146576832921314638221317393256471998598117289632684663355273845983933845721713497811766995367795857965222183668765517454263354111134841334631345111596131682726196574763165187889337599583345634413436165539744188866156771585647718555182529936669683581662398618765391487164715724849894563314426959348119286955144439452731762666568741612153254469131724137699832984728937865956711925592628456617133695259554548719328229938621332325125972547181236812263887375866231118312954369432937359357266467383318326239572877314765121844831126178173988799765218913178825966268816476559792947359956859989228917136267178571776316345292573489873792149646548747995389669692188457724414468727192819919448275922166321158141365237545222633688372891451842434458527698774342111482498999383831492577615154591278719656798277377363284379468757998373193231795767644654155432692988651312845433511879457921638934877557575241394363721667237778962455961493559848522582413748218971212486373232795878362964873855994697149692824917183375545192119453587398199912564474614219929345185468661129966379693813498542474732198176496694746111576925715493967296487258237854152382365579876894391815759815373319159213475555251488754279888245492373595471189191353244684697662848376529881512529221627313527441221459672786923145165989611223372241149929436247374818467481641931872972582295425936998535194423916544367799522276914445231582272368388831834437562752119325286474352863554693373718848649568451797751926315617575295381964426843625282819524747119726872193569785611959896776143539915299968276374712996485367853494734376257511273443736433464496287219615697341973131715166768916149828396454638596713572963686159214116763'\n",
"\n",
"digits = mapt(int, raw)\n",
"N = len(digits)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"1158"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sum(digits[i] \n",
" for i in range(N) \n",
" if digits[i] == digits[i - 1])"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"1132"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sum(digits[i] \n",
" for i in range(N) \n",
" if digits[i] == digits[i - N//2])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"I was able to do this warmup puzzle very quickly; too bad I started a few hours too late to make in on the leader board. I created a recurring calendar reminder so I'll be less likely to be late in the future."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# [Day 2](https://adventofcode.com/2017/day/2): Corruption Checksum\n"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"rows = array('''790\t99\t345\t1080\t32\t143\t1085\t984\t553\t98\t123\t97\t197\t886\t125\t947\n",
"302\t463\t59\t58\t55\t87\t508\t54\t472\t63\t469\t419\t424\t331\t337\t72\n",
"899\t962\t77\t1127\t62\t530\t78\t880\t129\t1014\t93\t148\t239\t288\t357\t424\n",
"2417\t2755\t254\t3886\t5336\t3655\t5798\t3273\t5016\t178\t270\t6511\t223\t5391\t1342\t2377\n",
"68\t3002\t3307\t166\t275\t1989\t1611\t364\t157\t144\t3771\t1267\t3188\t3149\t156\t3454\n",
"1088\t1261\t21\t1063\t1173\t278\t1164\t207\t237\t1230\t1185\t431\t232\t660\t195\t1246\n",
"49\t1100\t136\t1491\t647\t1486\t112\t1278\t53\t1564\t1147\t1068\t809\t1638\t138\t117\n",
"158\t3216\t1972\t2646\t3181\t785\t2937\t365\t611\t1977\t1199\t2972\t201\t2432\t186\t160\n",
"244\t86\t61\t38\t58\t71\t243\t52\t245\t264\t209\t265\t308\t80\t126\t129\n",
"1317\t792\t74\t111\t1721\t252\t1082\t1881\t1349\t94\t891\t1458\t331\t1691\t89\t1724\n",
"3798\t202\t3140\t3468\t1486\t2073\t3872\t3190\t3481\t3760\t2876\t182\t2772\t226\t3753\t188\n",
"2272\t6876\t6759\t218\t272\t4095\t4712\t6244\t4889\t2037\t234\t223\t6858\t3499\t2358\t439\n",
"792\t230\t886\t824\t762\t895\t99\t799\t94\t110\t747\t635\t91\t406\t89\t157\n",
"2074\t237\t1668\t1961\t170\t2292\t2079\t1371\t1909\t221\t2039\t1022\t193\t2195\t1395\t2123\n",
"8447\t203\t1806\t6777\t278\t2850\t1232\t6369\t398\t235\t212\t992\t7520\t7304\t7852\t520\n",
"3928\t107\t3406\t123\t2111\t2749\t223\t125\t134\t146\t3875\t1357\t508\t1534\t4002\t4417''')"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"46402"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sum(abs(max(row) - min(row)) for row in rows)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"265"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"def evendiv(row): \n",
" return first(a // b for a in row for b in row if a > b and a // b == a / b)\n",
"\n",
"sum(map(evendiv, rows))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Today I remembered to start on time, but I was too slow to score any points; the best I could do was 112th place on Part Two. \n",
"\n",
"In Part One, my big mistake was typing `\"=\"` instead of `\"-\"` in `\"max(row) - min(row)\"`. I was confused by Python's misleading error message, which said `\"SyntaxError: keyword can't be an expression\"` and pointed at `\"max\"`."
]
} }
], ],
"metadata": { "metadata": {
@@ -244,7 +418,7 @@
"name": "python", "name": "python",
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.6.0" "version": "3.5.3"
} }
}, },
"nbformat": 4, "nbformat": 4,