Finished Advent 2017

This commit is contained in:
Peter Norvig 2017-12-25 00:49:15 -08:00 committed by GitHub
parent 94d842c47e
commit 184fc76db0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -2511,7 +2511,7 @@
},
{
"cell_type": "code",
"execution_count": 70,
"execution_count": 125,
"metadata": {},
"outputs": [
{
@ -2529,7 +2529,8 @@
" d = perform(dance, d)\n",
" if d in seen:\n",
" print(d, 'is seen in iterations', (seen[d], i))\n",
" break"
" break\n",
" seen[d] = i"
]
},
{
@ -4016,7 +4017,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"The `numba.jit` decorator really helps here, speeding up execution from 13 seconds to 1 second. It also helped on Day 15, but not as dramatically, and was not able to help on Day 22.\n",
"The `numba.jit` decorator really helps here, speeding up execution from 13 seconds to 1 second. It also helped on Day 15, but not as dramatically, and was not able to help on Day 15 or Day 22.\n",
"\n",
"\n",
"# [Day 24](https://adventofcode.com/2017/day/24): Electromagnetic Moat\n",
@ -4193,7 +4194,7 @@
" for c in ctable[port] - chain:\n",
" # Update chain, port, strength\n",
" # then recurse and possibly update best_strength\n",
" # then backtrack and rest chain, port, strength\n",
" # then backtrack and restore chain, port, strength\n",
" chain.add(c)\n",
" port = other_port(c, port)\n",
" strength += sum(c)\n",
@ -4220,7 +4221,7 @@
"source": [
"# [Day 25](https://adventofcode.com/2017/day/25): The Halting Problem\n",
"\n",
"I won't write a parser for my input; instead I'll translate it into a `dict`:"
"I won't write a parser for my input; instead I'll translate it into a `dict` by hand:"
]
},
{
@ -4235,8 +4236,7 @@
" \"machine()[state][value] == (new_value, move, new_state)}\"\n",
" L, R = -1, +1\n",
" A, B, C, D, E, F = 'ABCDEF'\n",
" return {\n",
" A: ((1, R, B), (0, L, C)),\n",
" return {A: ((1, R, B), (0, L, C)),\n",
" B: ((1, L, A), (1, R, D)),\n",
" C: ((0, L, B), (0, L, E)),\n",
" D: ((1, R, A), (0, R, B)),\n",
@ -4268,7 +4268,7 @@
}
],
"source": [
"def turing(machine, state='A', steps=12667664):\n",
"def turing(machine, state, steps):\n",
" \"Run the Turing machine for given number of steps, then return tape.\"\n",
" tape = defaultdict(int)\n",
" cursor = 0\n",
@ -4277,7 +4277,36 @@
" cursor += move\n",
" return tape\n",
"\n",
"sum(turing(machine()).values())"
"sum(turing(machine(), 'A', 12667664).values())"
]
},
{
"cell_type": "code",
"execution_count": 128,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"4770"
]
},
"execution_count": 128,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"def turing(machine, state):\n",
" \"Run the Turing machine, starting at state; yield tape each step.\"\n",
" tape = defaultdict(int)\n",
" cursor = 0\n",
" while True:\n",
" tape[cursor], move, state = machine[state][tape[cursor]]\n",
" cursor += move\n",
" yield tape\n",
"\n",
"quantify(nth(turing(machine(), 'A'), 12667664).values())"
]
},
{
@ -4397,7 +4426,7 @@
" run23_2() == 913,\n",
" 24: lambda: strongest_chain() == 1695 and\n",
" strength(max(chains(), key=length_and_strength)) == 1673,\n",
" 25: lambda: sum(turing(machine()).values()) == 4769\n",
" 25: lambda: quantify(nth(turing(machine(), 'A'), 12667664).values()) == 4769\n",
"})"
]
},