{ "cells": [ { "cell_type": "markdown", "id": "4769054f-d675-4678-852f-945df5f1fc7d", "metadata": {}, "source": [ "
Peter Norvig, December 2025
\n", "\n", "# Advent of Code 2025\n", "\n", "I enjoy doing the [**Advent of Code**](https://adventofcode.com/) (AoC) programming puzzles, so here we go for 2025! \n", "\n", "This year I will be doing something different: I will solve each problem myself here, and then [**in another notebook**](Advent-2025-AI.ipynb) I will ask an **AI Large Language Model** to solve the same problem. Check out the differences!\n", "\n", "# Day 0\n", "\n", "I start by loading up my [**AdventUtils.ipynb**](AdventUtils.ipynb) notebook (same as last time except for the `current_year`). On each day I will first parse the input (with the help of my `parse` utility function, which also prints the first few lines of the input and the resulting parsed data objects), then solve Part 1 and Part 2 (recording the correct answer with my `answer` function)." ] }, { "cell_type": "code", "execution_count": 1, "id": "d5f1da68-5da6-434d-a068-1d93497a86b3", "metadata": {}, "outputs": [], "source": [ "%run AdventUtils.ipynb\n", "current_year = 2025" ] }, { "cell_type": "markdown", "id": "d0d7cba9-e8be-4eeb-9918-2a2aecb21738", "metadata": {}, "source": [ "I'm thankful that [@GaryGrady](https://mastodon.social/@garygrady) is providing cartoons:\n", "\n", "\"Gary" ] }, { "cell_type": "markdown", "id": "37bc12b8-d0dc-4873-984c-6f09ae647229", "metadata": {}, "source": [ "# [Day 1](https://adventofcode.com/2025/day/1): Secret Entrance\n", "\n", "On Day 1 we meet an elf and learn that our task is to finish decorating the North Pole by December 12th. There will be 24 challenges along the way; the first one involves unlocking a safe. The safe has a dial with 100 numbers, and an arrow that currently points at 50. Our input for today is a sequence of left and right rotations; for example \"R20\" means move the dial right by 20 numbers and \"L13\" means move it left by 13 numbers. \n", "\n", "I'll use my `parse` utility function to parse each line of the input as an integer, after replacing each 'L' with a minus sign and each 'R' with a plus sign. " ] }, { "cell_type": "code", "execution_count": 2, "id": "ed911a15-addc-4c04-8546-2c9f37aee341", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "────────────────────────────────────────────────────────────────────────────────────────────────────\n", "Puzzle input ➜ 4780 strs of size 2 to 4:\n", "────────────────────────────────────────────────────────────────────────────────────────────────────\n", "L20\n", "L13\n", "L16\n", "L16\n", "L29\n", "L7\n", "L48\n", "L48\n", "...\n", "────────────────────────────────────────────────────────────────────────────────────────────────────\n", "Parsed representation ➜ 4780 ints in range -999 to 997:\n", "────────────────────────────────────────────────────────────────────────────────────────────────────\n", "-20\n", "-13\n", "-16\n", "-16\n", "-29\n", "-7\n", "-48\n", "-48\n", "...\n" ] } ], "source": [ "def parse_rotation(line: str) -> str: return int(line.replace('L', '-').replace('R', '+'))\n", "\n", "rotations = parse(day=1, parser=parse_rotation) " ] }, { "cell_type": "markdown", "id": "7c98c883-d1dc-4d4e-9590-d47b1de000a0", "metadata": {}, "source": [ "Note that my `parse` function prints the first few input lines, then prints the parsed representation of these lines. That helps me debug and helps you the reader understand what is going on.\n", "\n", "\"Gary\n", "\n", "### Part 1: How many times is the dial left pointing at 0 after any rotation in the sequence?\n", "\n", "When applying the rotations in order, we are asked how many of the rotations leave the dial pointing at 0. The `itertools.accumulate` function yields running totals of its input sequence, so we just have to count (quantify) how many times the running total of the rotations is 0 mod 100. I'll write a function to do that and run it on the input:" ] }, { "cell_type": "code", "execution_count": 3, "id": "86079e27-2912-4431-8608-7a110a115789", "metadata": {}, "outputs": [], "source": [ "def count_zeros(numbers, dial=100) -> int:\n", " \"\"\"How many zeros (modulo `dial`) in the running partial sums of the numbers?\"\"\"\n", " return quantify(total % dial == 0 for total in accumulate(numbers, initial=50))" ] }, { "cell_type": "code", "execution_count": 4, "id": "eb90f15c-8f87-4d94-b49c-fcaa53aab8ae", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1182" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "count_zeros(rotations)" ] }, { "cell_type": "markdown", "id": "b5f68a70-8465-4249-954c-cba2b78751d8", "metadata": {}, "source": [ "I submitted \"1182\" to AoC and got back *That's the right answer!*, so I record the answer (and its run time) like this:" ] }, { "cell_type": "code", "execution_count": 5, "id": "8387c4bd-a0b7-46d7-b726-d2d4b383b3cf", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Puzzle 1.1: .0005 seconds, answer 1182 correct" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "answer(puzzle=1.1, solution=1182, code=lambda: \n", " count_zeros(rotations))" ] }, { "cell_type": "markdown", "id": "12d5d111-8f69-4944-855b-54cca8215d7b", "metadata": {}, "source": [ "### Part 2: How many times does the dial point to 0 at any time?\n", "\n", "For Part 2 we are asked to count both when a rotation ends up at 0 and when the arrow passes 0 at any time during a rotation. For example, if the arrow points to 95, then only a \"R5\" or a \"L95\" would register a 0 in Part 1, but now for Part 2 a rotation of \"R10\" would also count because it passes 0 (as would any rotation of \"R5\" or larger, or \"L95\" or larger). \n", "\n", "I'll start with a brute force approach: treat a rotation of, say, 20 as 20 rotations of 1, and then use the same `count_zeros` function from Part 1. (Note that `sign(r)` returns +1 for any positive input, and -1 for any negative input.)" ] }, { "cell_type": "code", "execution_count": 6, "id": "bfb5bd2d-d768-47b3-9897-d28f83f2202a", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Puzzle 1.2: .1357 seconds, answer 6907 correct" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "answer(1.2, 6907, lambda:\n", " count_zeros(sign(r) for r in rotations for _ in range(abs(r))))" ] }, { "cell_type": "markdown", "id": "bb0f6906-369e-4b3c-8840-d5648d713942", "metadata": {}, "source": [ "That's a long run time for a Day 1 problem, so here's a faster method: break each rotation down into a number of full circles and some remainder, then add the full circles to the count of zeros, and add one more if the remainder is at least as much as the distance to zero (in the appropriate direction): " ] }, { "cell_type": "code", "execution_count": 7, "id": "e0b676d8-3d4f-4b36-835d-b045ece53bd6", "metadata": {}, "outputs": [], "source": [ "def zero_clicks(rotations, position=50, dial=100) -> int:\n", " \"\"\"How many times does any click cause the dial to point at 0?\n", " Count 1 if the rotation crosses the distance to 0,\n", " and for large rotations, count abs(r) // 100 more.\"\"\"\n", " zeros = 0\n", " for r in rotations:\n", " full_circles, remainder = divmod(abs(r), dial)\n", " distance_to_0 = (dial - position if (r > 0 or position == 0) else position)\n", " zeros += full_circles + (1 if remainder >= distance_to_0 else 0)\n", " position = (position + r) % dial\n", " return zeros" ] }, { "cell_type": "code", "execution_count": 8, "id": "8969191e-bd50-4187-8e4b-64524bc8427a", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Puzzle 1.2: .0010 seconds, answer 6907 correct" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "answer(1.2, 6907, lambda:\n", " zero_clicks(rotations))" ] }, { "cell_type": "markdown", "id": "f47b1f7a-c9d9-4b21-a28a-f1e4e73d4c0d", "metadata": {}, "source": [ "That's much faster, but the code is trickier, and indeed I initially had a **bug** in the `distance_to_0` computation: when the current position is 0 the distance should be 100: it takes a full rotation to get back to 0. I fixed the bug by adding `or position == 0`." ] }, { "cell_type": "markdown", "id": "dd6908ae-1906-4687-a50d-a50293a1dad5", "metadata": {}, "source": [ "# [Day 2](https://adventofcode.com/2025/day/2): Gift Shop\n", "\n", "We're in the North Pole gift shop, where the elves are doing inventory control. Today's input is a list of ranges of product IDs of items in stock. Each range is a pair of integers separated by a dash, and the ranges are separated by commas:" ] }, { "cell_type": "code", "execution_count": 9, "id": "63bb5099-68ab-41b3-8d0c-2f409433b3f2", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "────────────────────────────────────────────────────────────────────────────────────────────────────\n", "Puzzle input ➜ 1 str of size 511:\n", "────────────────────────────────────────────────────────────────────────────────────────────────────\n", "990244-1009337,5518069-5608946,34273134-34397466,3636295061-3636388848,8613701-8663602,573252-68 ...\n", "────────────────────────────────────────────────────────────────────────────────────────────────────\n", "Parsed representation ➜ 35 tuples of size 2:\n", "────────────────────────────────────────────────────────────────────────────────────────────────────\n", "(990244, 1009337)\n", "(5518069, 5608946)\n", "(34273134, 34397466)\n", "(3636295061, 3636388848)\n", "(8613701, 8663602)\n", "(573252, 688417)\n", "(472288, 533253)\n", "(960590, 988421)\n", "...\n" ] } ], "source": [ "id_ranges = parse(day=2, parser=positive_ints, sections=lambda text: text.split(','))" ] }, { "cell_type": "markdown", "id": "a5463e74-a3a1-4c79-9497-a1e307ef81e2", "metadata": {}, "source": [ "\"GaryJGrady\n", "\n", "### Part 1: What is the sum of the invalid IDs?\n", "\n", "An invalid ID is defined as one that consists of a digit sequence repeated twice. So 55, 6464 and 123123 are invalid. We're asked for the sum of the invalid IDs across all the ID ranges.\n", "\n", "We could look at every number in every range and check if the first half of the number (as a string) is the same as the second half. How many checks would that be?" ] }, { "cell_type": "code", "execution_count": 10, "id": "d682f3f2-415e-4556-b6c8-43e331a38703", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1990936" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sum((hi - lo + 1) for lo, hi in id_ranges)" ] }, { "cell_type": "markdown", "id": "a9bf1aab-bd09-49a9-ab57-8b26b1f4a98d", "metadata": {}, "source": [ "Only 2 million! So it would indeed be feasible to check every one. But I have a suspicion that Part 2 would make it infeasible, so I'll invest in a more efficient approach. For each ID range, instead of enumerating every number in the range and checking each one for validity, I will instead enumerate over the *first half* of the possible digit strings in the range, and automatically generate invalid IDs by appending a copy of the first half to itself. By *first half* I don't mean divide by 2; I mean the first half of the digit string: the first half of \"123456\" is \"123\".\n", "\n", "Suppose the range is 123456-223000. I enumerate from 123 to 223, and for each number generate an invalid ID:\n", "[123123, 124124, 125125, ... 223223]. I then yield the IDs that are within the range (in this case all but the first and the last are in the range 123456-223000). Altogether I only have to consider 101 half IDs rather than 100,001 full IDs. (The algorithm scales with the square root of the size of the range, not with the size of the range itself.)" ] }, { "cell_type": "code", "execution_count": 11, "id": "1345f93d-84c5-43f8-b6c2-9fc7b8f5ed90", "metadata": {}, "outputs": [], "source": [ "def invalids_in_range(lo: int, hi: int) -> Iterable[int]:\n", " \"\"\"Yield all the invalid IDs between lo and hi inclusive.\n", " An ID is invalid if it consists of a digit sequence repeated twice.\"\"\"\n", " first_half = str(lo)[:max(1, len(str(lo)) // 2)]\n", " for i in count_from(int(first_half)):\n", " id = int(str(i) * 2)\n", " if lo <= id <= hi:\n", " yield id\n", " elif id > hi:\n", " return\n", "\n", "def invalids(id_ranges) -> Set[int]:\n", " \"\"\"Invalid IDs, according to any one of the list of invalid ID ranges.\"\"\"\n", " return union(invalids_in_range(lo, hi)\n", " for (lo, hi) in id_ranges)\n", "\n", "assert invalids([(11, 22)]) == {11, 22}" ] }, { "cell_type": "code", "execution_count": 12, "id": "8b0d12b3-f184-4149-8b49-f9ff78663d46", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Puzzle 2.1: .0027 seconds, answer 23560874270 correct" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "answer(2.1, 23560874270, lambda:\n", " sum(invalids(id_ranges)))" ] }, { "cell_type": "markdown", "id": "188dd774-0c2d-4304-8351-dfe208913a99", "metadata": {}, "source": [ "### Part 2: What is the sum of the invalid IDs, under the new rules?\n", "\n", "In Part 2 we discover that an ID should be considered invalid if it consists of two *or more* repeats of a sequence of digits. So 100100 is still invalid, but so are 100100100 and 100100100100 I'll rewrite `invalids_in_range` to take an optional argument saying how many repeats we're looking for, and introduce `all_invalids` to try all possible repeat lengths across all ID ranges:" ] }, { "cell_type": "code", "execution_count": 13, "id": "4fbf52e7-a06a-4000-8627-80d159788da1", "metadata": {}, "outputs": [], "source": [ "def invalids_in_range(lo: int, hi: int, repeat=2) -> Iterable[int]:\n", " \"\"\"Yield all the invalid IDs between lo and hi inclusive\n", " that are formed from exactly `repeat` repeated digit sequences.\"\"\"\n", " first_half = int(str(lo)[:len(str(lo)) // repeat] or 1)\n", " for i in count_from(int(first_half)):\n", " id = int(str(i) * repeat)\n", " if lo <= id <= hi:\n", " yield id\n", " elif id > hi:\n", " return\n", "\n", "def all_invalids(id_ranges) -> Set[int]:\n", " \"\"\"All Invalid IDs, according to the list of ranges, with any number of repeats.\"\"\"\n", " return union(invalids_in_range(lo, hi, repeat)\n", " for (lo, hi) in id_ranges\n", " for repeat in range(2, len(str(hi)) + 1))" ] }, { "cell_type": "markdown", "id": "1e7d71d2-8c08-4673-8d12-661edd6ab6f5", "metadata": {}, "source": [ "Since this is a bit tricky, I include some unit test assertions:" ] }, { "cell_type": "code", "execution_count": 14, "id": "5a29e5bc-3b07-4800-9a0f-4bd433e01c55", "metadata": {}, "outputs": [], "source": [ "assert list(invalids_in_range(2121212118, 2121212124, 5)) == [2121212121]\n", "assert all_invalids([(11, 22), (95, 115)]) == {11, 22, 99, 111}" ] }, { "cell_type": "markdown", "id": "cb254f91-8c6d-445d-86be-97df9a93018c", "metadata": {}, "source": [ "Now I'll verify that the answer for Part 1 still works, and go ahead and compute the answer for Part 2:" ] }, { "cell_type": "code", "execution_count": 15, "id": "8a7c6c25-4b5f-4178-8559-166ba1a9f924", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Puzzle 2.1: .0027 seconds, answer 23560874270 correct" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "answer(2.1, 23560874270, lambda:\n", " sum(invalids(id_ranges)))" ] }, { "cell_type": "code", "execution_count": 16, "id": "32fefd65-df2a-4ea3-9acd-7525ebd32380", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Puzzle 2.2: .0038 seconds, answer 44143124633 correct" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "answer(2.2, 44143124633, lambda:\n", " sum(all_invalids(id_ranges)))" ] }, { "cell_type": "markdown", "id": "872cf212-bfbf-4edd-b898-5f76ad122a85", "metadata": {}, "source": [ "I initially had another **bug** here: I initially counted \"222222\" three times: as 2 repeats of \"222\", or 3 repeats of \"22\", or 6 repeats of \"2\". I changed the output of `all_invalids` to be a `set` rather than a `list` to fix that." ] }, { "cell_type": "markdown", "id": "16e222aa-d424-44d8-bcb3-7aa11c31b540", "metadata": {}, "source": [ "# [Day 3](https://adventofcode.com/2025/day/3): Lobby\n", "\n", "Entering the lobby, we find that the elevators are offline. We might be able to fix the problem by turning on some batteries. There are multiple battery banks, each bank consisting of a sequence of digits representing the *joltage* level of a battery. " ] }, { "cell_type": "code", "execution_count": 17, "id": "04ef4f2f-2b07-43cd-87d4-a8f63f7fe840", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "────────────────────────────────────────────────────────────────────────────────────────────────────\n", "Puzzle input ➜ 200 strs of size 100:\n", "────────────────────────────────────────────────────────────────────────────────────────────────────\n", "5353323523322232362334333433323333353233331313222372133133353643423323233323333534414523333432223242\n", "6344544745655555456556556566665564538465555575558846455665837545764555554465564547547565544657585435\n", "2246273372253242254243532252231242225522622633532222322234255122531222423531343223123232234213323424\n", "6545643634344444495734739454433454439454355654483544243344534445434437426443854344454534654439534424\n", "2356636643143433535443636338231745346538433576334436353176353333433532345344334224435234343644332536\n", "3221311221443323323322222214632342232233222322333436263122265162212321261323142262212332322125216222\n", "3336332333336335335324359336493238433441666379243536334165623214253384333323893933867663434332383763\n", "3235321252332431332223232436222532432226223222213233432853535322314122221322352235213323124321222233\n", "...\n" ] } ], "source": [ "banks = parse(day=3)" ] }, { "cell_type": "markdown", "id": "529e9177-7e47-46fa-bdc0-b979205d2e72", "metadata": {}, "source": [ "### Part 1: What is the maximum possible total output joltage?\n", "\n", "We can turn on exactly two batteries in each bank, resulting in a two digit number which is the *joltage* of the bank. For example, given the bank \"8647\" we could choose to turn on the \"8\" and \"7\" to produce a joltage of 87; that's the maximum. We are asked what is the sum of the maximal possible joltage from each bank. The function `total_joltage` computes that; it calls `joltage` on each bank, and `joltage` chooses the biggest first digit, and then the biggest second digit that follows the first digit. Note that the possible choices for the first digit exclude the last digit, because if we chose that, then there would be no choices left for the second digit. (I chose to do the string-to-int conversion in `total_joltage`; it would also be okay to have `joltage` return an int.)" ] }, { "cell_type": "code", "execution_count": 18, "id": "0168ada2-b53e-4215-9e6a-2468759f095c", "metadata": {}, "outputs": [], "source": [ "def joltage(bank: str) -> str:\n", " \"\"\"The maximum possible joltage by turning on 2 batteries in the bank.\n", " Pick the biggest first digit, then the biggest digit that follows.\"\"\"\n", " first = max(bank[:-1]) # The first digit can't be the last character\n", " second = max(bank[bank.index(first) + 1:]) # The second digit must come after the first\n", " return first + second\n", "\n", "def total_joltage(banks: List[str]) -> int:\n", " \"\"\"The maximum possible joltage from all the banks.\"\"\"\n", " return sum(int(joltage(bank)) for bank in banks)" ] }, { "cell_type": "code", "execution_count": 19, "id": "3f6390f5-78b7-4472-acf9-8855d2c2453e", "metadata": {}, "outputs": [], "source": [ "assert joltage(\"8647\") == \"87\"\n", "assert joltage(\"1119\") == \"19\"" ] }, { "cell_type": "code", "execution_count": 20, "id": "9cc62ae9-b313-4b82-b8fb-bab9c0ef5cb6", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Puzzle 3.1: .0006 seconds, answer 17085 correct" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "answer(3.1, 17085, lambda:\n", " total_joltage(banks))" ] }, { "cell_type": "markdown", "id": "3f8a4645-5e36-4b3d-8ace-125024403b3b", "metadata": {}, "source": [ "### Part 2: What is the new maximum possible total output joltage?\n", "\n", "The elf hits the ***safety override*** button, and we can now turn on 12 batteries per bank, resulting in a 12-digit joltage. What is the new maximum possible total joltage?\n", "\n", "I will make a change to the two functions, passing in the number of digits to be chosen, *n* (with default 2 for backwards compatibility). The function `joltage` recurses when there is more than one digit remaining, choosing the first digit from the bank up to the last *n* - 1 characters, then recursively finding the biggest joltage from the rest. " ] }, { "cell_type": "code", "execution_count": 21, "id": "b9507c12-421b-41af-b926-a4d3d83f622d", "metadata": {}, "outputs": [], "source": [ "def joltage(bank: str, n=2) -> str:\n", " \"\"\"The maximum possible joltage by turning on `n` batteries in the bank.\n", " Pick the first digit, then the maximum joltage from the rest of the bank.\"\"\"\n", " if n == 1:\n", " return max(bank)\n", " else:\n", " first = max(bank[:-(n - 1)]) # The first digit can't be the last n-1 characters\n", " rest = bank[bank.index(first) + 1:]\n", " return first + joltage(rest, n - 1)\n", "\n", "def total_joltage(banks: List[str], n=2) -> int:\n", " \"\"\"The maximum possible joltage from all the banks,\n", " when `n` batteries are turned on per bank.\"\"\"\n", " return sum(int(joltage(bank, n)) for bank in banks)" ] }, { "cell_type": "code", "execution_count": 22, "id": "4a58a657-8f32-4001-a4ff-f30dfbe7e5e7", "metadata": {}, "outputs": [], "source": [ "assert joltage(\"811111111111119\", 2) == '89'\n", "assert joltage(\"818181911112111\", 5) == '92111'\n", "assert joltage(\"818181911112111\", 12) == '888911112111'" ] }, { "cell_type": "markdown", "id": "28d2e2ce-98b5-4b3b-9f4d-26efcb7e1258", "metadata": {}, "source": [ "I'll make sure Part 1 still works, and then solve Part 2:" ] }, { "cell_type": "code", "execution_count": 23, "id": "fe3cff78-81c0-4d4a-bb4d-f0f841067e0d", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Puzzle 3.1: .0007 seconds, answer 17085 correct" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "answer(3.1, 17085, lambda:\n", " total_joltage(banks))" ] }, { "cell_type": "code", "execution_count": 24, "id": "f971839e-81ea-49b4-a92f-a44884be645d", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Puzzle 3.2: .0021 seconds, answer 169408143086082 correct" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "answer(3.2, 169408143086082, lambda:\n", " total_joltage(banks, 12))" ] }, { "cell_type": "markdown", "id": "db13a440-9ad0-4344-b555-aec969869688", "metadata": {}, "source": [ "# [Day 4](https://adventofcode.com/2025/day/4): Printing Department\n", "\n", "The floor of the printing department is divided into squares, some of which contain a roll of paper. The day's input is a map of the floor, with `@` representing a roll of paper. I can handle that with the `Grid` class from my [AdventUtils](AdventUtils.ipynb):" ] }, { "cell_type": "code", "execution_count": 25, "id": "c9f227d5-2748-48e1-80c1-7385dad46323", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "────────────────────────────────────────────────────────────────────────────────────────────────────\n", "Puzzle input ➜ 140 strs of size 140:\n", "────────────────────────────────────────────────────────────────────────────────────────────────────\n", ".@@@@@...@.@@@@@@@@@@.@@@@@@@.@.@.@@@@@@@@@@@@@..@.@@@.@@@@@@..@.@..@.@@...@.@@@@..@@@@....@@@.@ ...\n", ".@@@@@.@....@.....@@@.@@.@@.@@@.@@@.@.@.@.@@@@@.@@.@@@@@.@@@@@@@@@@@..@@.@.@@.@@@.@@@@@@@@@@@..@ ...\n", "@.@@@@.@@@@.@@@@..@@.@@@@@@@@.@@@@.@@@@.@@..@.@...@.@.@.@.@@..@@@@@.@.@.@@@@.@@@@@@@@@.@@@@..@@. ...\n", ".@.....@.@@@..@.@@@.@..@@@@@..@@@.@@..@...@.@@@@.@@@.@.@@@@@@.@.@@@@@@@.@.@@@.@@@@@@...@@.@@..@. ...\n", "@@@@@.@@@.@@@@@@@..@@.@.@@@..@@..@@@.@@....@.@..@@@@@@@@.@.@@..@@...@@.@@@...@.@.@@@..@.@.@@@@@@ ...\n", "@.@@@@@@..@@@@...@..@@@@@@.@@@..@.....@@.@.@@...@@@.@@.@.@@@....@@.@.@.@@@@.@@@@@.@@@.@@...@@.@@ ...\n", ".@@@.@.@@@..@@.@.@@@@@.@.@..@@....@..@.@.@@@@.@..@@.@..@@@@@.@@@@@@@.@.@@@.@.@@@.@@@@.@@@@@@@@.@ ...\n", "@@@@@@@.@@...@@@....@.@@@@.@@@@@@@@@.@@@.@@.@@..@...@@@@@.@@@..@.@@@@@@@@@@.@@@.@..@@@.@@@@.@.@@ ...\n", "...\n" ] } ], "source": [ "paper_grid = Grid(parse(day=4), directions=directions8)" ] }, { "cell_type": "markdown", "id": "4dd00e21-228c-41f6-a28c-e2213e60d4ce", "metadata": {}, "source": [ "\"Gary\n", "\n", "\n", "### Part 1: How many rolls of paper can be accessed by a forklift?\n", "\n", "A roll is **accessible** by forklift if there are fewer than four rolls of paper in the eight adjacent positions (that's why I specified `directions8` in defining `paper_grid`). Counting the number of accessible rolls is easy, but I decided to make `accessible rolls` return a list of positions rather than a count, in anticipation of Part 2." ] }, { "cell_type": "code", "execution_count": 26, "id": "6fe5bd44-8a28-4d7a-bc8b-edc4af8f23c3", "metadata": {}, "outputs": [], "source": [ "def accessible_rolls(grid: Grid) -> List[Point]:\n", " \"\"\"The positions of all the accessible rolls of paper on the grid.\"\"\"\n", " return [p for p in grid if is_accessible(p, grid)]\n", "\n", "def is_accessible(p: Point, grid: Grid) -> bool:\n", " \"\"\"A roll of paper is accessible if there are fewer than \n", " four rolls of paper in the eight adjacent positions.\"\"\"\n", " return grid[p] == '@' and grid.neighbor_contents(p).count('@') < 4" ] }, { "cell_type": "markdown", "id": "714b9eed-bdee-4e3f-b0be-1a3f727dddfb", "metadata": {}, "source": [ "Here's the answer:" ] }, { "cell_type": "code", "execution_count": 27, "id": "a5ef09cf-b204-41eb-80d8-de107d385dbb", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Puzzle 4.1: .0572 seconds, answer 1569 correct" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "answer(4.1, 1569, lambda:\n", " len(accessible_rolls(paper_grid)))" ] }, { "cell_type": "markdown", "id": "550312ae-a70b-405c-90e6-5df9c9afc0e8", "metadata": {}, "source": [ "### Part 2: How many rolls of paper can be removed?\n", "\n", "If a paper roll is accessible, it can be removed by forklift. That may in turn make other rolls accessible, and hence removable. How many rolls in total can be removed?\n", "\n", "It looks like I was right to make `accessible_rolls` return a list of points rather than a count! I can answer the question by repeatedly finding the accessible rolls, removing them (on a copy of the grid so I don't mess up the original grid), and repeating until there are no more accessible rolls." ] }, { "cell_type": "code", "execution_count": 28, "id": "0ed53853-268c-4c2f-a929-cb3e6005a348", "metadata": {}, "outputs": [], "source": [ "def removable_rolls(grid: Grid) -> Iterable[Point]:\n", " \"\"\"The positions of paper rolls that can be removed, in any nuber of iterations.\"\"\"\n", " grid2 = grid.copy() # To avoid mutating the original input grid\n", " points = accessible_rolls(grid2)\n", " while points:\n", " yield from points\n", " grid2.update({p: '.' for p in points})\n", " points = accessible_rolls(grid2)" ] }, { "cell_type": "code", "execution_count": 29, "id": "2fb17a51-05f7-42ec-8d6c-222121a026cf", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Puzzle 4.2: 1.2546 seconds, answer 9280 correct" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "answer(4.2, 9280, lambda:\n", " quantify(removable_rolls(paper_grid))) " ] }, { "cell_type": "markdown", "id": "7143f73e-3b9b-49f3-bfa9-625899a56e37", "metadata": {}, "source": [ "That's the right answer, but the run time is a bit slow. The main issue is that `accessible_rolls` has to look at the whole grid on every iteration. But if the previous iteration only removed one roll, all we really need to look at on the next iteration is the neighbors of the removed roll. So I'll keep a queue of possibly removable points and repeatedly pop a point off the queue, and if it is an accessible roll, remove it and put all its neighbors on the queue. When the queue is empty, no more rolls can be removed." ] }, { "cell_type": "code", "execution_count": 30, "id": "54f20b5e-6713-459c-8d40-e545ce6b8e42", "metadata": {}, "outputs": [], "source": [ "def removable_rolls(grid: Grid) -> Iterable[Point]:\n", " \"\"\"The positions of paper rolls that can be removed, in any number of iterations.\"\"\"\n", " grid2 = grid.copy() # To avoid mutating the original input grid\n", " Q = grid.findall('@') # A queue of possibly removable positions in the grid\n", " while Q:\n", " p = Q.pop()\n", " if is_accessible(p, grid2):\n", " yield p\n", " grid2[p] = '.'\n", " Q.extend(grid2.neighbors(p))" ] }, { "cell_type": "code", "execution_count": 31, "id": "bcba970b-09aa-479b-9c6d-4f6a7ac49fed", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Puzzle 4.2: .1461 seconds, answer 9280 correct" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "answer(4.2, 9280, lambda:\n", " quantify(removable_rolls(paper_grid)))" ] }, { "cell_type": "markdown", "id": "4aae3157-9c06-40d1-b0cd-c6f5515b0064", "metadata": {}, "source": [ "That's almost 10 times faster!\n", "\n", "Let's visualize the paper rolls before and after removal:" ] }, { "cell_type": "code", "execution_count": 32, "id": "402e78e0-cf05-4285-bd9c-07b6ebd9b602", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "before = set(paper_grid.findall('@'))\n", "after = before - set(removable_rolls(paper_grid))\n", "\n", "naked_plot(before, 'o', markersize=2)\n", "naked_plot(after, 'o', markersize=2)" ] }, { "cell_type": "markdown", "id": "1f9a1e40-192a-4386-8cfb-bc5f69c88a9b", "metadata": {}, "source": [ "# [Day 5](https://adventofcode.com/2025/day/5): Cafeteria\n", "\n", "Today we're in the cafeteria, and the elves need to figure out which of their ingredients are fresh or spoiled. The input file has two parts (paragraphs), the first consisting of ranges of fresh ingredient IDs, like \"6-7\" and the second consisting of the available ingredient IDs, like \"8\". I can parse the data like this:" ] }, { "cell_type": "code", "execution_count": 33, "id": "4b508db5-aeae-410e-a062-1b2d4ce41253", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "────────────────────────────────────────────────────────────────────────────────────────────────────\n", "Puzzle input ➜ 1184 strs of size 0 to 31:\n", "────────────────────────────────────────────────────────────────────────────────────────────────────\n", "292632986393425-296797126337251\n", "428261559408337-431275643240865\n", "197704206528056-198822557342819\n", "36791726875734-37049023408764\n", "134880223152389-139959748438608\n", "31870818340663-32138457068292\n", "443613579514078-447616030778273\n", "284142407577672-288117756872436\n", "...\n", "────────────────────────────────────────────────────────────────────────────────────────────────────\n", "Parsed representation ➜ 2 tuples of size 183 to 1000:\n", "────────────────────────────────────────────────────────────────────────────────────────────────────\n", "((292632986393425, 296797126337251), (428261559408337, 431275643240865), (197704206528056, 19882 ...\n", "(92087202605588, 314304587960778, 19184152482180, 331502336245673, 104093299503920, 224082459481 ...\n" ] } ], "source": [ "def parse_ingredients(text: str) -> tuple:\n", " \"\"\"Parse either ranges like \"3-5\", or integers like \"8\".\"\"\"\n", " if '-' in text:\n", " return mapt(positive_ints, lines(text))\n", " return mapt(positive_ints, lines(text)) if '-' in text else ints(text)\n", " \n", "fresh_ranges, available_ingredient_ids = parse(day=5, parser=parse_ingredients, sections=paragraphs)" ] }, { "cell_type": "markdown", "id": "ebb61d5f-4683-4ff6-986c-69154d512e1b", "metadata": {}, "source": [ "### Part 1: How many of the available ingredient IDs are fresh?\n", "\n", "Keep it simple: For each ingredient ID, check to see if it is contained in any of the ranges (then we'll see if this is fast enough):" ] }, { "cell_type": "code", "execution_count": 34, "id": "ae5b33e4-92f5-4fe2-bd5a-6b22095724fa", "metadata": {}, "outputs": [], "source": [ "def count_fresh_ingredients(fresh_ranges, available_ingredient_ids) -> int:\n", " \"\"\"How many of the available ingredient IDs are in one of the fresh ranges?\"\"\"\n", " return quantify(any(lo <= id <= hi for (lo, hi) in fresh_ranges)\n", " for id in available_ingredient_ids)" ] }, { "cell_type": "code", "execution_count": 35, "id": "112a84f7-9bb8-45f0-9d7e-f600f37f0fdf", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Puzzle 5.1: .0123 seconds, answer 635 correct" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "answer(5.1, 635, lambda:\n", " count_fresh_ingredients(fresh_ranges, available_ingredient_ids))" ] }, { "cell_type": "markdown", "id": "01c2c322-e873-412f-9c47-59ffdf9adf79", "metadata": {}, "source": [ "Fast enough! Let's move on.\n", "\n", "### Part 2: How many ingredient IDs are fresh?\n", "\n", "In Part 2 we are asked how many of the possible ingredient IDs are fresh, regardless of whether the ID is available or not. I could convert a range like \"3-5\" into the set {3, 4, 5} and then union the sets together. How many elements would be in that set? Here's an estimate: " ] }, { "cell_type": "code", "execution_count": 36, "id": "47a660d2-746c-433f-b4ae-9d01f70bc504", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "476036797138761" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sum(hi - lo for (lo, hi) in fresh_ranges)" ] }, { "cell_type": "markdown", "id": "1360869f-3ccb-4c71-8d00-35de1215389f", "metadata": {}, "source": [ "OK, switch to Plan B. Instead of explicitly building this set I can instead sort the fresh ID ranges (by their low number) and go through them, keeping track of the lowest ID that has not yet been explored for freshness, and a count of the fresh IDs found so far. For each range, the number of new fresh IDs is the length of the range that starts with either the start of the range or the first unexplored ID, and ends at the end of the range." ] }, { "cell_type": "code", "execution_count": 37, "id": "f52e8ecd-325e-4ed4-8928-de9365b5b7d4", "metadata": {}, "outputs": [], "source": [ "def count_fresh_ids(fresh_ranges) -> int:\n", " \"\"\"How many IDs are contained in the union of the ranges?\"\"\"\n", " fresh_count = 0 # The number of fresh IDs found so far\n", " unexplored = 0 # The highest ID number that we haven't considered yet\n", " for (lo, hi) in sorted(fresh_ranges):\n", " start = max(unexplored, lo)\n", " fresh_count += len(range(start, hi + 1))\n", " unexplored = max(unexplored, hi + 1)\n", " return fresh_count" ] }, { "cell_type": "code", "execution_count": 38, "id": "fab6f1ed-543f-4f42-b1d5-2551742e3a4f", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Puzzle 5.2: .0002 seconds, answer 369761800782619 correct" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "answer(5.2, 369761800782619, lambda:\n", " count_fresh_ids(fresh_ranges))" ] }, { "cell_type": "markdown", "id": "6b83e353-3b77-4645-85b9-2f6ee6ff9e1d", "metadata": {}, "source": [ "# [Day 6](https://adventofcode.com/2025/day/5): Trash Compactor\n", "\n", "Trash Compactor? [I've got a bad feeling about this!](https://youtu.be/CZgeYSqUeTA?si=5UPS_HiCOmTKrEWX&t=32) We've fallen into a garbage smasher and have been asked to help some of the resident cephalopod children with their math homework. We can parse the homework worksheet, but we were told that the exact alignment of columns matters, so I'll keep each line as a string rather than converting it to a list of ints.\n", "\n", "\"Gary" ] }, { "cell_type": "code", "execution_count": 39, "id": "bca852a9-e4c5-4706-abfc-afc6d4a4eeb5", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "────────────────────────────────────────────────────────────────────────────────────────────────────\n", "Puzzle input ➜ 5 strs of size 3732:\n", "────────────────────────────────────────────────────────────────────────────────────────────────────\n", " 4 82 68 85 74 6 56 14 2 8669 66 13 927 3 235 44 52 16 37 61 82 1774 96 15 775 789 91 ...\n", " 6 87 39 72 56 12 69 79 58 4378 86 49 146 5 412 85 7751 577 69 813 55 9942 753 49 734 587 15 ...\n", " 827 446 82 72 76 21 31 32 96 3257 21 21 171 2 31 17 9178 977 11 469 58 712 162 4 1 132 91 ...\n", "9472 154 36 76 5 89 37 5 28 6 95 49 82 66 7 44 8183 524 38 819 11 7 825 9 8 397 48 ...\n", "+ + + * * * + * * + * + * * + + + + * + * + * + * * * ...\n" ] } ], "source": [ "worksheet = parse(6, str)" ] }, { "cell_type": "markdown", "id": "ae8a7f1d-07ec-46e4-880f-abbd82d46a67", "metadata": {}, "source": [ "### Part 1: What is the grand total of the answers to the individual problems?\n", "\n", "We humans are used to arithmetic problems written in left-to-right order, but cephalopods use top-to-bottom order, with a postfix operator in the last row. We need to compute the sum or product for each column and add all those results together. So the problem in the first column above would be \"`4 + 6 + 827 + 9472`\". Here's the code:" ] }, { "cell_type": "code", "execution_count": 40, "id": "92f320f4-c7a3-4dfd-ae61-6b1b180bdc93", "metadata": {}, "outputs": [], "source": [ "def grand_total(worksheet):\n", " \"\"\"The sum of the individual sum/product problems, where each column is a problem.\"\"\"\n", " columns = T(map(str.split, worksheet)) # Columns are the transpose of the rows; `T` is transpose\n", " operations = {'*': prod, '+': sum}\n", " return sum(operations[op](mapt(int, numbers)) \n", " for (*numbers, op) in columns)" ] }, { "cell_type": "code", "execution_count": 41, "id": "92a47f3a-127f-41e8-bee1-6276885bd36b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Puzzle 6.1: .0025 seconds, answer 5877594983578 correct" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "answer(6.1, 5877594983578, lambda:\n", " grand_total(worksheet))" ] }, { "cell_type": "markdown", "id": "226772ae-0d6e-43b8-9159-171ec1b36a5d", "metadata": {}, "source": [ "### Part 2: What is the grand total of the answers to the individual problems with the new rules?\n", "\n", "In Part 2 we learn that we did all the problems wrong. Cephalopodish number notation is different; numbers are read vertically rather than horizontally and the exact column alignment of each digit matters. Given the worksheet:\n", "\n", " 4 82 68 85 74 6 56 14 2 8669 66 13 927 3 235 44 \n", " 6 87 39 72 56 12 69 79 58 4378 86 49 146 5 412 85 \n", " 827 446 82 72 76 21 31 32 96 3257 21 21 171 2 31 17 \n", " 9472 154 36 76 5 89 37 5 28 6 95 49 82 66 7 44 \n", " + + + * * * + * * + * + * * + + \n", "\n", "The problem in the leftmost column is not \"`4 + 6 + 827 + 9472`\"; rather it is \"`9 + 84 + 27 + 4672`\". But the numbers are not always right-justified; the problem in the sixth colun is \"`6128 * 219`\".\n", "\n", "That means I can't just split each line into numbers, I'll have to be careful to maintain the blank spaces to the right and left of the digits, and I have to know in what position each column starts and ends. That part was tricky, so here's an explanation:\n", "- I note from the worksheet above that each column starts at a position above a `+` or `*` sign.\n", "- Each column ends one character before the next `+` or `*` sign.\n", "- For the last column there is no terminator, so I'll add the string `' *'` to the operator line before computing the start positions.\n", "\n", "In `grand_total2` I first break each line into columns, take the transpose of that (to give a list of problems), do the math on each problem, and return the sum of the results. Within `cephalopodish_math` I call `vertically`, whioch again does a transpose and then puts the digits together into an integer." ] }, { "cell_type": "code", "execution_count": 42, "id": "5866583b-245d-4a43-a037-229bf35f1be2", "metadata": {}, "outputs": [], "source": [ "def grand_total2(worksheet: List[str]):\n", " \"\"\"Solve the problem in each column with cephalopodish math and return the sum.\"\"\"\n", " problems = T(break_into_columns(worksheet))\n", " return sum(map(cephalopodish_math, problems))\n", "\n", "def break_into_columns(worksheet: List[str]) -> List[List[str]]:\n", " \"\"\"Break a whole worksheet into columns by finding the `blanks` (the columns with\n", " only blank spaces) and then separating each line at these posisitons.\"\"\"\n", " *number_lines, operator_line = worksheet\n", " operator_line = operator_line.ljust(len(worksheet[0])) + ' *'\n", " column_starts = [i for i, ch in enumerate(operator_line) if ch != ' ']\n", " return [break_line_into_columns(line, column_starts) for line in worksheet]\n", "\n", "def break_line_into_columns(line: str, column_starts: List[int]) -> List[str]:\n", " \"\"\"Break one line into columns, as specified by the list of `blanks` positions.\"\"\"\n", " return [line[column_starts[i]:column_starts[i + 1]-1] \n", " for i in range(len(column_starts) - 1)]\n", "\n", "def cephalopodish_math(problem) -> int:\n", " \"\"\"Return the sum or product of the vertically-arranged numbers.\"\"\"\n", " *numbers, op = problem\n", " sum_or_prod = (sum if op.strip() == '+' else prod)\n", " return sum_or_prod(vertically(numbers))\n", "\n", "def vertically(numbers: List[str]) -> List[int]:\n", " \"\"\"Return a list of integers found by reading numbers vertically by column.\"\"\"\n", " return [int(cat(digits)) for digits in T(numbers)]" ] }, { "cell_type": "code", "execution_count": 43, "id": "39a8fa78-946f-45aa-8d36-76883f4aeaff", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Puzzle 6.2: .0064 seconds, answer 11159825706149 correct" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "answer(6.2, 11159825706149, lambda:\n", " grand_total2(worksheet))" ] }, { "cell_type": "markdown", "id": "ca461ef3-50c3-4189-b724-5f2b3898f27d", "metadata": {}, "source": [ "I initially had an `IndexError` **bug** because the operator line is shorter then the numbers lines; the `ljust` fixed that. Then I had an off-by-one **bug** that messed up the problem in the last column. To debug my errors I worked on the smaller example worksheet, doing things like this:" ] }, { "cell_type": "code", "execution_count": 44, "id": "a13dbe89-3178-433f-9a50-28ed9a2f8358", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3263827" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "example = \"\"\"\\\n", "123 328 51 64 \n", " 45 64 387 23 \n", " 6 98 215 314\n", "* + * +\"\"\".splitlines()\n", "\n", "grand_total2(example)" ] }, { "cell_type": "code", "execution_count": 45, "id": "3aa0b661-367a-4316-905a-60f1d9e6df01", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[['123', '328', ' 51', '64 '],\n", " [' 45', '64 ', '387', '23 '],\n", " [' 6', '98 ', '215', '314'],\n", " ['* ', '+ ', '* ', '+']]" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "break_into_columns(example)" ] }, { "cell_type": "code", "execution_count": 46, "id": "13392d9c-fef8-4946-b945-48ad6bc7eca9", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[('123', ' 45', ' 6', '* '),\n", " ('328', '64 ', '98 ', '+ '),\n", " (' 51', '387', '215', '* '),\n", " ('64 ', '23 ', '314', '+')]" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "T(break_into_columns(example))" ] }, { "cell_type": "code", "execution_count": 47, "id": "e29df77c-7385-4ba9-a27b-4074a78a0d74", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[1, 24, 356]" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "vertically(('123', \n", " ' 45', \n", " ' 6'))" ] }, { "cell_type": "code", "execution_count": 48, "id": "9a25ff50-f465-4de3-95ca-71b7a3d9569b", "metadata": {}, "outputs": [], "source": [ "assert cephalopodish_math(('123', ' 45', ' 6', '* ')) == 1 * 24 * 356 == 8544" ] }, { "cell_type": "markdown", "id": "953679f2-8b55-4bcb-b46f-db0d7c435ea3", "metadata": {}, "source": [ "# [Day 7](https://adventofcode.com/2025/day/7): Laboratories\n", "\n", "In the lab is a tachyon manifold in need of repair. We find a diagram of the manifold, with `S` marking the start of the tachyon beams and `^` marking a splitter. \n", "\n", "I could parse this as a `Grid`, but I think I will just keep it as a list of strings. The main idea of a `Grid` is dealing with the 4 or 8 neighbors; a concept that this problem does not use." ] }, { "cell_type": "code", "execution_count": 49, "id": "e85af831-b6cf-4073-a131-ce68debaea75", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "────────────────────────────────────────────────────────────────────────────────────────────────────\n", "Puzzle input ➜ 142 strs of size 141:\n", "────────────────────────────────────────────────────────────────────────────────────────────────────\n", "......................................................................S......................... ...\n", "................................................................................................ ...\n", "......................................................................^......................... ...\n", "................................................................................................ ...\n", ".....................................................................^.^........................ ...\n", "................................................................................................ ...\n", "....................................................................^.^.^....................... ...\n", "................................................................................................ ...\n", "...\n" ] } ], "source": [ "manifold = parse(7)" ] }, { "cell_type": "markdown", "id": "59927e26-3252-4c26-8aef-014afdb6deaf", "metadata": {}, "source": [ "### Part 1: How many times will the beam be split?\n", "\n", "Tachyon beams move downwards unless they enounter a `^` splitter, in which case they split into two beams, one immediately to the left of the splitter and one to the right. We're asked how many splits occur. If two beams end up in the same place they count as one beam, so if that beam is split again, that's just one more split, not two more.\n", "\n", "That suggests I should keep a `set` of current horizontal beam positions, and update the set every time we go down one line. (It is a set rather than a list so that duplicate beam positions count as one, not as two. (Also, if I kept a list of positions then given the size of the input there would be trillions of beams by the end, so it would take a very long time to get the wrong answer.)) I use the idiom of iterating with `for b in list(beams)` rather than `for b in beams` so that I can mutate the set `beams` during the iteration. I also need to keep track of the split count, and return that at the end:" ] }, { "cell_type": "code", "execution_count": 50, "id": "d4d3bdbb-d8b2-4e22-adb4-c99a212a2ca7", "metadata": {}, "outputs": [], "source": [ "def count_splits(manifold: List[str]) -> int:\n", " \"\"\"How many beam split events occur as the beams make their way through the manifold?\"\"\"\n", " start = manifold[0].index('S')\n", " beams = {start}\n", " split_count = 0\n", " for line in manifold:\n", " for b in list(beams):\n", " if line[b] == '^': # Replace the beam position with one on each side and count a split\n", " split_count += 1\n", " beams.remove(b)\n", " beams.update({b - 1, b + 1})\n", " return split_count" ] }, { "cell_type": "code", "execution_count": 51, "id": "0e14ad5e-6871-4a9c-bd94-5a863c2341e0", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Puzzle 7.1: .0007 seconds, answer 1681 correct" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "answer(7.1, 1681, lambda:\n", " count_splits(manifold))" ] }, { "cell_type": "markdown", "id": "7e8174b9-2b66-41ce-9677-807a90b88ec5", "metadata": {}, "source": [ "### Part 2: In total, how many different timelines would a single tachyon particle end up on?\n", "\n", "Now we're told this is a *quantum* tachyon manifold and we need to know how many different *timelines* a single tachyon appears in, or in other words, how many different paths can the tachyon beams take to get to the last line.\n", "\n", "We can't just count the number of beams in the last line, because if a beam in position *b* takes two different paths to get there, that counts as two, not one. Instead, I'll replace the `set` from Part 1 with a `Counter` of `{beam_position: number_of_paths_to_get_here}`. If a beam at position *b* with *n* paths to get there encounters a splitter, then in the next step both positions *b* - 1 and *b* + 1 are incremented by *n*, and position *b* is decremented by *n*. In the end we return the sum of all the counts of paths." ] }, { "cell_type": "code", "execution_count": 52, "id": "df96165c-4e55-447a-bc5c-fba2f0462ebf", "metadata": {}, "outputs": [], "source": [ "def count_timelines(manifold: List[str]) -> int:\n", " \"\"\"How many possible paths are there to the final line of the manifold?\"\"\"\n", " start = manifold[0].index('S')\n", " beams = Counter({start: 1})\n", " for line in manifold:\n", " for (b, n) in list(beams.items()):\n", " if line[b] == '^':\n", " beams[b - 1] += n\n", " beams[b] -= n\n", " beams[b + 1] += n\n", " return sum(beams.values())" ] }, { "cell_type": "code", "execution_count": 53, "id": "ee179d56-ce86-473d-9801-39f1b90d03ab", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Puzzle 7.2: .0014 seconds, answer 422102272495018 correct" ] }, "execution_count": 53, "metadata": {}, "output_type": "execute_result" } ], "source": [ "answer(7.2, 422102272495018, lambda:\n", " count_timelines(manifold))" ] }, { "cell_type": "markdown", "id": "135b532d-d9ac-4400-9c6d-3b316d4596e1", "metadata": {}, "source": [ "# [Day 8](https://adventofcode.com/2025/day/8): Playground\n", "\n", "In a playground, some elves are setting up an ambitious Christmas light decoration project using electrical junction boxes. They have a list of the junction box coordinates in 3D space:" ] }, { "cell_type": "code", "execution_count": 54, "id": "a5cc43b2-3c5d-4d28-8c94-112bbb5739e7", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "────────────────────────────────────────────────────────────────────────────────────────────────────\n", "Puzzle input ➜ 1000 strs of size 13 to 17:\n", "────────────────────────────────────────────────────────────────────────────────────────────────────\n", "83023,97914,59845\n", "95221,6604,47587\n", "15200,13848,533\n", "91106,47235,95124\n", "91396,58746,56994\n", "72070,33359,10785\n", "13733,43410,23707\n", "84853,78378,68689\n", "...\n", "────────────────────────────────────────────────────────────────────────────────────────────────────\n", "Parsed representation ➜ 1000 tuples of size 3:\n", "────────────────────────────────────────────────────────────────────────────────────────────────────\n", "(83023, 97914, 59845)\n", "(95221, 6604, 47587)\n", "(15200, 13848, 533)\n", "(91106, 47235, 95124)\n", "(91396, 58746, 56994)\n", "(72070, 33359, 10785)\n", "(13733, 43410, 23707)\n", "(84853, 78378, 68689)\n", "...\n" ] } ], "source": [ "boxes = parse(8, ints)" ] }, { "cell_type": "markdown", "id": "ee9f47ae-09f5-479e-9e34-34246d723952", "metadata": {}, "source": [ "\"Gary\n", "\n", "### Part 1: What is the product of the sizes of the three largest circuits?\n", "\n", "The goal is to start connecting junction boxes, starting with the two boxes that are closest to each other in 3D space, then the next two closest, and so on. (I assume that a box can connect to an unlimited number of other boxes.) After connecting the 1000 pairs that are closest together, what do you get if you multiply together the sizes of the three largest circuits?\n", "\n", "I recognize this as a [**greedy algorithm**](https://en.wikipedia.org/wiki/Greedy_algorithm), consuming shortest links first, and I've [done that before](TSP.ipynb). I also recognize this as a [**Union-Find**](https://en.wikipedia.org/wiki/Disjoint-set_data_structure) problem, and I know there are efficient data structures for that problem. However, for this problem we don't make heavy use of the union-find functionality, so I'll keep it simple. (After finishing my code I feel vindicated: I see in my [other notebook](Advent2025-AI.ipynb) that Claude Opus 4.5 implemented a Union-Find data structure, and ended up with code that ran slower than my simpler approach.)\n", "\n", "The function `greedy_connect` will keep a dict that maps each box to the circuit it is part of (initially just itself), and update that dict when two circuits are connected together. Then I'll go through the 1000 `closest_pairs` of boxes, updating the dict for each one, and return the dict at the end. Then the function `largest` will find the largest 3 circuits, and `prod` will multiply the sizes together." ] }, { "cell_type": "code", "execution_count": 55, "id": "fb7744c9-105b-439b-aa57-caf93b8117b8", "metadata": {}, "outputs": [], "source": [ "Circuit = Tuple[Point, ...]\n", "\n", "def greedy_connect(boxes, n=1000) -> Dict[Point, Circuit]:\n", " \"\"\"Go through the `n` closest pairs of boxes, shortest first.\n", " If two boxes can be connected to form a new circuit, do it.\"\"\"\n", " circuits = {B: (B,) for B in boxes} # A dict of {box: circuit}\n", " for (A, B) in closest_pairs(boxes, n):\n", " if circuits[A] != circuits[B]:\n", " new_circuit = circuits[A] + circuits[B]\n", " for C in new_circuit: # Keep the circuits table up to date\n", " circuits[C] = new_circuit\n", " return circuits\n", "\n", "def closest_pairs(points, n=1000) -> List[Tuple[Point, Point]]:\n", " \"Return the `n` closest pairs of points, sorted shortest first.\"\n", " pairs = combinations(points, 2)\n", " return sorted(pairs, key=lambda link: distance_squared(*link))[:n]\n", "\n", "def largest(n, circuits) -> List[int]: \n", " \"\"\"The lengths of the `n` largest circuits (ones with the most boxes).\"\"\"\n", " return sorted(map(len, set(circuits.values())))[-n:]\n", "\n", "def distance_squared(P: Point, Q: Point) -> float:\n", " \"\"\"The square of the distance between 3D points P and Q.\"\"\"\n", " # Since we only care about sorting by distance, the distance squared is cheaper to compute\n", " return (P[0] - Q[0]) ** 2 + (P[1] - Q[1]) ** 2 + (P[2] - Q[2]) ** 2" ] }, { "cell_type": "code", "execution_count": 56, "id": "337ab7d6-d142-4c56-a0a3-2b6cd06cd895", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Puzzle 8.1: .6336 seconds, answer 24360 correct" ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "answer(8.1, 24360, lambda:\n", " prod(largest(3, greedy_connect(boxes, 1000))))" ] }, { "cell_type": "markdown", "id": "3291fa28-a8fa-4ef8-90b3-2b4b6fc9625e", "metadata": {}, "source": [ "### Part 2: What is the product of the X coordinates of the last two junction boxes connected?\n", "\n", "Now we are asked to connect all the boxes into one circuit, still closest first, and compute the product of the X coordinates of the final pair of boxes to be connected. Unfortunately I don't see a way to make `greedy_connect` do both parts; I'll have to copy and paste most of `greedy_connect` to form `last_connected`, which keeps connecting until all the boxes are connected into one circuit, and then returns the two boxes that made the final connection. " ] }, { "cell_type": "code", "execution_count": 57, "id": "1096ded6-749e-4787-9b90-2de917b147c4", "metadata": {}, "outputs": [], "source": [ "def last_connected(boxes) -> Tuple[Point, Point]:\n", " \"\"\"Go through tall the pairs of boxes, in closest first order. \n", " Return the last two boxes that finally make it all one big circuit.\"\"\"\n", " circuits = {B: (B,) for B in boxes} # A dict of {box: circuit}\n", " for (A, B) in closest_pairs(boxes, len(boxes) ** 2):\n", " if circuits[A] != circuits[B]:\n", " new_circuit = circuits[A] + circuits[B]\n", " if len(new_circuit) == len(boxes):\n", " return (A, B)\n", " for C in new_circuit:\n", " circuits[C] = new_circuit" ] }, { "cell_type": "code", "execution_count": 58, "id": "58f06244-ca67-47c9-8ca5-3346a249e1fc", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Puzzle 8.2: .6273 seconds, answer 2185817796 correct" ] }, "execution_count": 58, "metadata": {}, "output_type": "execute_result" } ], "source": [ "answer(8.2, 2185817796, lambda:\n", " prod(Xs(last_connected(boxes))))" ] }, { "cell_type": "markdown", "id": "fa988909-1a8b-4e8c-aca6-c53af99bc0b6", "metadata": {}, "source": [ "Today's puzzles had the slowest run times yet. I could perhaps make them faster by mutating sets rather than forming a new tuple for each new circuit, but I think gains from that would be small, and since the run time is still under a second, I'll leave the code as is." ] }, { "cell_type": "markdown", "id": "9e75bcf2-d62b-47b1-bec0-b2449351d819", "metadata": {}, "source": [ "# [Day 9](https://adventofcode.com/2025/day/9): Movie Theater \n", "\n", "The Elves are redecorating the movie theater floor by switching out some of the square tiles in the big grid they form. Some of the tiles are red; their coordinates form the day's input file:" ] }, { "cell_type": "code", "execution_count": 59, "id": "2dba6fa4-a09b-4ab3-a163-0f94f98e82f2", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "────────────────────────────────────────────────────────────────────────────────────────────────────\n", "Puzzle input ➜ 496 strs of size 10 to 11:\n", "────────────────────────────────────────────────────────────────────────────────────────────────────\n", "98214,50351\n", "98214,51580\n", "98424,51580\n", "98424,52775\n", "97835,52775\n", "97835,54031\n", "98280,54031\n", "98280,55255\n", "...\n", "────────────────────────────────────────────────────────────────────────────────────────────────────\n", "Parsed representation ➜ 496 tuples of size 2:\n", "────────────────────────────────────────────────────────────────────────────────────────────────────\n", "(98214, 50351)\n", "(98214, 51580)\n", "(98424, 51580)\n", "(98424, 52775)\n", "(97835, 52775)\n", "(97835, 54031)\n", "(98280, 54031)\n", "(98280, 55255)\n", "...\n" ] } ], "source": [ "red_tiles = parse(9, ints)" ] }, { "cell_type": "markdown", "id": "f8d3b123-234d-41b9-bb5b-090ad1b11e78", "metadata": {}, "source": [ "\"Gary\n", "\n", "### Part 1: What is the largest area of any rectangle you can make?\n", "\n", "The Elves would like to find the largest rectangle that uses red tiles for two of its opposite corners. That's easy; we can try all combinations of two corners and take the corners with the maximum area. The only tricky part is remembering that we have to add one to the delta-x and delta-y values before multiplying them; the area of a square with corners (0, 0) and (1, 1) is 4 tiles, not 1." ] }, { "cell_type": "code", "execution_count": 60, "id": "75f2742e-9dbd-4005-a882-3d3931fb1b36", "metadata": {}, "outputs": [], "source": [ "Corners = Tuple[Point, Point] # Type representing a rectangle as specified by two corners\n", "\n", "def tile_area(corners: Corners):\n", " \"\"\"Area, in tiles, of a rectangle formed by tiles at these corner positions.\"\"\"\n", " (x1, y1), (x2, y2) = corners\n", " return (abs(x1 - x2) + 1) * (abs(y1 - y2) + 1)" ] }, { "cell_type": "markdown", "id": "271f2f81-dc40-41db-9912-0c45f4d75dbb", "metadata": {}, "source": [ "Now we just maximize the area over all combinations of two corners:" ] }, { "cell_type": "code", "execution_count": 61, "id": "27f350c5-7866-4b7b-8d32-91512fcec5b9", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Puzzle 9.1: .0272 seconds, answer 4772103936 correct" ] }, "execution_count": 61, "metadata": {}, "output_type": "execute_result" } ], "source": [ "answer(9.1, 4772103936, lambda:\n", " max(map(tile_area, combinations(red_tiles, 2))))" ] }, { "cell_type": "markdown", "id": "dbd4e094-109f-420c-90b9-0ada15b1da9d", "metadata": {}, "source": [ "### Part 2: What is the largest area of any rectangle that has only red and green tiles?\n", "\n", "In Part 2 we pay attention to the **green** tiles on the floor. Every red tile is connected to the red tile before and after it (in the input list order) by a straight line of green tiles. (It is guaranteed this will always be a straight horizontal or vertical line.) The first red tile is also connected to the last red tile. This forms a closed polygon, and the interior of the polygon is also all green. (The color of the tiles outside of the polygon is not stated, but I'm going to say \"white.\") The elves want to know: What is the largest area of any rectangle that consists of only red and green tiles?\n", "\n", "**This is a tough one!** More difficult than all the previous puzzles. There are only 496 red tiles, so enumerating all pairs of them in Part 1 was easy. But there are roughly 100,0002or 10 billion total tiles, so doing something like a [flood fill](https://en.wikipedia.org/wiki/Flood_fill) for all the green tiles and checking against them for each pair of corners would be too slow. \n", "\n", "I really want to see what the red and green tiles look like! \n", "\n", "I'll plot the border tiles, but not the interior tiles:" ] }, { "cell_type": "code", "execution_count": 62, "id": "b5967a65-338d-4198-9f59-986ff74132e6", "metadata": {}, "outputs": [ { "data": { "image/png": "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zJgxKiws1A033CB/RNB3/PhxVVZWqqioSEVFRaqsrNR7770Xtqa5uVnXX3+9CgsLNWbMGN1+++3q7Owcirs9tFxOY0TtDM2AUxgAACAFVVfb9cONjdL27dLEieq55lOaWS2trJBON72cEWetEx4YHz9+XOXl5TrnnHP085//XPv379f//t//W3/zN3/jrPn+97+vBx54QI888oh27dql4uJiXXPNNXr//fedNStXrtQLL7ygjRs3atu2bTp58qSuu+469fT0OGtuuukm7dmzR5s3b9bmzZu1Z88eVVZWOtf39PRo7ty5am9v17Zt27Rx40Y999xzuuuuuxJ9t4debxeKUFG7JjPgFAYAAEhRPp/0+9/LXHaZdPXVyp90kV5bKz30C2nErKsyY8iYSbC7777bXHHFFTGvDwQCpri42Nx///3OZadPnzZFRUXmscceM8YY895775lzzjnHbNy40VnT2tpqPB6P2bx5szHGmP379xtJZseOHc6a7du3G0nmzTffNMYYs2nTJuPxeExra6uz5qmnnjJ5eXmmra1tQPenra3NSBrw+qF0+rEfmS5Lxkgm4PUaU1VljNdrjGR/Xrs22YcIAAAyVUuLCXg8dtzh9uH1GtPSkpRDS1S8lvCM8U9/+lNdfPHFuvHGGzV27Fh94hOf0Jo1a5zr33nnHR09elTXXnutc1leXp5mz56tV199VZK0e/dudXV1ha0pKSnRtGnTnDXbt29XUVGRLr30UmfNZZddpqKiorA106ZNU0lJibOmoqJCHR0dYaUdoTo6OnTixImwj1TRfUuVPrxSmlMlnXprv/T4432nNQ4dyohTGAAAIEXFGi4WlAElnQkPjP/whz/o0UcfVVlZmX7xi1/oK1/5im6//XY98cQTkqSjR49KksaNGxd2u3HjxjnXHT16VLm5uRo9enS/a8aOHRv188eOHRu2JvLnjB49Wrm5uc6aSDU1NU7NclFRkS644IIz/S8YUq1FUtOFkvGNty/w+aQ5c9K+2B0AAKQ4l7LOMBlQ0pnwwDgQCOgf/uEfdN999+kTn/iElixZokWLFunRRx8NW2dZ4VvHjDFRl0WKXOO2fjBrQt1zzz1qa2tzPlpaWvo9puF2sV9a+ark2eWe8QYAABgSPp86ax/u60RhWXYbN8kOiulKEe3888/XRz/60bDLpk6dqubmZklScXGx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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "def plot_tiles(red_tiles, figsize=(8, 8)) -> None:\n", " \"\"\"Plot the red-and-green border tiles.\"\"\"\n", " plt.figure(figsize=figsize)\n", " plt.plot(*T(red_tiles), 'g-')\n", " plt.plot(*T(red_tiles), 'r.')\n", "\n", "plot_tiles(red_tiles)" ] }, { "cell_type": "markdown", "id": "ef662323-d014-4c64-88cf-b6e777aee3d8", "metadata": {}, "source": [ "**Very Interesting!** Here's what I'm thinking:\n", "- Most of the lines of green tiles are very short, except for the two long lines across the \"equator.\"\n", "- A maximal-area red-and-green rectangle can't cross the two equator lines, because there are white tiles between them.\n", "- Therefore one of the corners of the maximal rectangle has to be one of the two points on the east end of the equator lines, and the other corner has to be somewhere on the left side of the circle.\n", "- The points are all roughly in a circle, so we're looking for a rectangle roughly inscribed in the circle.\n", "- A roughly correct way to check if a candidate rectangle is all red-and-green is to see if **the rectangle contains a red tile** in its interior.\n", "- To be more precise, consider the diagram below, in which the two large red circles mark the corners of a rectangle depicted with small purple squares. I have filled in the green tiles that connect the red tiles to form a polygon, and used light green for the interior of the polygon. Is the purple rectangle valid? It is ok that there are two other red tiles on the bottom border; they don't let a white square in. It is ok that there are two red tiles at the top that extend one square into the rectangle; they still don't let a white square in. But the red tile near the bottom right corner is two squares in from the border, and any red tiles in that position let in white squares (here three of them in the bottom right of the rectangle. The only exception is when there are two adjacent red tiles that form a 180 degree turn (as in the left of the rectangle); they do intrude into the rectangle, but because they are adjacent there are no white squares between them.\n", " \n", "        \n", "\n", "- To deal with the two-adjacent-red-tile problem, I will verify that there are no adjacent red tiles in *my* input. I bet Eric Wastl designed it so that nobody gets two adjacent tiles, but they aren't explicitly forbidden in the rules.\n", "- This red-tile-in-interior heuristic by itself isn't enough to stop a candidate rectangle from crossing over the long equator lines. But if we assume that any maximal-area rectangle has sides at least *d* units long, we can fix the problem by inserting an extra red tile every *d* steps along the path. Then, any rectangle with sides greater than *d* that crosses the equator (or any other long line) will contain a red tile in the interior.\n", "- If there were more red tiles we could put them into a data structure like a [quadtree](https://en.wikipedia.org/wiki/Quadtree).\n", "- Normally in problems like this we have to check if the rectangle we are considering is inside the polygon or outside of it. But for polygons that are anything like mine (i.e., mostly convex), only very small rectangles can be on the outside. Any sufficiently large rectangle must be on the inside, so I didn't bother checking.\n", "\n", "I'm ready to start coding! I'll start with this:\n", "- `find_2_corners` will return a list of the two candidate corner points at the east end of the equator lines.\n", "- `breadcrumbs` will leave \"breadcrumbs\" (that is, red tiles) along the trail at least every `d` spaces.\n", "- An assertion to show that no two of my red tiles are in adjacent squares." ] }, { "cell_type": "code", "execution_count": 63, "id": "e08d6c65-5b4e-456e-b4de-38339d209372", "metadata": {}, "outputs": [], "source": [ "def find_2_corners(red_tiles, d=10000) -> Optional[List[Point]]:\n", " \"\"\"Find two adjacent corners, separated on each side by a gap of at least `d`.\"\"\"\n", " return first([B, C] for [A, B, C, D] in sliding_window(red_tiles, 4)\n", " if distance(A, B) > d and distance(C, D) > d)\n", "\n", "def breadcrumbs(points, d=10000) -> List[Point]:\n", " \"\"\"Leave extra points along the trail on long lines, every `d` spaces.\"\"\"\n", " trail = [points[-1]]\n", " for p in points:\n", " while distance(trail[-1], p) > d: \n", " q = trail[-1]\n", " dx, dy = sign(X_(p) - X_(q)), sign(Y_(p) - Y_(q))\n", " trail.append((X_(q) + d * dx, Y_(q) + d * dy)) # Leave a breadcrumb\n", " trail.append(p)\n", " return trail\n", "\n", "assert not any(distance(p, q) == 1 for (p, q) in sliding_window(red_tiles, 2))" ] }, { "cell_type": "markdown", "id": "4425bb14-d9ca-4afb-8f1c-5787bf3e17a4", "metadata": {}, "source": [ "Let's visualize the output of these two functions:" ] }, { "cell_type": "code", "execution_count": 64, "id": "9dabf8bd-bdac-4b9a-941f-9de68480ca5d", "metadata": {}, "outputs": [ { "data": { "image/png": "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4fHMLjye2SeZj6kxRh988IFKS0vl8Zx6pTAZ4wQ8Ho/8fn9Sv+YZZ5zBL3UW4fHMPjym2YXHM7vweGafZD2mp5MpDmHzHQAAACACYwAAAEASgfGQKigo0De/+U0VFBSk+lCQBDye2YfHNLvweGYXHs/sk46PKZvvAAAAAJExBgAAACQRGAMAAACSCIwBAAAASQTGAAAAgCQCYwAAAEASgfGQWbFihc455xwNHz5c06ZN06uvvprqQ8o5tbW1mj59ukaOHKkxY8bo85//vPbu3Ruxxhije++9V6WlpfL5fKqsrNTvfve7iDUdHR1asmSJRo8eraKiIl199dUKBAIRa44cOaKqqioVFxeruLhYVVVVev/99yPWNDc366qrrlJRUZFGjx6t2267TZ2dnYNy7rmgtrZWlmVp6dKlzm08npmntbVV8+bN00c+8hEVFhbq7//+77Vjxw7nfh7TzNHd3a1//dd/1TnnnCOfz6cJEybovvvuUzAYdNbweKa3X/3qV7rqqqtUWloqy7L0n//5nxH3p9vjt2vXLs2aNUs+n0/jxo3Tfffdp5NuvmYw6NatW2eGDRtmVq5cafbs2WNuv/12U1RUZA4cOJDqQ8sps2fPNqtXrza7d+82O3fuNHPmzDHjx483x44dc9Y88MADZuTIkeb55583u3btMv/8z/9szjrrLHP06FFnzS233GLGjRtnNm3aZN544w1z6aWXmr/7u78z3d3dzprPfvazZurUqea1114zr732mpk6daq58sornfu7u7vN1KlTzaWXXmreeOMNs2nTJlNaWmoWL148NP8ZWWbbtm3mox/9qPnkJz9pbr/9dud2Hs/McvjwYVNWVmZuuOEG8/rrr5t3333XvPzyy+add95x1vCYZo5vf/vb5iMf+Yj56U9/at59913z7LPPmhEjRpiHH37YWcPjmd7Wr19vvvGNb5jnn3/eSDIvvvhixP3p9Pi1tbWZsWPHmi996Utm165d5vnnnzcjR440P/jBD07qnAmMh8D5559vbrnllojbzj33XLNs2bIUHRGMMea9994zkkxTU5MxxphgMGhKSkrMAw884Kw5ceKEKS4uNo8//rgxxpj333/fDBs2zKxbt85Z09raajwej9mwYYMxxpg9e/YYSWbr1q3Omi1bthhJ5q233jLG2E82Ho/HtLa2OmuefvppU1BQYNra2gbvpLPQBx98YMrLy82mTZvMrFmznMCYxzPz3HXXXebiiy+Oez+PaWaZM2eO+cpXvhJx2xe+8AUzb948YwyPZ6aJDozT7fFbsWKFKS4uNidOnHDW1NbWmtLSUhMMBgd8npRSDLLOzk7t2LFDV1xxRcTtV1xxhV577bUUHRUkqa2tTZJ05plnSpLeffddHTp0KOKxKigo0KxZs5zHaseOHerq6opYU1paqqlTpzprtmzZouLiYl1wwQXOmgsvvFDFxcURa6ZOnarS0lJnzezZs9XR0RFx2RiJLVq0SHPmzNFnPvOZiNt5PDPPT37yE5133nm69tprNWbMGH3qU5/SypUrnft5TDPLxRdfrF/84hd6++23JUn/8z//o82bN+tzn/ucJB7PTJduj9+WLVs0a9asiCl6s2fP1h//+Eft379/wOeVdxL/BzgFf/nLX9TT06OxY8dG3D527FgdOnQoRUcFY4zuuOMOXXzxxZo6daokOY+H22N14MABZ01+fr5GjRoVsyb0+YcOHdKYMWNivueYMWMi1kR/n1GjRik/P5+fi5Owbt06vfHGG9q+fXvMfTyemecPf/iDHnvsMd1xxx36l3/5F23btk233XabCgoK9OUvf5nHNMPcddddamtr07nnniuv16uenh595zvf0XXXXSeJ39FMl26P36FDh/TRj3405vuE7jvnnHMGdF4ExkPEsqyIfxtjYm7D0Fm8eLF++9vfavPmzTH3ncpjFb3Gbf2prEF8LS0tuv3227Vx40YNHz487joez8wRDAZ13nnn6f7775ckfepTn9Lvfvc7PfbYY/ryl7/srOMxzQz/8R//oR/96Ef68Y9/rP/1v/6Xdu7cqaVLl6q0tFTV1dXOOh7PzJZOj5/bscT73HgopRhko0ePltfrjXlH+t5778W8+8HQWLJkiX7yk5+osbFRfr/fub2kpESS+n2sSkpK1NnZqSNHjvS75k9/+lPM9/3zn/8csSb6+xw5ckRdXV38XAzQjh079N5772natGnKy8tTXl6empqa9O///u/Ky8uLyBSE4/FMX2eddZY+/vGPR9w2ZcoUNTc3S+J3NNP87//9v7Vs2TJ96Utf0ic+8QlVVVXpq1/9qmprayXxeGa6dHv83Na89957kmKz2v0hMB5k+fn5mjZtmjZt2hRx+6ZNm3TRRRel6KhykzFGixcv1gsvvKBXXnkl5rLKOeeco5KSkojHqrOzU01NTc5jNW3aNA0bNixizcGDB7V7925nzYwZM9TW1qZt27Y5a15//XW1tbVFrNm9e7cOHjzorNm4caMKCgo0bdq05J98Fvr0pz+tXbt2aefOnc7Heeedp7lz52rnzp2aMGECj2eGqaioiGmh+Pbbb6usrEwSv6OZ5sMPP5THExlmeL1ep10bj2dmS7fHb8aMGfrVr34V0cJt48aNKi0tjSmx6NeAt+nhlIXatTU0NJg9e/aYpUuXmqKiIrN///5UH1pOWbhwoSkuLja//OUvzcGDB52PDz/80FnzwAMPmOLiYvPCCy+YXbt2meuuu8619Yzf7zcvv/yyeeONN8xll13m2nrmk5/8pNmyZYvZsmWL+cQnPuHaeubTn/60eeONN8zLL79s/H4/rYNOU3hXCmN4PDPNtm3bTF5envnOd75j9u3bZ9auXWsKCwvNj370I2cNj2nmqK6uNuPGjXPatb3wwgtm9OjR5utf/7qzhsczvX3wwQfmN7/5jfnNb35jJJkHH3zQ/OY3v3HazabT4/f++++bsWPHmuuuu87s2rXLvPDCC+aMM86gXVu6+uEPf2jKyspMfn6++Yd/+AenRRiGjiTXj9WrVztrgsGg+eY3v2lKSkpMQUGBmTlzptm1a1fE1zl+/LhZvHixOfPMM43P5zNXXnmlaW5ujljz17/+1cydO9eMHDnSjBw50sydO9ccOXIkYs2BAwfMnDlzjM/nM2eeeaZZvHhxRJsZnLzowJjHM/P813/9l5k6daopKCgw5557rqmvr4+4n8c0cxw9etTcfvvtZvz48Wb48OFmwoQJ5hvf+Ibp6Ohw1vB4prfGxkbX183q6mpjTPo9fr/97W/NJZdcYgoKCkxJSYm59957T6pVmzHGWMac7EgQAAAAIPtQYwwAAACIwBgAAACQRGAMAAAASCIwBgAAACQRGAMAAACSCIwBAAAASQTGAAAAgCQCYwAAAEASgTEAAAAgicAYAAAAkERgDAAAAEiS/n/uNPrTKlgzvwAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_tiles(breadcrumbs(red_tiles))\n", "plt.plot(*T(find_2_corners(red_tiles)), 'bD');" ] }, { "cell_type": "markdown", "id": "d8039a9d-1af7-4a74-80c9-18bba48aeb7b", "metadata": {}, "source": [ "Now I'll define `biggest_rectangle` to find the maximal-area all-red-and-green rectangle. I'll do that by considering pairs of corner points, where the first corner can be any red tile, and by default the second corner can also be any red tile, but you can optionally pass in the result of `find_2_corners` to speed things up. We then sort the possible rectangles by area, biggest first, and go through them one at a time. When we find one that does not have `any_intrusions`, we return it; it must be the biggest. \n", "\n", "The function `any_intrusions` checks to see if a red tile is completely inside the rectangle defined by the corners, by checking the x and y coordinates of each red tile against the bounds of the rectangle." ] }, { "cell_type": "code", "execution_count": 95, "id": "922d721e-5330-466b-8a54-8a273522c44d", "metadata": {}, "outputs": [], "source": [ "def biggest_rectangle(red_tiles, second_corners=None, d=10000) -> Corners:\n", " \"\"\"Find the biggest rectangle that stays within the interior-and-border of the tiles.\"\"\"\n", " if second_corners is None: # You can pass in a hint for second corners, or it will try them all\n", " second_corners = red_tiles\n", " tiles = breadcrumbs(red_tiles, d)\n", " corner_pairs = cross_product(second_corners, red_tiles)\n", " for corners in sorted(corner_pairs, key=tile_area, reverse=True):\n", " if not any_intrusions(tiles, corners):\n", " return corners\n", " raise ValueError('No rectangle') # Shouldn't get here unless there are no corners\n", "\n", "def any_intrusions(red_tiles: List[Point], corners: Corners) -> bool:\n", " \"\"\"Does any red tile intrude inside the rectangle defined by the corners?\"\"\"\n", " # OK for a red tile to be on border or just one square in, but not 2 squares in\n", " xlo, xhi = min(Xs(corners)) + 2, max(Xs(corners)) - 2\n", " ylo, yhi = min(Ys(corners)) + 2, max(Ys(corners)) - 2\n", " return any(xlo <= x <= xhi and ylo <= y <= yhi\n", " for (x, y) in red_tiles)" ] }, { "cell_type": "markdown", "id": "683f5366-8c80-445f-813f-1b894871a295", "metadata": {}, "source": [ "We're ready to solve the puzzle:" ] }, { "cell_type": "code", "execution_count": 66, "id": "7ff60bbf-9cb6-4102-8b1c-5ef72be03c92", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Puzzle 9.2: .0156 seconds, answer 1529675217 correct" ] }, "execution_count": 66, "metadata": {}, "output_type": "execute_result" } ], "source": [ "answer(9.2, 1529675217, lambda:\n", " tile_area(biggest_rectangle(red_tiles, find_2_corners(red_tiles))))" ] }, { "cell_type": "markdown", "id": "53ef7a00-aef7-4c20-8a2b-d735df8f28dd", "metadata": {}, "source": [ "Let's see what the biggest rectangle looks like:" ] }, { "cell_type": "code", "execution_count": 67, "id": "8ba7df82-cef0-4c94-8ffa-1822910d21f7", "metadata": {}, "outputs": [ { "data": { "image/png": "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BmxtLkktLdKsWZP4ZNe1y+jr61OK9Ug0oqV31Kq+R9qz6bCq06XgF5Fs61AK+gxKrqCfIFBCOvMwicFB6Xvfs9evvpq2dQAAAABS5WsiMBKNqHazveHeO3tVU1ncM4zZ1qGUXeVmgkAJRxOESWQo6CsqpI9+NKdnCgAAAKDEeL3StdeOXsfU5GUPfXd3t2644Qb99m//tqqrq3XRRRdp//798Y8bY/TVr35VixYtUlVVlRoaGvTCCy8k3EZ/f79uvvlmnXXWWaqpqdE111wjN2m/94kTJ7R69Wr5fD75fD6tXr1ab731VsKYV155RR/5yEdUU1Ojs846S7fccoui0Wg+vu3iEAzKJDWKt4ESh/XEpsMpHyuXMAkAAAAA+TdnjvTII/YyZ84UbywpF+xMssCKXc4L+hMnTmjFihWaNWuWvv/97+vQoUP67//9v+vtb397fMzdd9+te+65R9u2bdO+ffu0cOFCXXnllfrNb34TH7Nx40Y9/vjjeuihh/T000+rt7dXV199tYaGhuJjrrvuOh04cEBPPvmknnzySR04cECrV6+Of3xoaEhXXXWVIpGInn76aT300EN67LHHdNttt+X62y4efn9KYMRIoET14iV2z/yYsIlswySGhqQf/chexvyIAAAAACD3QiGZQEBatUomEJDns5/VsS1S506pKrhMCoUKfYbTIud76O+44w795Cc/0Y9//OO0HzfGaNGiRdq4caO+/OUvS7Kz8QsWLNA3vvENrVu3TuFwWO94xzu0a9cufepTn5Ikvfrqqzr77LO1Z88eNTY26sUXX9QFF1ygZ599Vpdddpkk6dlnn9Xy5cv1q1/9SkuXLtX3v/99XX311Tp+/LgWLVokSXrooYd044036o033shqT3zJ7aFXFoERE4RNjHubhOIBAAAAmA5pcsGM7BbiuCyzwGaqbOvQnM/Q/8u//IsuueQSfeITn9D8+fP1B3/wB7r//vvjHz9y5Ihef/11fehDH4ofmz17tlauXKlnnnlGkrR//34NDAwkjFm0aJEuvPDC+Jif/vSn8vl88WJekt7znvfI5/MljLnwwgvjxbwkNTY2qr+/P2ELwFj9/f06efJkwqUUdfukvedJxl+X+kG/X2pomNQvv+NIF1xgL46TeTwAAACA8nPqlFRXZy+nTp3hjaTJBUspQUaywEpczgv6//t//6/u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XzfffLPOOuss1dTU6JprrpHrugljTpw4odWrV8vn88nn82n16tV66623Esa88sor+shHPqKamhqdddZZuuWWWxSNRvP17QIAAAAA8i0YlHGc1ONlFvqd14J+37596ujo0O/93u8lHL/77rt1zz33aNu2bdq3b58WLlyoK6+8Ur/5zW/iYzZu3KjHH39cDz30kJ5++mn19vbq6quv1tDQUHzMddddpwMHDujJJ5/Uk08+qQMHDmj16tXxjw8NDemqq65SJBLR008/rYceekiPPfaYbrvttnx+2zNeXVhqODImNMJ1pc5O+xYAAAAAZjq/X9H7tmlo7DGPp/xCv02e/OY3vzHBYND84Ac/MCtXrjSf//znjTHGxGIxs3DhQvN3f/d38bGnT582Pp/P/OM//qMxxpi33nrLzJo1yzz00EPxMd3d3cbj8Zgnn3zSGGPMoUOHjCTz7LPPxsf89Kc/NZLMr371K2OMMXv27DEej8d0d3fHx/zTP/2TmT17tgmHw1l9H+Fw2EjKevxMd/of/8EMOjJGMjGPx0RXX29iHo8xkjEejzEPPFDoUwQAAACAjHr7e03dF2SuvVamb/eDxhw/XuhTypls69C8zdC3trbqqquu0gc/+MGE40eOHNHrr7+uD33oQ/Fjs2fP1sqVK/XMMzatbf/+/RoYGEgYs2jRIl144YXxMT/96U/l8/l02WWXxce85z3vkc/nSxhz4YUXatGiRfExjY2N6u/v1/79+9Oed39/v06ePJlwKRmuq8oNN8s7vNXEicVUsWu3nFjMHojFbIgEM/UAAAAAikC3T3r0Qmno2o+X18z8sLwU9A899JD+9//+39q8eXPKx15//XVJ0oIFCxKOL1iwIP6x119/XZWVlZo3b96EY+bPn59y+/Pnz08Yk/x15s2bp8rKyviYZJs3b47vyff5fDr77LOz+ZaLQ1fXaPE+LGXXSZmFSAAAAABAscp5QX/8+HF9/vOf13e+8x3NmTNn3HFOUoCBMSblWLLkMenGn8mYse68806Fw+H45fjx4xOeU1EJBu2+kjFSciHLLEQCAAAAAIpVzgv6/fv364033tDFF1+siooKVVRUaO/evfr7v/97VVRUxGfMk2fI33jjjfjHFi5cqGg0qhMnTkw45te//nXK13/zzTcTxiR/nRMnTmhgYCBl5n7E7NmzNXfu3IRLyfD7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8xsdPHiw6N+vquivwLj7/e9/r9HRUc2ePTvp+dmzZ+vo0aMlOipMFcYY3XHHHbryyiu1cOFCSYqfd5nOyUOHDsXXVFdXa8aMGWlrYl9/9OhRzZo1K+1nzpo1K2lN6s+ZMWOGqqurOf+R0YMPPqjnn39ezz77bNprnLsoV//7v/+rb3/727rjjjv0D//wD3rmmWd02223qaamRh//+Mc5d1G27rzzToXDYV166aXyer0aHR3Vl770Jd1www2S+LuL8ldu5+jRo0d18cUXp/2c2Gvz5s0r6vcjoC8jlmUlfW6MSXsOGG/r16/XSy+9pCeffDLttbGck6lrMq0fyxpAko4cOaLbb79djz32mM4///ys6zh3UW6i0aguu+wyffnLX5YkvfOd79Qvf/lLffvb39bHP/7x+DrOXZSb733ve7r//vv1ne98R3/2Z3+mF198URs3btTcuXPV3t4eX8e5i3JXTudopmPJ9rX5sOW+DMycOVNerzftzuJrr72WdocHGE8bNmzQo48+qv7+fvn9/vjzc+bMkaSc5+ScOXM0PDys48eP51zz29/+Nu3n/u53v0tak/pzjh8/rtOnT3P+I83u3bv12muvadGiRaqqqlJVVZV27typf/u3f1NVVVXSHe5EnLsotbe+9a1629velvTcggULdPjwYUn83UX5+sxnPqO77rpL119/vd7+9rdr5cqV+tu//Vt1dXVJ4txF+Su3czTTmtdee01S+i6CQhDQl4Hq6motWrRIO3bsSHp+x44des973lOio0IlM8Zo/fr1euSRR/T444+nbe2ZN2+e5syZk3RODg8Pa+fOnfFzctGiRTrvvPOS1rz66qvau3dvfM2SJUsUDof1zDPPxNf84he/UDgcTlqzd+9evfrqq/E1jz32mGpqarRo0aLx/+Xhau9973u1Z88evfjii/HHZZddpptuukkvvviimpqaOHdRlpYuXZo2HvSVV15RIBCQxN9dlK8//vGP8niSQwav1xsfW8e5i3JXbufokiVL9LOf/SxplN1jjz2muXPnpm3FL0jRbfQwIWJj60KhkNm3b5/ZuHGjqa+vNwcPHiz1oaECrVu3zvh8PvPf//3f5tVXX40//vjHP8bXfOUrXzE+n8888sgjZs+ePeaGG27ION7D7/ebn/zkJ+b55583K1asyDje4x3veId5+umnzdNPP23e/va3Zxzv8d73vtc8//zz5ic/+Ynx+/2MoEHBErvcG8O5i/L0zDPPmKqqKvOlL33JDAwMmAceeMDU1dWZ+++/P76GcxflqL293TQ2NsbH1j3yyCNm5syZ5u///u/jazh3UWpvvPGGeeGFF8wLL7xgJJmvf/3r5oUXXoiPAC+nc/T11183s2fPNjfccIPZs2ePeeSRR8z06dMZW1cJvvWtb5lAIGCqq6vNu971rvgIMWC8Scr42Lp1a3xNNBo1n/vc58ycOXNMTU2NWbZsmdmzZ0/S9zl16pRZv369ueCCC0xtba257rrrzOHDh5PW/OEPfzA33XSTmTZtmpk2bZq56aabzPHjx5PWHDp0yFx77bWmtrbWXHDBBWb9+vVJozyAXFIDes5dlKv//M//NAsXLjQ1NTXm0ksvNb29vUmvc+6iHJ04ccLcfvvt5qKLLjLnn3++aWpqMp/97GfN0NBQfA3nLkqtv78/47Vte3u7Mab8ztGXXnrJXHXVVaampsbMmTPHfP7znx/TyDpjjLGMOVOBDwAAAAAAXIMaegAAAAAAXIiAHgAAAAAAFyKgBwAAAADAhQjoAQAAAABwIQJ6AAAAAABciIAeAAAAAAAXIqAHAAAAAMCFCOgBAAAAAHAhAnoAAAAAAFyIgB4AAAAAABcioAcAAAAAwIX+f0S/Sw2NeOhkAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "((x1, y1), (x2, y2)) = biggest_rectangle(red_tiles, find_2_corners(red_tiles))\n", "\n", "plot_tiles(breadcrumbs(red_tiles), figsize=(12, 12))\n", "plt.plot([x1, x1, x2, x2, x1], [y1, y2, y2, y1, y1], 'b:');" ] }, { "cell_type": "markdown", "id": "d7016370-a8b6-4d7a-9787-70a50b3207b9", "metadata": {}, "source": [ "We see that if the upper-left corner of the blue rectangle were any higher, then there would be red (and white) tiles in the upper-right corner of the rectangle. If the upper-left corner of the blue rectangle were any further southwest that would be ok, but would result in a slightly smaller area. You'll just have to take it for granted that all the possible rectangles formed below the equater lines are also a little bit smaller in area.\n", "\n", "What if we didn't rely on the second corner being an equatorial point? Would the answer be the same? Would it be a lot slower? Let's check:" ] }, { "cell_type": "code", "execution_count": 94, "id": "d3b44691-da52-4794-ab77-bc4326aa6ca2", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 1.56 s, sys: 4.09 ms, total: 1.56 s\n", "Wall time: 1.56 s\n" ] }, { "data": { "text/plain": [ "True" ] }, "execution_count": 94, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%time tile_area(biggest_rectangle(red_tiles, red_tiles)) == tile_area(biggest_rectangle(red_tiles, find_2_corners(red_tiles)))" ] }, { "cell_type": "markdown", "id": "b4e35203-687a-434e-88f5-0afea9f31c57", "metadata": {}, "source": [ "Yes, it finds the same maximal-area rectangle, but it takes a lot longer to find it.\n", "\n", "**Three final remarks**:\n", "1) This was the first puzzle of the year that was **difficult**; we had to work to find an efficient solution.\n", "2) My solution is **unsatisfying** in that it works for *my* input, and I strongly suspect that it would work for *your* input, because Eric Wastl probably created them all to be similar. But it does not work on every possible input allowed by the rules. \n", "3) In retrospect, I could have done the standard edge-edge intersection algorithm for determining if the rectangle intersects the polygon formed by the red tiles. I was scared away from that because the geometry is tricky for general polygon intersection, when the edges can have any slope. But the geometry is actually easy when all lines are axis-aligned." ] }, { "cell_type": "markdown", "id": "555e1ce1-9cf2-4f74-b5f4-9f94fb9ddaa0", "metadata": {}, "source": [ "# [Day 10](https://adventofcode.com/2025/day/10): Factory\n", "\n", "Today we find the machines in the factory are offline. Each machine has some lights, some buttons that can be pressed, and a joltage requirement for each light. For example, the machine described by:\n", "\n", " [.##.] (3) (1,3) (2) (2,3) (0,2) (0,1) {3,5,4,7}\n", "\n", "has four lights, and the goal configuration `.##.` means that the second and third light should be on and the others off. There are six buttons (each delimited by parentheses): the first button toggles light number 3, the second toggles lights 1 and 3, and so on. (The machine uses 0-based indexing, so light number 3 is the fourth light.) Finally, the joltage requirements for the four lights are `3,5,4,7`. We can parse the input lines into machine descriptions like this:" ] }, { "cell_type": "code", "execution_count": 69, "id": "84cd63a7-4d50-4f14-9807-3cb439f80c88", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "────────────────────────────────────────────────────────────────────────────────────────────────────\n", "Puzzle input ➜ 165 strs of size 30 to 209:\n", "────────────────────────────────────────────────────────────────────────────────────────────────────\n", "[.##....#..] (0,1,3,4,5,6,7,8,9) (0,1,2,4,5,6,7,8,9) (0,1,2,4,6,7,9) (1,2,3,5,7,8,9) (1,3,8) (7) ...\n", "[..#.....#] (0,2,4,6,7) (0,4,6,7) (0,1,2,5,7,8) (0,3,5,8) (0,1,2,3,4,7,8) (3,5,7) (3,6) (0,1,2,3 ...\n", "[.#....###] (4,7) (2,6,7,8) (0,1,2,4,6,7,8) (0,5) (5,8) (1,4,5) (0,2,3,5,6) (2,4,5,8) (2,3) (0,6 ...\n", "[.###.##.##] (1,3,4,6,7,8) (0,1,2,4,8) (1,2,5,6,8,9) (3) (0,2,4,8) (1,4,5,6) (2,4,6,8,9) (0,1,3, ...\n", "[#.##..###.] (2,3,5,7,8) (4,5) (0,1,2,4,5,7) (2,6,7) (2,3,4,5,6,7,8,9) (0,3,5,6,8,9) (0,1,2,3,5, ...\n", "[#....] (0,2,3) (0,2,3,4) (2,3) (0,1,2) (0,3,4) (3) (1,2) {75,18,60,71,39}\n", "[##.##..] (1,2,3,4,6) (2,4) (0,1,3,5) (0,2,3,5) (0,1,3,4) {14,25,30,34,25,10,20}\n", "[...#.#] (0) (1,4) (3,5) (2,4) (0,1,2,3) (1,2) (0,1,2,4) {50,56,62,34,48,17}\n", "...\n", "────────────────────────────────────────────────────────────────────────────────────────────────────\n", "Parsed representation ➜ 165 tuples of size 3:\n", "────────────────────────────────────────────────────────────────────────────────────────────────────\n", "('.##....#..', ((0, 1, 3, 4, 5, 6, 7, 8, 9), (0, 1, 2, 4, 5, 6, 7, 8, 9), (0, 1, 2, 4, 6, 7, 9), ...\n", "('..#.....#', ((0, 2, 4, 6, 7), (0, 4, 6, 7), (0, 1, 2, 5, 7, 8), (0, 3, 5, 8), (0, 1, 2, 3, 4, ...\n", "('.#....###', ((4, 7), (2, 6, 7, 8), (0, 1, 2, 4, 6, 7, 8), (0, 5), (5, 8), (1, 4, 5), (0, 2, 3, ...\n", "('.###.##.##', ((1, 3, 4, 6, 7, 8), (0, 1, 2, 4, 8), (1, 2, 5, 6, 8, 9), (3,), (0, 2, 4, 8), (1, ...\n", "('#.##..###.', ((2, 3, 5, 7, 8), (4, 5), (0, 1, 2, 4, 5, 7), (2, 6, 7), (2, 3, 4, 5, 6, 7, 8, 9) ...\n", "('#....', ((0, 2, 3), (0, 2, 3, 4), (2, 3), (0, 1, 2), (0, 3, 4), (3,), (1, 2)), (75, 18, 60, 71 ...\n", "('##.##..', ((1, 2, 3, 4, 6), (2, 4), (0, 1, 3, 5), (0, 2, 3, 5), (0, 1, 3, 4)), (14, 25, 30, 34 ...\n", "('...#.#', ((0,), (1, 4), (3, 5), (2, 4), (0, 1, 2, 3), (1, 2), (0, 1, 2, 4)), (50, 56, 62, 34, ...\n", "...\n" ] } ], "source": [ "def parse_machine(line: str) -> tuple:\n", " \"\"\"Parse a line into lights, buttons, joltage.\"\"\"\n", " lights, *buttons, joltage = line.split()\n", " return lights[1:-1], mapt(ints, buttons), ints(joltage) \n", " \n", "machines = parse(10, parse_machine)" ] }, { "cell_type": "markdown", "id": "d5d91403-5dc4-4fb5-be36-58a1e45e9eab", "metadata": {}, "source": [ "\n", "\n", "### Part 1: What is the fewest button presses to configure the lights on all the machines?\n", "\n", "The lights are initially all off, and we want to get them to the goal configuration with the minimum number of button presses. It makes no sense to press any button twice; that just toggles lights on and off and we end up where we started. So we want to find the smallest subset of buttons that when pressed gives the goal light configuration. The function `powerset` (from the [itertools recipes](https://docs.python.org/3/library/itertools.html#itertools-recipes)) yields subsets in smallest first order, so just look for the first subset of the buttons that toggles every light the proper odd/even number of times. " ] }, { "cell_type": "code", "execution_count": 70, "id": "179e62b1-e4cb-43e4-8dc7-b87a28d21e8d", "metadata": {}, "outputs": [], "source": [ "def minimal_button_presses(machine) -> int:\n", " \"\"\"How many button presses to configure lights on this machine?\n", " First try all ways of pressing 1 button, then all ways of pressing 2 buttons, ...\n", " Return as soon as one way matches the goal configuration of lights.\"\"\"\n", " lights, buttons, joltage = machine\n", " goal = [\".#\".index(ch) for ch in lights] # i.e., lights = \".##.\" ⇒ goal = (0, 1, 1, 0)\n", " for pressed in powerset(buttons):\n", " # Check that total presses for each light mod 2 is equal to goal for that light\n", " presses = Counter(flatten(pressed))\n", " if all(presses[light] % 2 == on_or_off for (light, on_or_off) in enumerate(goal)):\n", " return len(pressed)\n", " return inf # Couldn't solve; return infinity" ] }, { "cell_type": "code", "execution_count": 71, "id": "d1368c2f-d792-4353-82e7-b0161ece784f", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Puzzle 10.1: .0569 seconds, answer 441 correct" ] }, "execution_count": 71, "metadata": {}, "output_type": "execute_result" } ], "source": [ "answer(10.1, 441, lambda:\n", " sum(map(minimal_button_presses, machines)))" ] }, { "cell_type": "markdown", "id": "ecd76248-e224-44fb-91cf-e843a0f4f8f3", "metadata": {}, "source": [ "### Part 2: What is the fewest button presses to configure the joltage levels on all the machines?\n", "\n", "In Part 2 we move a lever, and now the function of the buttons changes: they control the joltage levels of the lights, not the lights themselves. The joltage levels all start at zero. Pressing the button `(2, 3)` increments the joltage level of lights numbered 2 and 3 by one unit each. Our task is to get the joltage levels all exactly to the target levels in the minimum number of presses.\n", "\n", "My first thought when reading the puzzle description was \"*This is an [**integer linear programming**](https://en.wikipedia.org/wiki/Integer_programming) problem.*\" My thought was confirmed by the instructions that said \"*You have to push each button an integer number of times; there's no such thing as 0.5 presses (nor can you push a button a negative number of times),*\" because having fractional or negative results is exactly what you might get from linear programming (you have to take extra steps to constrain the results to be non-negative and to be integers).\n", "\n", "Still, I was reluctant to use an integer linear programming package; that would mean that someone else is writing most of the code. This could also be seen as a search problem; I started programming an A* search solution, but it was way too slow. Why is it slow? Let's investigate. First, the number of buttons per machine is not too bad:" ] }, { "cell_type": "code", "execution_count": 72, "id": "1d2683fa-5126-4d2a-9dad-6a0e155f3449", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "7.181818181818182" ] }, "execution_count": 72, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mean(len(buttons) for (_, buttons, _) in machines)" ] }, { "cell_type": "markdown", "id": "d7776686-d2a6-4645-b46b-86a7187ff6b5", "metadata": {}, "source": [ "The showstopper is the expected number of button presses per machine (total joltage requirements divided by average joltage added by each button press):" ] }, { "cell_type": "code", "execution_count": 73, "id": "a714c2c2-d433-41d0-8d1e-01832b35a1a9", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "114.81498043610085" ] }, "execution_count": 73, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mean(sum(joltage) / mean(map(len, buttons)) for (_, buttons, joltage) in machines)" ] }, { "cell_type": "markdown", "id": "fcbf4426-ce35-4270-aa51-7fcacdf86e24", "metadata": {}, "source": [ "That means a completely naive search would have to consider about 7115 possible button press sequences. Of course we can take advantage of the structure of the problem to make some optimizations to the search:\n", "1) Many joltage states will be repeated; we can cache them.\n", "2) Button presses are commutative; we can impose a canonical ordering.\n", "3) We can keep track of the best solution found so far and eliminate states that can't reach the goal in that number of presses.\n", "4) Some actions will be forced: if there is only one button that increments a given light, we *must* press it until the light hits its goal.\n", "5) If there are only two buttons that increment a given light, then the total presses of those two buttons must equal the joltage requirement for that light.\n", "6) And if there are three buttons that increment a given light, maybe we can somehow eliminate one button to get to two, and then to one.\n", "7) Come to think of it, that process of button elimination already has a name: [Gaussian elimination](https://en.wikipedia.org/wiki/Gaussian_elimination). Reluctantly, I will give in to the power of linear programming.\n", "\n", "A linear programming solver finds a solution **x** to the equation **A** **x** = **b** that minimizes the dot product **c** · **x**, where **A** is a two-dimensional matrix and the other variables are one-dimensional vectors.\n", "\n", "For our problem we have:\n", "- **b** is the vector of joltage requirements for each light,\n", "- **c** says how much it costs to press each button, which is one press each so **c** is a vector of all ones,\n", "- **A** is a matrix where **A***i,j* says how much button *j* increments joltage *i* (either 0 or 1),\n", "- **x** will be the solution returned by the solver: a vector of number-of-pushes for each button.\n", "\n", "\n", "\n", "\n", "\n", "I started researching integer programming packages that run in Python. [Z3](https://github.com/Z3Prover/z3) seems to be the most popular, but it is a separate step to install it. I know that I (and many other people) already have **scipy** installed, and the [**scipy.optimize**](https://docs.scipy.org/doc/scipy/tutorial/optimize.html) package contains the function [**milp**](https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.milp.html#scipy.optimize.milp), for \"mixed integer linear programming.\" The \"mixed\" part means that we can declare that some of the variables must be integers, while others can be continuous. (For our problem they will all be integers.)\n", "\n", "The arguments to **milp** are:\n", "- **c**: the cost vector (a 1 for every button in our problem),\n", "- **integrality**: indicates which variables must be integers (a 1 (True) for every button in our problem),\n", "- **constraints**: a linear constraint. I want to say **A** **x** = **b**, but in this package I have to say **lb** ≤ **A** **x** ≤ **ub**, where **lb** and **ub** are the lower and upper bounds on **b**. In our problem both **lb** and **ub** are the joltage requirements.\n", "\n", "If we give it the right inputs, **milp** will magically return a minimal-cost result for **x**. Here's how we get the data out of a `machine` and feed it to **milp**:" ] }, { "cell_type": "code", "execution_count": 74, "id": "713a1503-ae14-445f-91ea-714fcd618ad0", "metadata": {}, "outputs": [], "source": [ "from scipy.optimize import milp, LinearConstraint, Bounds\n", "import numpy as np\n", "\n", "def minimal_joltage_presses(machine) -> int:\n", " \"\"\"The minimal number of button presses to set the joltages on this machine.\"\"\"\n", " lights, buttons, joltage = machine\n", " A = T([[int(i in button) for i in range(len(lights))]\n", " for button in buttons])\n", " ones = [1] * len(buttons)\n", " result = milp(c=ones, \n", " integrality=ones,\n", " constraints=LinearConstraint(A, lb=joltage, ub=joltage))\n", " return round(sum(result.x))" ] }, { "cell_type": "markdown", "id": "6ceb9e41-4e5e-442a-b162-db3384b07728", "metadata": {}, "source": [ "I made a few mistakes in not understanding the parameters of **milp**, but eventually I got it right and I was absolutely ***amazed*** at the speed:" ] }, { "cell_type": "code", "execution_count": 75, "id": "46d0d274-bd4c-44af-83e9-35c791a8e96b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Puzzle 10.2: .1128 seconds, answer 18559 correct" ] }, "execution_count": 75, "metadata": {}, "output_type": "execute_result" } ], "source": [ "answer(10.2, 18559, lambda:\n", " sum(map(minimal_joltage_presses, machines)))" ] }, { "cell_type": "markdown", "id": "6be27520-1a83-42c9-841c-deb3f6422b4e", "metadata": {}, "source": [ "**This felt like cheating!** I only wrote a few lines of code, and **milp** did the rest. My main contribution was just recognizing that this was an integer programming problem.\n", "\n", "At least I can do a bit of analysis. One thing I was interested in: a system of linear equations can be determined, underdetermined, or overdetermined:\n", "- **Determined**: Same number of equations as variables (same number of buttons as lights); one unique solution.\n", "- **Underdetermined**: Fewer equations than variables (fewer buttons than lights); usually multiple solutions; we want the minimal one.\n", "- **Overdetermined**: More equations than variables (more buttons than lights); no exact solutions unless you are lucky (but for this puzzle Eric Wastl can make sure we are lucky every time).\n", "\n", "How under- or over-determined are the equations for our machines?" ] }, { "cell_type": "code", "execution_count": 76, "id": "b9f82fef-612b-48a5-9de1-6ff0b137f7fb", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Counter({-1: 68, 1: 65, 0: 32})" ] }, "execution_count": 76, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Counter(sign(len(lights) - len(buttons)) for (lights, buttons, joltage) in machines)" ] }, { "cell_type": "markdown", "id": "a094063d-cd1d-446a-88c4-748d87506d92", "metadata": {}, "source": [ "This says that 32 machines are determined, 68 are underdetermined and 65 are overdetermined. By how much?" ] }, { "cell_type": "code", "execution_count": 77, "id": "e536441d-64d4-410d-bb40-2343f6e01d88", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Counter({-1: 32, -2: 31, 1: 34, 2: 31, 0: 32, -3: 5})" ] }, "execution_count": 77, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Counter(len(lights) - len(buttons) for (lights, buttons, joltage) in machines)" ] }, { "cell_type": "markdown", "id": "541e9ab9-fdcd-4a06-be5a-3f6bac052652", "metadata": {}, "source": [ "Most by only 1 or two variables, but `(-3, 5)` means that 5 of the machines are underdetermined by 3 variables. Most of the time taken by **milp** must have been in searching for a minimal solution to these underdetermined cases." ] }, { "cell_type": "markdown", "id": "6ff8655e-d1cc-4524-b207-c1e425b2a408", "metadata": {}, "source": [ "Here are some tests on smaller machines that I used when I was unsure where my mistakes with **milp** were:" ] }, { "cell_type": "code", "execution_count": 78, "id": "b72544c8-6069-4310-a6dc-b4acd77981b4", "metadata": {}, "outputs": [], "source": [ "machine1 = parse_machine('[.##.] (3) (1,3) (2) (2,3) (0,2) (0,1) {3,5,4,7}')\n", "machine2 = parse_machine('[...#.] (0,2,3,4) (2,3) (0,4) (0,1,2) (1,2,3,4) {7,5,12,7,2}')\n", "\n", "assert 2 == minimal_button_presses(machine1)\n", "assert 3 == minimal_button_presses(machine2)\n", "\n", "assert 10 == minimal_joltage_presses(machine1)\n", "assert 12 == minimal_joltage_presses(machine2)" ] }, { "cell_type": "markdown", "id": "2e4af311-07cb-4777-ad81-7973ba5a3633", "metadata": {}, "source": [ "# [Day 11](https://adventofcode.com/2025/day/11): Reactor\n", "\n", "There are a bunch of servers here in the reactor room. Today's input consists of a list of device connectivity specifications; the line \"`wfc: ond mpw vsz`\" means that device `wfc` outputs to 3 devices, `ond`, `mpw`, and `vsz`. I'll capture the data like this:" ] }, { "cell_type": "code", "execution_count": 79, "id": "11e17f6a-acba-44c4-b704-7e4ff7471e7e", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "────────────────────────────────────────────────────────────────────────────────────────────────────\n", "Puzzle input ➜ 643 strs of size 8 to 104:\n", "────────────────────────────────────────────────────────────────────────────────────────────────────\n", "wfc: ond mpw vsz\n", "qxn: mow khk\n", "nzf: rti sqv\n", "ehm: von pgy fxk\n", "nlt: pdl hwf\n", "xqa: qvc cih\n", "ghq: ren\n", "jze: gbj\n", "...\n", "────────────────────────────────────────────────────────────────────────────────────────────────────\n", "Parsed representation ➜ 643 tuples of size 2 to 26:\n", "────────────────────────────────────────────────────────────────────────────────────────────────────\n", "('wfc', 'ond', 'mpw', 'vsz')\n", "('qxn', 'mow', 'khk')\n", "('nzf', 'rti', 'sqv')\n", "('ehm', 'von', 'pgy', 'fxk')\n", "('nlt', 'pdl', 'hwf')\n", "('xqa', 'qvc', 'cih')\n", "('ghq', 'ren')\n", "('jze', 'gbj')\n", "...\n" ] } ], "source": [ "devices = parse(11, atoms)" ] }, { "cell_type": "markdown", "id": "0ab28991-5875-4d2d-b6c5-eeef20ea8f81", "metadata": {}, "source": [ "### Part 1: How many different paths lead from you to out?\n", "\n", "We are asked how many distinct output paths there are from the device named `'you'` to the device named `'out'`. It is a simple recursive count, but I'll make two optimizations:\n", "- I'll convert the list of devices into a `dict`, for *O*(1) lookup instead of *O*(*n*).\n", "- It is likely that multiple paths will lead to the same intermediate devices, so I should memoize the counting function. (Note that a `dict` is not hashable and thus can't be in a `@cache`, so I make an inner function, `count`, and decorate that.)" ] }, { "cell_type": "code", "execution_count": 80, "id": "7540a982-988a-4822-af0d-6581f6f848c6", "metadata": {}, "outputs": [], "source": [ "def count_paths(devices, start='you', end='out'):\n", " \"\"\"How many distinct paths are there from start to end?\"\"\"\n", " lookup_table = {device: outputs for (device, *outputs) in devices}\n", " @cache\n", " def count(here, there) -> int:\n", " if here == there:\n", " return 1\n", " else:\n", " return sum(count(mid, there) for mid in lookup_table[here])\n", " return count(start, end)" ] }, { "cell_type": "markdown", "id": "95f75267-37e0-4ab4-949d-73956ea0450a", "metadata": {}, "source": [ "All very straightforward." ] }, { "cell_type": "code", "execution_count": 81, "id": "0c2d68a5-843b-49d6-aff6-23045968207f", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Puzzle 11.1: .0003 seconds, answer 574 correct" ] }, "execution_count": 81, "metadata": {}, "output_type": "execute_result" } ], "source": [ "answer(11.1, 574, lambda:\n", " count_paths(devices))" ] }, { "cell_type": "markdown", "id": "fdfb6e5a-99e5-4bcd-b31b-6dc051bca4c9", "metadata": {}, "source": [ "### Part 2: How many paths from svr to out visit both dac and fft?\n", "\n", "Now we are asked for a count of the paths from a different start device, `svr`, to the end device `out`, but the paths are constrained to visit some other devices along the way. That's easy; copy the structure from Part 1, but keep track of what other devices we still need to visit:" ] }, { "cell_type": "code", "execution_count": 82, "id": "0294e044-c7ef-418a-9c02-71615a453002", "metadata": {}, "outputs": [], "source": [ "def count_constrained_paths(devices, start='svr', end='out', others=frozenset({'dac', 'fft'})):\n", " \"\"\"How many distinct paths are there from start to end, visiting all the others?\"\"\"\n", " lookup_table = {device: outputs for (device, *outputs) in devices}\n", " @cache\n", " def count(here, there, others) -> int:\n", " others -= {here}\n", " if here == there:\n", " return (1 if not others else 0)\n", " else:\n", " return sum(count(mid, there, others) for mid in lookup_table[here])\n", " return count(start, end, others)" ] }, { "cell_type": "code", "execution_count": 83, "id": "677a97b3-183b-474e-87ba-7db0d6b763d8", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Puzzle 11.2: .0016 seconds, answer 306594217920240 correct" ] }, "execution_count": 83, "metadata": {}, "output_type": "execute_result" } ], "source": [ "answer(11.2, 306594217920240, lambda:\n", " count_constrained_paths(devices))" ] }, { "cell_type": "markdown", "id": "dc115ac2-5357-499d-8917-3fff29f4063b", "metadata": {}, "source": [ "# [Day 12](https://adventofcode.com/2025/day/12): Christmas Tree Farm \n", "\n", "On the twelfth day, we're in a cavern full of Christmas trees and the elves would like help arranging presents under the trees. The day's input is in two sections. The first section is a list of 6 present shapes, each annotated with their shape ID. Every present shape fits in a 3x3 grid, but they are odd shapes so some shapes could be squished closer together. The second section is a list of regions, where each region has a width and length, and a desired number of presents of each shape to fit, in shape-ID order. Each shape is a separate paragraph, but the regions are all in on paragraph, so I can parse them like this:" ] }, { "cell_type": "code", "execution_count": 84, "id": "a1b304e8-339e-4e32-a462-3ba88103c415", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "────────────────────────────────────────────────────────────────────────────────────────────────────\n", "Puzzle input ➜ 1030 strs of size 0 to 24:\n", "────────────────────────────────────────────────────────────────────────────────────────────────────\n", "0:\n", "###\n", ".##\n", "##.\n", "\n", "1:\n", "##.\n", "##.\n", "###\n", "\n", "2:\n", "#..\n", "##.\n", "###\n", "\n", "3:\n", "###\n", "#.#\n", "#.#\n", "\n", "4:\n", "#.#\n", "###\n", "#.#\n", "\n", "5:\n", "##.\n", ".##\n", "..#\n", "\n", "45x41: 52 43 45 41 47 59\n", "45x41: 29 27 34 34 34 36\n", "41x37: 44 34 38 35 40 44\n", "...\n", "────────────────────────────────────────────────────────────────────────────────────────────────────\n", "Parsed representation ➜ 7 tuples of size 2 to 1000:\n", "────────────────────────────────────────────────────────────────────────────────────────────────────\n", "(0, ['###', '.##', '##.'])\n", "(1, ['##.', '##.', '###'])\n", "(2, ['#..', '##.', '###'])\n", "(3, ['###', '#.#', '#.#'])\n", "(4, ['#.#', '###', '#.#'])\n", "(5, ['##.', '.##', '..#'])\n", "((45, 41, [52, 43, 45, 41, 47, 59]), (45, 41, [29, 27, 34, 34, 34, 36]), (41, 37, [44, 34, 38, 3 ...\n" ] } ], "source": [ "def parse_presents(text: str):\n", " \"\"\"Parse either a single present (e.g. \"5: ###...\") or list of regions (e.g. \"12x5: 1 0 1 0 2 2\\n...\").\"\"\"\n", " if 'x' in text:\n", " return tuple((W, L, quantities) for (W, L, *quantities) in map(ints, text.splitlines()))\n", " else:\n", " id, *shape = text.splitlines()\n", " return (int(id[:-1]), shape)\n", " \n", "*shapes, regions = parse(12, parse_presents, paragraphs, show=33)" ] }, { "cell_type": "markdown", "id": "e735589a-634d-4ef9-b3b1-db9019aacf9d", "metadata": {}, "source": [ "### Part 1: How many of the regions can fit all of the presents listed?\n", "\n", "There have been Tetris-like puzzles in past AoC years. Is this another search problem? If so, will the searches be fast or slow? I want to get a feel for it. First, how many regions?" ] }, { "cell_type": "code", "execution_count": 85, "id": "194cbece-0104-4934-b335-13a4e7c720e0", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1000" ] }, "execution_count": 85, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(regions)" ] }, { "cell_type": "markdown", "id": "f579c5f1-f44c-4f9e-b6a9-5c75dbf20cfa", "metadata": {}, "source": [ "What's the average area of the regions?" ] }, { "cell_type": "code", "execution_count": 86, "id": "388d13ab-b5db-47e4-9f33-50f7062424b9", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1822.223" ] }, "execution_count": 86, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mean(W * L for (W, L, _) in regions)" ] }, { "cell_type": "markdown", "id": "cefca7b5-a9a2-4fb9-bd4b-071f7ecd5db0", "metadata": {}, "source": [ "And average total quantity of presents in a region?" ] }, { "cell_type": "code", "execution_count": 87, "id": "5d982737-cbca-4739-be1c-fa1dce319ef4", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "240.488" ] }, "execution_count": 87, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mean(sum(quantities) for (_, _, quantities) in regions)" ] }, { "cell_type": "markdown", "id": "af3fe830-aa75-469b-9046-3f36ff3a03e2", "metadata": {}, "source": [ "Next I want to get a feel for the variation in how tight the packing is. Each present can definitely fit into a 3x3 square, so what's the ratio of the total quantity of presents to the number of 3x3 squares? I'll make a histogram of that ratio for each region:" ] }, { "cell_type": "code", "execution_count": 88, "id": "b8cf45b6-5513-426a-86c2-425d0d74d781", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "def squares(width, length) -> int: \n", " \"Number of full 3x3 squares in a region.\"; \n", " return (width // 3) * (length // 3)\n", " \n", "occupancy_ratios = [sum(quantities) / squares(W, L) \n", " for (W, L, quantities) in regions]\n", "\n", "plt.hist(occupancy_ratios, bins=100);" ] }, { "cell_type": "markdown", "id": "54f2eaa0-b8b6-4a60-bcde-28eeefa26e8c", "metadata": {}, "source": [ "**Very interesting!** There's a real split. A lot of regions have an occupabncy ratio below 1.0 and thus are trivially easy to fit into the region, and the rest of the regions with occupancy ratios above 1.35 may well be impossible to fit. I say that because, just looking at the shapes, I estimate that the most you could overlap a shape onto another would be to save two \".\" squares; , so I could see getting to an occupancy rato of 1 + 2/9 = 1.22, but I don't think it is possible to get to 1.35. I can prove it is impossible to fit all the presents in a region if the total area of the solid parts of the presents (the '#' squares) is more than the area of the region (the width times length). \n", "\n", "I can do triage on the regions to classify each one as a trivial fit, an impossible fit, or uncertain:" ] }, { "cell_type": "code", "execution_count": 89, "id": "58b879f2-19ad-4e3f-a804-8c22151e5865", "metadata": {}, "outputs": [], "source": [ "shape_area = [cat(shape).count('#') for shape in shapes] # Total number of '#' in each shape\n", "\n", "def triage(region) -> str:\n", " \"\"\"Decide if a region's presents trivially fit, or are impossible to fit, or it is uncertain.\"\"\"\n", " width, length, quantities = region\n", " presents_area = sum(q * shape_area[i] for (i, q) in enumerate(quantities))\n", " if sum(quantities) <= squares(width, length):\n", " return 'fit' # The number of presents is no more than the number of 3x3 squares\n", " elif presents_area > width * length:\n", " return 'impossible' # The '#' area of all the presents is greater than the area of the region\n", " else:\n", " return 'uncertain' # We would need to do a search to see if the presents fit" ] }, { "cell_type": "markdown", "id": "9e85a2de-8e75-4be0-8324-de816df889fb", "metadata": {}, "source": [ "Here goes:" ] }, { "cell_type": "code", "execution_count": 90, "id": "6768fa83-2af7-4aab-a930-9106da3859bd", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Counter({'impossible': 546, 'fit': 454})" ] }, "execution_count": 90, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Counter(map(triage, regions))" ] }, { "cell_type": "markdown", "id": "cbedea21-3bed-4c99-9b57-fc1f1e03f76b", "metadata": {}, "source": [ "**There are no uncertain regions!** The problem is solved, and I didn't have to rotate a single present! Sometimes the real treasure is the code you don't have to write along the way." ] }, { "cell_type": "code", "execution_count": 91, "id": "0ec553c4-85eb-40a6-8bed-7adddf75e512", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Puzzle 12.1: .0018 seconds, answer 454 correct" ] }, "execution_count": 91, "metadata": {}, "output_type": "execute_result" } ], "source": [ "answer(12.1, 454, lambda:\n", " quantify(triage(region) == 'fit' for region in regions))" ] }, { "cell_type": "markdown", "id": "7f31ae9b-6606-40b0-9bb1-ed9b3fe3cbf0", "metadata": {}, "source": [ "# Summary\n", "\n", "Here are the run times and the correct answers for each of the puzzles:" ] }, { "cell_type": "code", "execution_count": 92, "id": "4d512a50-c6ae-4803-a787-b8f6e0103e31", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Puzzle 1.1: .0005 seconds, answer 1182 correct\n", "Puzzle 1.2: .0010 seconds, answer 6907 correct\n", "Puzzle 2.1: .0027 seconds, answer 23560874270 correct\n", "Puzzle 2.2: .0038 seconds, answer 44143124633 correct\n", "Puzzle 3.1: .0007 seconds, answer 17085 correct\n", "Puzzle 3.2: .0021 seconds, answer 169408143086082 correct\n", "Puzzle 4.1: .0572 seconds, answer 1569 correct\n", "Puzzle 4.2: .1461 seconds, answer 9280 correct\n", "Puzzle 5.1: .0123 seconds, answer 635 correct\n", "Puzzle 5.2: .0002 seconds, answer 369761800782619 correct\n", "Puzzle 6.1: .0025 seconds, answer 5877594983578 correct\n", "Puzzle 6.2: .0064 seconds, answer 11159825706149 correct\n", "Puzzle 7.1: .0007 seconds, answer 1681 correct\n", "Puzzle 7.2: .0014 seconds, answer 422102272495018 correct\n", "Puzzle 8.1: .6336 seconds, answer 24360 correct\n", "Puzzle 8.2: .6273 seconds, answer 2185817796 correct\n", "Puzzle 9.1: .0272 seconds, answer 4772103936 correct\n", "Puzzle 9.2: .0156 seconds, answer 1529675217 correct\n", "Puzzle 10.1: .0569 seconds, answer 441 correct\n", "Puzzle 10.2: .1128 seconds, answer 18559 correct\n", "Puzzle 11.1: .0003 seconds, answer 574 correct\n", "Puzzle 11.2: .0016 seconds, answer 306594217920240 correct\n", "Puzzle 12.1: .0018 seconds, answer 454 correct\n", "\n", "Time in seconds: sum = 1.715, mean = .075, median = .003, max = .634\n" ] } ], "source": [ "def summary(answers: dict):\n", " \"\"\"Summary report on the answers.\"\"\"\n", " for day in sorted(answers):\n", " print(answers[day])\n", " times = [answer.secs for answer in answers.values()]\n", " def stat(fn, times): return f'{fn.__name__} = {fn(times):.3f}'\n", " print('\\nTime in seconds:', ', '.join(_zap0(stat(fn, times)) for fn in (sum, mean, median, max)))\n", " \n", "summary(answers)" ] }, { "cell_type": "markdown", "id": "1098c017-2746-403c-bfb0-1a08cacc835d", "metadata": {}, "source": [ "I solved all the puzzles and they run in under 2 seconds of total run time. Happy Advent everyone, and thank you Eric for the interesting puzzles!\n", "\n", "

\n", "\n", "

\n", "\n", "\"Gary\n", "Gary Grady @GaryGrady\n" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.8.15" } }, "nbformat": 4, "nbformat_minor": 5 }