{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import aocd\n", "\n", "inputvalue = int(aocd.get_data(day=3, year=2017))" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "430" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import math\n", "\n", "\n", "def spiraldistance(pos):\n", " if pos == 1:\n", " return 0\n", " prev = int(math.sqrt(pos))\n", " if prev % 2 == 0:\n", " prev -= 1\n", " sidelength = prev + 1\n", " offset = (pos - (prev**2)) % sidelength\n", " middle = sidelength // 2\n", " return middle + abs(middle - offset)\n", "\n", "\n", "tests = {1: 0, 12: 3, 23: 2, 1024: 31}\n", "for pos, expected in tests.items():\n", " assert (\n", " spiraldistance(pos) == expected\n", " ), f\"spiraldistance({pos}) => {spiraldistance(pos)}, not {expected}\"\n", "\n", "spiraldistance(inputvalue)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1, 1, 2, 4, 5, 10, 11, 23, 25, 26, 54, 57, 59, 122, 133, 142, 147, 304, 330, 351, 362, 747, 806, 880, 931]\n" ] }, { "data": { "text/plain": [ "312453" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from itertools import count, cycle, islice, product\n", "\n", "\n", "def summed_larger():\n", " grid = {(0, 0): 1}\n", " directions = tuple((x, y) for x, y in product((-1, 0, 1), repeat=2) if x or y)\n", " steps = cycle([(0, 1), (-1, 0), (0, -1), (1, 0)])\n", " step = next(steps)\n", " x, y = 1, 0\n", " size = 3\n", " yield 1\n", " for num in count(2):\n", " value = sum(grid.get((x + dx, y + dy), 0) for dx, dy in directions)\n", " yield value\n", " grid[(x, y)] = value\n", " if num == size**2: # next spiral ring\n", " size += 2\n", " x += 1\n", " step = next(steps)\n", " else:\n", " if (num - ((size - 2) ** 2)) % (size - 1) == 0: # change direction\n", " step = next(steps)\n", " x += step[0]\n", " y += step[1]\n", "\n", "\n", "print(list(islice(summed_larger(), 25)))\n", "next(filter(lambda v: v > inputvalue, summed_larger()))" ] } ], "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.12.0" } }, "nbformat": 4, "nbformat_minor": 2 }