├── day06 ├── sample.txt ├── input.txt ├── answer_p1.sql └── answer_p2.sql ├── day07 ├── sample.txt ├── answer.sql └── input.txt ├── day02 ├── sample.txt ├── answer.sql └── input.txt ├── day04 ├── sample_numbers.txt ├── input_numbers.txt ├── sample_boards.txt ├── answer_p1.sql ├── answer_p2.sql └── input_boards.txt ├── day01 ├── sample.txt ├── answer.sql └── input.txt ├── nix ├── overlay.nix └── devshell.nix ├── day03 ├── sample.txt ├── answer.sql ├── answer_p2.sql └── input.txt ├── shell.nix ├── day05 ├── sample.txt ├── answer_p1.sql ├── answer_p2.sql └── input.txt ├── .envrc ├── Makefile ├── docker-compose.yml ├── flake.nix ├── flake.lock ├── LICENSE └── README.md /day06/sample.txt: -------------------------------------------------------------------------------- 1 | 3,4,3,1,2 2 | -------------------------------------------------------------------------------- /day07/sample.txt: -------------------------------------------------------------------------------- 1 | 16,1,2,0,4,2,7,1,2,14 2 | -------------------------------------------------------------------------------- /day02/sample.txt: -------------------------------------------------------------------------------- 1 | forward 5 2 | down 5 3 | forward 8 4 | up 3 5 | down 8 6 | forward 2 7 | -------------------------------------------------------------------------------- /day04/sample_numbers.txt: -------------------------------------------------------------------------------- 1 | 7,4,9,5,11,17,23,2,0,14,21,24,10,16,13,6,15,25,12,22,18,20,8,19,3,26,1 2 | -------------------------------------------------------------------------------- /day01/sample.txt: -------------------------------------------------------------------------------- 1 | 199 2 | 200 3 | 208 4 | 210 5 | 200 6 | 207 7 | 240 8 | 269 9 | 260 10 | 263 11 | -------------------------------------------------------------------------------- /nix/overlay.nix: -------------------------------------------------------------------------------- 1 | final: prev: { 2 | devShell = final.callPackage ./devshell.nix { }; 3 | 4 | postgresql = final.postgresql_14; 5 | } 6 | -------------------------------------------------------------------------------- /day03/sample.txt: -------------------------------------------------------------------------------- 1 | 00100 2 | 11110 3 | 10110 4 | 10111 5 | 10101 6 | 01111 7 | 00111 8 | 11100 9 | 10000 10 | 11001 11 | 00010 12 | 01010 13 | -------------------------------------------------------------------------------- /shell.nix: -------------------------------------------------------------------------------- 1 | ( 2 | import (fetchTarball https://github.com/edolstra/flake-compat/archive/master.tar.gz) { 3 | src = builtins.fetchGit ./.; 4 | } 5 | ).shellNix 6 | -------------------------------------------------------------------------------- /day05/sample.txt: -------------------------------------------------------------------------------- 1 | 0,9 -> 5,9 2 | 8,0 -> 0,8 3 | 9,4 -> 3,4 4 | 2,2 -> 2,1 5 | 7,0 -> 7,4 6 | 6,4 -> 2,0 7 | 0,9 -> 2,9 8 | 3,4 -> 1,4 9 | 0,0 -> 8,8 10 | 5,5 -> 8,2 11 | -------------------------------------------------------------------------------- /.envrc: -------------------------------------------------------------------------------- 1 | # If we are a computer with nix-shell available, then use that to setup 2 | # the build environment with exactly what we need. 3 | if has nix-shell; then 4 | use nix 5 | fi 6 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | .PHONY: psql 2 | psql: # Open psql shell to DB 3 | psql postgresql://dev:dev@localhost:5432/dev 4 | 5 | .PHONY: reset 6 | reset: # Reset the DB (deletes all data and schema) 7 | docker compose down 8 | docker compose up -d 9 | -------------------------------------------------------------------------------- /day04/input_numbers.txt: -------------------------------------------------------------------------------- 1 | 23,30,70,61,79,49,19,37,64,48,72,34,69,53,15,74,89,38,46,36,28,32,45,2,39,58,11,62,97,40,14,87,96,94,91,92,80,99,6,31,57,98,65,10,33,63,42,17,47,66,26,22,73,27,7,0,55,8,56,29,86,25,4,12,51,60,35,50,5,75,95,44,16,93,21,3,24,52,77,76,43,41,9,84,67,71,83,88,59,68,85,82,1,18,13,78,20,90,81,54 2 | -------------------------------------------------------------------------------- /day04/sample_boards.txt: -------------------------------------------------------------------------------- 1 | 22 13 17 11 0 2 | 8 2 23 4 24 3 | 21 9 14 16 7 4 | 6 10 3 18 5 5 | 1 12 20 15 19 6 | 7 | 3 15 0 2 22 8 | 9 18 13 17 5 9 | 19 8 7 25 23 10 | 20 11 10 24 4 11 | 14 21 16 12 6 12 | 13 | 14 21 17 24 4 14 | 10 16 15 9 19 15 | 18 8 23 26 20 16 | 22 11 13 6 5 17 | 2 0 12 3 7 18 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '2' 2 | services: 3 | postgres: 4 | image: "kartoza/postgis:14" 5 | ports: 6 | - "5432:5432" 7 | environment: 8 | - POSTGRES_DB=dev 9 | - POSTGRES_USER=dev 10 | - POSTGRES_PASS=dev 11 | - POSTGRES_HOST_AUTH_METHOD=trust 12 | -------------------------------------------------------------------------------- /nix/devshell.nix: -------------------------------------------------------------------------------- 1 | { postgresql 2 | , mkShell }: 3 | 4 | mkShell rec { 5 | name = "aoc"; 6 | 7 | packages = [ 8 | postgresql 9 | ]; 10 | 11 | # Extra env vars 12 | PGHOST = "localhost"; 13 | PGPORT = "5432"; 14 | PGDATABASE = "dev"; 15 | PGUSER = "postgres"; 16 | PGPASSWORD = "postgres"; 17 | DATABASE_URL = "postgresql://${PGUSER}:${PGPASSWORD}@${PGHOST}:${PGPORT}/${PGDATABASE}?sslmode=disable"; 18 | } 19 | -------------------------------------------------------------------------------- /day06/input.txt: -------------------------------------------------------------------------------- 1 | 1,1,1,2,1,1,2,1,1,1,5,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,4,1,1,1,1,3,1,1,3,1,1,1,4,1,5,1,3,1,1,1,1,1,5,1,1,1,1,1,5,5,2,5,1,1,2,1,1,1,1,3,4,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,5,4,1,1,1,1,1,5,1,2,4,1,1,1,1,1,3,3,2,1,1,4,1,1,5,5,1,1,1,1,1,2,5,1,4,1,1,1,1,1,1,2,1,1,5,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,3,1,1,3,1,3,1,4,1,5,4,1,1,2,1,1,5,1,1,1,1,1,5,1,1,1,1,1,1,1,1,1,4,1,1,4,1,1,1,1,1,1,1,5,4,1,2,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,4,1,1,1,2,1,4,1,1,1,1,1,1,1,1,1,4,2,1,2,1,1,4,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,3,2,1,4,1,5,1,1,1,4,5,1,1,1,1,1,1,5,1,1,5,1,2,1,1,2,4,1,1,2,1,5,5,3 2 | -------------------------------------------------------------------------------- /flake.nix: -------------------------------------------------------------------------------- 1 | { 2 | description = "Advent of Code 2021 PostgreSQL"; 3 | 4 | inputs.nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable"; 5 | inputs.flake-utils.url = "github:numtide/flake-utils"; 6 | 7 | outputs = { self, nixpkgs, flake-utils }: 8 | let 9 | localOverlay = import ./nix/overlay.nix; 10 | overlays = [ localOverlay ]; 11 | in flake-utils.lib.eachDefaultSystem (system: 12 | let 13 | pkgs = import nixpkgs { 14 | inherit system overlays; 15 | }; 16 | in { 17 | legacyPackages = pkgs; 18 | inherit (pkgs) devShell; 19 | }) // { 20 | # platform independent attrs 21 | overlay = final: prev: (nixpkgs.lib.composeManyExtensions overlays) final prev; 22 | inherit overlays; 23 | }; 24 | } 25 | -------------------------------------------------------------------------------- /day01/answer.sql: -------------------------------------------------------------------------------- 1 | -- Put everything in a schema so its easy to reset. This also makes 2 | -- this automatically reset so we can just run it many times. 3 | DROP SCHEMA IF EXISTS day01 CASCADE; 4 | CREATE SCHEMA day01; 5 | 6 | CREATE TABLE day01.inputs ( 7 | id SERIAL, 8 | value INTEGER NOT NULL, 9 | 10 | -- We expect this to be true for all inputs 11 | CHECK (value > 0) 12 | ); 13 | 14 | -- Use \COPY rather than COPY so its client-side in psql 15 | \COPY day01.inputs (value) FROM 'day01/input.txt' WITH (FORMAT 'text'); 16 | 17 | -- We use a CTE to store temporary data. A subquery would also work since 18 | -- we don't reference the CTE multiple times, but I find CTEs to be clearer. 19 | -- 20 | -- The lagdata table uses window functions to peek into the previous value 21 | -- (using `lag` by ID). We then just count the results that an increasing value. 22 | WITH lagdata AS ( 23 | SELECT value, 24 | lag(value) over (ORDER BY id) as prev 25 | FROM day01.inputs 26 | ORDER BY id 27 | OFFSET 1 28 | ) 29 | SELECT COUNT(*) 30 | FROM lagdata 31 | WHERE value > prev; 32 | -------------------------------------------------------------------------------- /day06/answer_p1.sql: -------------------------------------------------------------------------------- 1 | -- Put everything in a schema so its easy to reset. This also makes 2 | -- this automatically reset so we can just run it many times. 3 | DROP SCHEMA IF EXISTS day06 CASCADE; 4 | CREATE SCHEMA day06; 5 | 6 | -- Raw input 7 | CREATE TABLE day06.inputs ( 8 | line TEXT NOT NULL 9 | ); 10 | 11 | -- Use \COPY rather than COPY so its client-side in psql 12 | \COPY day06.inputs (line) FROM 'day06/input.txt'; 13 | 14 | WITH RECURSIVE initial AS ( 15 | SELECT timer::int 16 | FROM day06.inputs, 17 | LATERAL unnest(regexp_split_to_array(line, ',')) as timer 18 | ), spawn AS ( 19 | -- base case: our initial timers, and a countdown 20 | SELECT 80 as days_remaining, 21 | timer 22 | FROM initial 23 | 24 | UNION ALL 25 | 26 | -- recursive case: decrement timer, spawn 27 | -- terminating case: timer is 0 28 | 29 | SELECT days_remaining - 1, 30 | newtimer 31 | FROM spawn, 32 | LATERAL unnest(CASE 33 | WHEN timer = 0 THEN ARRAY[6,8] 34 | ELSE ARRAY[timer-1] 35 | END) as newtimer 36 | WHERE days_remaining > 0 37 | ) 38 | SELECT COUNT(*) 39 | FROM spawn 40 | WHERE days_remaining = 0; 41 | ; 42 | -------------------------------------------------------------------------------- /flake.lock: -------------------------------------------------------------------------------- 1 | { 2 | "nodes": { 3 | "flake-utils": { 4 | "locked": { 5 | "lastModified": 1638122382, 6 | "narHash": "sha256-sQzZzAbvKEqN9s0bzWuYmRaA03v40gaJ4+iL1LXjaeI=", 7 | "owner": "numtide", 8 | "repo": "flake-utils", 9 | "rev": "74f7e4319258e287b0f9cb95426c9853b282730b", 10 | "type": "github" 11 | }, 12 | "original": { 13 | "owner": "numtide", 14 | "repo": "flake-utils", 15 | "type": "github" 16 | } 17 | }, 18 | "nixpkgs": { 19 | "locked": { 20 | "lastModified": 1638397275, 21 | "narHash": "sha256-2Jos1CJFTMO9IbulbM4PTKn24nISIDQCAG/AqYQ8rmg=", 22 | "owner": "nixos", 23 | "repo": "nixpkgs", 24 | "rev": "391f93a83c3a486475d60eb4a569bb6afbf306ad", 25 | "type": "github" 26 | }, 27 | "original": { 28 | "owner": "nixos", 29 | "ref": "nixpkgs-unstable", 30 | "repo": "nixpkgs", 31 | "type": "github" 32 | } 33 | }, 34 | "root": { 35 | "inputs": { 36 | "flake-utils": "flake-utils", 37 | "nixpkgs": "nixpkgs" 38 | } 39 | } 40 | }, 41 | "root": "root", 42 | "version": 7 43 | } 44 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | This is free and unencumbered software released into the public domain. 2 | 3 | Anyone is free to copy, modify, publish, use, compile, sell, or 4 | distribute this software, either in source code form or as a compiled 5 | binary, for any purpose, commercial or non-commercial, and by any 6 | means. 7 | 8 | In jurisdictions that recognize copyright laws, the author or authors 9 | of this software dedicate any and all copyright interest in the 10 | software to the public domain. We make this dedication for the benefit 11 | of the public at large and to the detriment of our heirs and 12 | successors. We intend this dedication to be an overt act of 13 | relinquishment in perpetuity of all present and future rights to this 14 | software under copyright law. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 19 | IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR 20 | OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21 | ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 | OTHER DEALINGS IN THE SOFTWARE. 23 | 24 | For more information, please refer to 25 | -------------------------------------------------------------------------------- /day03/answer.sql: -------------------------------------------------------------------------------- 1 | -- Put everything in a schema so its easy to reset. This also makes 2 | -- this automatically reset so we can just run it many times. 3 | DROP SCHEMA IF EXISTS day03 CASCADE; 4 | CREATE SCHEMA day03; 5 | 6 | CREATE TABLE day03.inputs ( 7 | id SERIAL, 8 | value TEXT NOT NULL 9 | ); 10 | 11 | -- Use \COPY rather than COPY so its client-side in psql 12 | \COPY day03.inputs (value) FROM 'day03/sample.txt'; 13 | 14 | -- characters: split string into one row for each character 15 | -- common: use mode() aggregate to find most common value for each index 16 | -- result: combine most common values, convert to binary, convert to int 17 | -- to find epsilon, I pad with 1 and then bit flip to get the least common. 18 | \echo 'PART 1 RESULTS'; 19 | WITH characters AS ( 20 | SELECT id, 21 | char, 22 | index 23 | FROM day03.inputs, 24 | LATERAL unnest(regexp_split_to_array(value, '')) 25 | WITH ORDINALITY 26 | AS t(char, index) 27 | ), common AS ( 28 | SELECT c.index, mode() WITHIN GROUP (ORDER BY c.char) as char 29 | FROM characters c 30 | GROUP BY c.index 31 | ), result AS ( 32 | SELECT string_agg(char, '') as string, 33 | lpad(string_agg(char, ''), 32, '0')::bit(32)::int as gamma, 34 | (~ lpad(string_agg(char, ''), 32, '1')::bit(32))::int as epsilon 35 | FROM common 36 | ) 37 | SELECT gamma, epsilon, gamma * epsilon as answer 38 | FROM result; 39 | -------------------------------------------------------------------------------- /day05/answer_p1.sql: -------------------------------------------------------------------------------- 1 | -- Put everything in a schema so its easy to reset. This also makes 2 | -- this automatically reset so we can just run it many times. 3 | DROP SCHEMA IF EXISTS day05 CASCADE; 4 | CREATE SCHEMA day05; 5 | 6 | -- Both input_* tables are /raw/ input tables. These are formatted 7 | -- so we can do a raw, unprocessed copy directly from the input files. 8 | CREATE TABLE day05.inputs ( 9 | id SERIAL, 10 | points1 TEXT NOT NULL, 11 | arrow TEXT NOT NULL, 12 | points2 TEXT NOT NULL 13 | ); 14 | 15 | -- Use \COPY rather than COPY so its client-side in psql 16 | \COPY day05.inputs (points1, arrow, points2) FROM 'day05/input.txt' WITH (DELIMITER ' '); 17 | 18 | WITH points AS ( 19 | -- raw input to real points 20 | SELECT id, 21 | ST_MakePoint(p1[1]::int, p1[2]::int) as point1, 22 | ST_MakePoint(p2[1]::int, p2[2]::int) as point2 23 | FROM day05.inputs, 24 | LATERAL regexp_split_to_array(points1, ',') as p1, 25 | LATERAL regexp_split_to_array(points2, ',') as p2 26 | ), lines AS ( 27 | -- all our lines from points 28 | SELECT id, ST_MakeLine(point1, point2) as line 29 | FROM points 30 | ), all_points AS ( 31 | SELECT l.id, geom 32 | FROM lines l, 33 | LATERAL ST_DumpPoints(ST_Segmentize(l.line, 1)) as t(path, geom), 34 | points p 35 | WHERE p.id = l.id AND ( 36 | ST_X(p.point1) = ST_X(p.point2) OR 37 | ST_Y(p.point1) = ST_Y(p.point2) 38 | ) 39 | ), overlapping_points AS ( 40 | SELECT p1.geom, COUNT(*) 41 | FROM all_points p1 42 | JOIN all_points p2 ON p1.id <> p2.id AND p1.geom = p2.geom 43 | GROUP BY p1.geom 44 | ) 45 | SELECT COUNT(*) FROM overlapping_points; 46 | -------------------------------------------------------------------------------- /day05/answer_p2.sql: -------------------------------------------------------------------------------- 1 | -- Put everything in a schema so its easy to reset. This also makes 2 | -- this automatically reset so we can just run it many times. 3 | DROP SCHEMA IF EXISTS day05 CASCADE; 4 | CREATE SCHEMA day05; 5 | 6 | -- Both input_* tables are /raw/ input tables. These are formatted 7 | -- so we can do a raw, unprocessed copy directly from the input files. 8 | CREATE TABLE day05.inputs ( 9 | id SERIAL, 10 | points1 TEXT NOT NULL, 11 | arrow TEXT NOT NULL, 12 | points2 TEXT NOT NULL 13 | ); 14 | 15 | -- Use \COPY rather than COPY so its client-side in psql 16 | \COPY day05.inputs (points1, arrow, points2) FROM 'day05/input.txt' WITH (DELIMITER ' '); 17 | 18 | WITH points AS ( 19 | -- raw input to real points 20 | SELECT id, 21 | ST_MakePoint(p1[1]::int, p1[2]::int) as point1, 22 | ST_MakePoint(p2[1]::int, p2[2]::int) as point2 23 | FROM day05.inputs, 24 | LATERAL regexp_split_to_array(points1, ',') as p1, 25 | LATERAL regexp_split_to_array(points2, ',') as p2 26 | ), lines AS ( 27 | -- all our lines from points 28 | SELECT id, 29 | ST_MakeLine(point1, point2) as line, 30 | (ST_X(point1) <> ST_X(point2) AND 31 | ST_Y(point1) <> ST_Y(point2)) as diag 32 | FROM points 33 | ), all_points AS ( 34 | SELECT l.id, geom 35 | FROM lines l, 36 | LATERAL ST_DumpPoints(ST_Segmentize( 37 | l.line, 38 | CASE WHEN l.diag THEN sqrt(2) ELSE 1 END 39 | )) as t(path, geom) 40 | ), overlapping_points AS ( 41 | SELECT p1.geom, COUNT(*) 42 | FROM all_points p1 43 | JOIN all_points p2 ON p1.id <> p2.id AND p1.geom = p2.geom 44 | GROUP BY p1.geom 45 | ) 46 | SELECT COUNT(*) FROM overlapping_points; 47 | -------------------------------------------------------------------------------- /day07/answer.sql: -------------------------------------------------------------------------------- 1 | -- Put everything in a schema so its easy to reset. This also makes 2 | -- this automatically reset so we can just run it many times. 3 | DROP SCHEMA IF EXISTS day07 CASCADE; 4 | CREATE SCHEMA day07; 5 | 6 | -- Raw input 7 | CREATE TABLE day07.inputs ( 8 | line TEXT NOT NULL 9 | ); 10 | 11 | -- Use \COPY rather than COPY so its client-side in psql 12 | \COPY day07.inputs (line) FROM 'day07/input.txt'; 13 | 14 | \echo 'PART 1 RESULTS'; 15 | WITH pos AS ( 16 | -- turn input into row-based ints 17 | SELECT x::int 18 | FROM day07.inputs, 19 | LATERAL regexp_split_to_table(line, ',') as x 20 | ), bounds AS ( 21 | -- find min/max place crabs can move 22 | SELECT min(x) as min_x, max(x) max_x 23 | FROM pos 24 | ), targets AS ( 25 | -- for each place they can move, find the fuel cost 26 | SELECT target, sum(abs(target - x)) as fuel 27 | FROM bounds, 28 | pos, 29 | LATERAL generate_series(min_x, max_x) as target 30 | GROUP BY target 31 | ) 32 | SELECT target, fuel as answer 33 | FROM targets 34 | ORDER BY fuel 35 | LIMIT 1; 36 | 37 | \echo 'PART 2 RESULTS'; 38 | WITH pos AS ( 39 | -- turn input into row-based ints 40 | SELECT x::int 41 | FROM day07.inputs, 42 | LATERAL regexp_split_to_table(line, ',') as x 43 | ), bounds AS ( 44 | -- find min/max place crabs can move 45 | SELECT min(x) as min_x, max(x) max_x 46 | FROM pos 47 | ), targets AS ( 48 | -- for each place they can move, find the distance 49 | SELECT target, abs(target - x) as distance 50 | FROM bounds, 51 | pos, 52 | LATERAL generate_series(min_x, max_x) as target 53 | ), fuel AS ( 54 | -- calculate fuel, n(n+1)/2 is formula for 1 + 2 + 3 ... + distance 55 | SELECT target, (distance * (distance + 1) / 2) as fuel 56 | FROM targets 57 | ) 58 | SELECT target, sum(fuel) as answer 59 | FROM fuel 60 | GROUP BY target 61 | ORDER BY answer 62 | LIMIT 1; 63 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Advent of Code 2021 with PostgreSQL 2 | 3 | This repository contains my solutions for [Advent of Code 2021](https://adventofcode.com/2021) 4 | using PostgreSQL-specific SQL. 5 | 6 | I'm not an expert at SQL (or PostgreSQL) by any means. One of the reasons I 7 | decided to use SQL was to regain some proficiency while also learning some 8 | new concepts. I expect that many of my solutions are suboptimal and there 9 | are likely much _better_ ways (by various definitions) to reach the same 10 | answer. I'd love to hear about those (make an issue) but I won't be merging 11 | any changes since this represents _my_ approach. 12 | 13 | **I may not finish!** December is a busy time, I'm doing these as I can, 14 | but I'm not making any commitment to finishing. If I don't finish, I'll 15 | hopefully retroactively solve the problems, but no promises. 😜 16 | 17 | ## Goals 18 | 19 | I had a set of goals with each problem: 20 | 21 | * Ingest input directly without any modification. 22 | 23 | * Arrive at the solution using a single SQL statement. No `UPDATE` queries 24 | to transform the data prior to the statement. Huge CTEs to simulate temporary 25 | tables is totally fine. 26 | 27 | * No custom functions (no plpgsql). It's too easy to think _iteratively_ with 28 | custom functions and one of my goals is to think _relationally_. 29 | 30 | * Timebox to 30 minutes per problem for both parts. 31 | 32 | If I was creeping up towards my timebox, I broke some of these rules in 33 | the interest of getting to an answer. However, I did my best to stick with 34 | the rules as well as possible. For example, in week 1, I achieved all of the 35 | above except I had to drop into plpgsql for 1 part of 1 problem (on day 3). 36 | 37 | ## Explanations 38 | 39 | I uploaded video explanations for each day I completed to YouTube: 40 | 41 | https://www.youtube.com/watch?v=aIVBYKk5adk&list=PL4z1WbdlT5GJqdGnuvoqw4dOdB2etJ6sd 42 | 43 | ## Usage 44 | 45 | Bring up the PostgreSQL database with `docker compose up -d`. 46 | 47 | Drop into a PostgreSQL console with `make`. 48 | 49 | Run the day: `\i day01/answer.sql;` 50 | 51 | -------------------------------------------------------------------------------- /day02/answer.sql: -------------------------------------------------------------------------------- 1 | -- Put everything in a schema so its easy to reset. This also makes 2 | -- this automatically reset so we can just run it many times. 3 | DROP SCHEMA IF EXISTS day02 CASCADE; 4 | CREATE SCHEMA day02; 5 | 6 | -- use an enum to validate the inputs 7 | CREATE TYPE day02.direction AS ENUM ( 8 | 'forward', 'down', 'up' 9 | ); 10 | 11 | CREATE TABLE day02.inputs ( 12 | id SERIAL, 13 | direction day02.direction NOT NULL, 14 | value INTEGER NOT NULL, 15 | 16 | -- We expect this to be true for all inputs 17 | CHECK (value > 0) 18 | ); 19 | 20 | -- Use \COPY rather than COPY so its client-side in psql 21 | \COPY day02.inputs (direction, value) FROM 'day02/input.txt' WITH (DELIMITER ' '); 22 | 23 | -- movement: calculate our sums of each movement direction individually 24 | -- position: use movement to calculate final position 25 | -- final: show the position and the answer by multiplying the results 26 | \echo 'PART 1 RESULTS'; 27 | WITH movement AS ( 28 | SELECT sum(value) FILTER (WHERE direction = 'forward') as forward, 29 | sum(value) FILTER (WHERE direction = 'down') as down, 30 | sum(value) FILTER (WHERE direction = 'up') as up 31 | FROM day02.inputs 32 | ), position AS ( 33 | SELECT forward as x, (down - up) as y 34 | FROM movement 35 | ) 36 | SELECT x, y, x * y as answer 37 | FROM position; 38 | 39 | -- movement: accumulate rolling sum of down/up alongside inputs 40 | -- aim: calculate aim at each point along with depth change (aim * x) 41 | -- position: sum our forward movement, sum our depths 42 | -- final: show results, multiply for desired input 43 | \echo 'PART 2 RESULTS'; 44 | WITH movement AS ( 45 | SELECT *, 46 | COALESCE(SUM(value) 47 | FILTER (WHERE direction = 'down') 48 | OVER (ORDER BY id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 0) 49 | AS down_acc, 50 | COALESCE(SUM(value) 51 | FILTER (WHERE direction = 'up') 52 | OVER (ORDER BY id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 0) 53 | AS up_acc 54 | FROM day02.inputs 55 | ORDER BY id 56 | ), 57 | aim AS ( 58 | SELECT id, direction, value, 59 | (down_acc - up_acc) as aim, 60 | (down_acc - up_acc) * value as depth_delta 61 | FROM movement 62 | WHERE direction = 'forward' 63 | ), 64 | position AS ( 65 | SELECT sum(value) as x, sum(depth_delta) as y 66 | FROM aim 67 | ) 68 | SELECT x, y, x * y as answer 69 | FROM position; 70 | -------------------------------------------------------------------------------- /day03/answer_p2.sql: -------------------------------------------------------------------------------- 1 | -- Put everything in a schema so its easy to reset. This also makes 2 | -- this automatically reset so we can just run it many times. 3 | DROP SCHEMA IF EXISTS day03 CASCADE; 4 | CREATE SCHEMA day03; 5 | 6 | CREATE TABLE day03.inputs ( 7 | id SERIAL, 8 | value TEXT NOT NULL 9 | ); 10 | 11 | -- Use \COPY rather than COPY so its client-side in psql 12 | \COPY day03.inputs (value) FROM 'day03/input.txt'; 13 | 14 | -- Break down our characters 15 | DROP TABLE IF EXISTS characters; 16 | CREATE TEMPORARY TABLE characters AS ( 17 | SELECT id, 18 | char, 19 | index 20 | FROM day03.inputs, 21 | LATERAL unnest(regexp_split_to_array(value, '')) 22 | WITH ORDINALITY 23 | AS t(char, index) 24 | ); 25 | 26 | -- decode decodes the input characters by looking for most common or 27 | -- least common next bits. acc is the current accumulation. Call this 28 | -- with an empty acc to start it'll return the result. 29 | CREATE OR REPLACE FUNCTION day03.decode(acc TEXT, most_common BOOL) 30 | RETURNS TEXT 31 | AS $$ 32 | DECLARE 33 | ids INTEGER[]; 34 | common TEXT; 35 | BEGIN 36 | -- Find all inputs that start with our acc, these are the only ones 37 | -- we care about. 38 | ids := ARRAY( 39 | SELECT id 40 | FROM day03.inputs 41 | WHERE char_length(value) >= char_length(acc)+1 AND 42 | value LIKE acc || '%' 43 | ); 44 | 45 | -- If we didn't find anything then we're done. 46 | IF coalesce(array_length(ids, 1), 0) = 0 THEN 47 | RETURN acc; 48 | END IF; 49 | 50 | -- If we have exactly one result, we're also done 51 | IF array_length(ids, 1) = 1 THEN 52 | RETURN (SELECT value FROM day03.inputs WHERE id = ids[1]); 53 | END IF; 54 | 55 | -- Find the most common character in our current index 56 | SELECT mode() WITHIN GROUP (ORDER BY c.char DESC) 57 | FROM characters c 58 | WHERE c.index = (char_length(acc) + 1) AND 59 | c.id = ANY(ids) 60 | INTO STRICT common; 61 | 62 | -- If we're looking for least common, flip the mode 63 | IF NOT most_common THEN 64 | IF common = '1' THEN 65 | common := '0'; 66 | ELSE 67 | common := '1'; 68 | END IF; 69 | END IF; 70 | 71 | RETURN (SELECT day03.decode(acc || common, most_common)); 72 | END; 73 | $$ LANGUAGE plpgsql; 74 | 75 | -- compute all the results 76 | \echo 'PART 2 RESULTS'; 77 | WITH strings AS ( 78 | SELECT day03.decode('', true) as oxygen, 79 | day03.decode('', false) as co2 80 | ), decimals AS ( 81 | SELECT lpad(oxygen, 32, '0')::bit(32)::int as oxygen_dec, 82 | lpad(co2, 32, '0')::bit(32)::int as co2_dec 83 | FROM strings 84 | ) 85 | SELECT *, oxygen_dec * co2_dec as answer 86 | FROM strings, decimals; 87 | -------------------------------------------------------------------------------- /day06/answer_p2.sql: -------------------------------------------------------------------------------- 1 | -- Put everything in a schema so its easy to reset. This also makes 2 | -- this automatically reset so we can just run it many times. 3 | DROP SCHEMA IF EXISTS day06 CASCADE; 4 | CREATE SCHEMA day06; 5 | 6 | -- Raw input 7 | CREATE TABLE day06.inputs ( 8 | line TEXT NOT NULL 9 | ); 10 | 11 | -- Use \COPY rather than COPY so its client-side in psql 12 | \COPY day06.inputs (line) FROM 'day06/input.txt'; 13 | 14 | -- We had to modify part 1 to "slice" our inputs. I chose to slice by 64 15 | -- since that it pretty fast. I couldn't figure out a way to do this in one 16 | -- query performantly because you can't aggregate in a recursive CTE. 17 | WITH RECURSIVE initial AS ( 18 | SELECT timer::int 19 | FROM day06.inputs, 20 | LATERAL unnest(regexp_split_to_array(line, ',')) as timer 21 | ), spawn1 AS ( 22 | -- base case: our initial timers, and a countdown 23 | SELECT 256 as days_remaining, 24 | timer 25 | FROM initial 26 | 27 | UNION ALL 28 | 29 | -- recursive case: decrement timer, spawn 30 | -- terminating case: timer is 0 31 | 32 | SELECT days_remaining - 1, 33 | newtimer 34 | FROM spawn1, 35 | LATERAL unnest(CASE 36 | WHEN timer = 0 THEN ARRAY[6,8] 37 | ELSE ARRAY[timer-1] 38 | END) as newtimer 39 | WHERE days_remaining > 192 40 | ), slice2 AS ( 41 | SELECT days_remaining, timer, COUNT(*) 42 | FROM spawn1 43 | GROUP BY days_remaining, timer 44 | ), spawn2 AS ( 45 | SELECT * FROM slice2 46 | 47 | UNION ALL 48 | 49 | SELECT days_remaining - 1, 50 | newtimer, 51 | count 52 | FROM spawn2, 53 | LATERAL unnest(CASE 54 | WHEN timer = 0 THEN ARRAY[6,8] 55 | ELSE ARRAY[timer-1] 56 | END) as newtimer 57 | WHERE days_remaining > 128 AND days_remaining <= 192 58 | ), slice3 AS ( 59 | SELECT days_remaining, timer, SUM(count) as count 60 | FROM spawn2 61 | GROUP BY days_remaining, timer 62 | ), spawn3 AS ( 63 | SELECT * FROM slice3 64 | 65 | UNION ALL 66 | 67 | SELECT days_remaining - 1, 68 | newtimer, 69 | count 70 | FROM spawn3, 71 | LATERAL unnest(CASE 72 | WHEN timer = 0 THEN ARRAY[6,8] 73 | ELSE ARRAY[timer-1] 74 | END) as newtimer 75 | WHERE days_remaining > 64 AND days_remaining <= 128 76 | ), slice4 AS ( 77 | SELECT days_remaining, timer, SUM(count) as count 78 | FROM spawn3 79 | GROUP BY days_remaining, timer 80 | ), spawn4 AS ( 81 | SELECT * FROM slice4 82 | 83 | UNION ALL 84 | 85 | SELECT days_remaining - 1, 86 | newtimer, 87 | count 88 | FROM spawn4, 89 | LATERAL unnest(CASE 90 | WHEN timer = 0 THEN ARRAY[6,8] 91 | ELSE ARRAY[timer-1] 92 | END) as newtimer 93 | WHERE days_remaining > 0 AND days_remaining <= 64 94 | ) 95 | SELECT sum(count) 96 | FROM spawn4 97 | WHERE days_remaining = 0; 98 | ; 99 | -------------------------------------------------------------------------------- /day07/input.txt: -------------------------------------------------------------------------------- 1 | 1101,1,29,67,1102,0,1,65,1008,65,35,66,1005,66,28,1,67,65,20,4,0,1001,65,1,65,1106,0,8,99,35,67,101,99,105,32,110,39,101,115,116,32,112,97,115,32,117,110,101,32,105,110,116,99,111,100,101,32,112,114,111,103,114,97,109,10,12,186,94,505,338,1527,356,122,360,745,28,227,799,305,177,1188,317,3,462,986,230,438,542,112,1334,620,1351,697,7,478,155,208,175,28,107,1501,238,40,0,469,20,945,699,144,822,189,290,37,1158,920,175,102,1042,590,1219,1110,514,126,142,28,282,1198,80,223,196,13,974,543,28,867,816,959,864,45,556,1106,219,259,14,817,312,1743,151,189,1199,300,823,749,747,42,1525,59,587,222,894,240,635,600,1179,324,1435,274,223,1095,25,423,115,472,22,443,827,622,171,102,175,303,67,86,103,0,1541,1086,217,1497,0,1217,919,1107,1052,1003,298,225,593,42,107,461,286,1254,7,827,724,1216,966,682,1660,201,27,190,1159,120,467,1151,886,173,106,6,141,1946,60,5,901,718,74,1040,149,1,839,986,0,817,1454,781,1541,108,1432,564,782,1747,492,24,949,369,1773,166,72,1372,1473,72,243,251,69,752,916,412,837,56,50,378,1332,0,432,310,281,622,107,414,1069,635,1898,483,1284,213,1613,664,0,29,1257,410,716,44,1529,661,430,1152,1023,25,1641,929,582,161,219,198,982,916,1079,83,19,346,45,452,398,161,12,1077,9,1300,363,438,368,30,195,245,657,404,244,219,99,644,191,1139,133,386,738,36,573,194,223,1224,144,537,1520,1124,389,21,610,652,347,619,121,557,1291,349,5,423,241,83,306,850,24,169,584,997,19,507,395,1076,1005,265,1057,1,1268,598,86,807,52,1160,253,325,462,48,707,694,960,1169,102,238,1108,425,420,15,1710,19,381,980,263,363,70,99,361,973,391,131,372,172,22,13,106,1579,961,20,788,25,126,340,206,17,717,286,1077,362,510,243,177,1063,551,667,1534,409,340,1071,415,160,1067,223,120,77,612,117,160,292,185,1167,214,1519,1265,1355,698,344,157,130,863,48,666,7,459,888,193,657,419,14,320,650,490,290,498,225,720,829,1613,509,645,339,301,868,275,457,1307,125,9,518,43,15,9,7,390,568,1847,165,42,256,432,337,38,11,1485,1758,47,257,1268,1898,701,622,346,111,109,210,27,437,1381,622,7,1226,226,1682,94,63,502,12,1308,723,215,276,460,7,159,599,78,1198,304,268,588,1086,44,1389,3,654,1602,834,165,570,736,1289,817,496,396,977,886,912,926,395,395,401,334,262,491,1138,78,0,757,622,10,299,85,355,1097,312,633,452,1409,27,275,458,101,393,508,1206,1,788,51,299,74,560,143,1610,237,223,1259,669,286,1046,668,733,508,665,354,651,40,1374,495,778,101,578,78,17,358,621,1080,38,142,33,182,538,912,76,446,79,1193,70,477,161,498,487,642,901,464,210,916,1410,674,71,208,709,304,80,1048,87,386,1665,907,573,305,974,242,836,811,90,11,64,175,98,162,390,69,145,468,818,1637,21,730,15,590,620,459,5,392,119,134,496,925,367,16,16,1443,687,1045,1704,256,667,10,850,1555,831,103,658,1097,745,380,48,210,994,163,428,669,1547,833,4,177,222,342,882,69,1350,500,154,218,358,183,83,739,297,1302,368,53,524,577,765,149,801,17,206,293,578,94,149,702,861,998,512,364,525,1849,682,1,204,96,119,815,118,1317,103,688,641,317,361,364,332,1020,1522,5,306,460,527,206,406,93,1433,221,70,1116,894,1240,157,299,812,121,1324,166,254,429,89,599,92,540,77,323,156,546,374,184,666,126,812,888,1195,412,305,325,216,1165,274,705,556,135,35,260,107,371,1515,125,703,149,433,515,698,163,369,537,63,1119,346,321,166,157,326,173,1022,50,929,14,1100,1289,334,1017,72,510,203,417,562,147,1098,1371,396,60,941,266,1195,960,629,698,46,443,1278,1601,1123,14,114,928,98,561,742,1501,860,610,941,591,3,120,1362,1176,75,185,144,851,570,55,317,126,179,202,1552,854,585,195,70,756,328,720,732,851,1080,1303,277,6,214,85,136,1594,469,345,176,835,126,1035,1006,66,1082,26,31,10,942,1546,186,575,712,775,14,920,169,733,220,1069,1300,19,47,816,675,102,307,1336,5,37,6,1258,340,373,26,42,4,358,260,174,635,245,108,466,891,662,658,341,10,777,613,749,164,118,235,997,74,674,120,501,924,1393,601,3,374,8,187,58,13,284,20,26,541,381,281,1135,19,1538,1306,1292,643,538,653,716,614,47,245,198,926,1845,95,864,234,476,18,1002,240,326,293,955,1196,907,129,115,250,991,1313,1801,60,183,16,150,440,900 2 | -------------------------------------------------------------------------------- /day04/answer_p1.sql: -------------------------------------------------------------------------------- 1 | -- Put everything in a schema so its easy to reset. This also makes 2 | -- this automatically reset so we can just run it many times. 3 | DROP SCHEMA IF EXISTS day04 CASCADE; 4 | CREATE SCHEMA day04; 5 | 6 | -- Both input_* tables are /raw/ input tables. These are formatted 7 | -- so we can do a raw, unprocessed copy directly from the input files. 8 | CREATE TABLE day04.input_numbers ( 9 | line TEXT NOT NULL 10 | ); 11 | 12 | CREATE TABLE day04.input_boards ( 13 | id SERIAL, 14 | line TEXT NOT NULL 15 | ); 16 | 17 | -- Use \COPY rather than COPY so its client-side in psql 18 | \COPY day04.input_numbers FROM 'day04/sample_numbers.txt' WITH (DELIMITER 'X'); 19 | \COPY day04.input_boards (line) FROM 'day04/sample_boards.txt' WITH (DELIMITER 'X'); 20 | 21 | WITH numbers AS ( 22 | -- convert our line of draws into a list of number and order 23 | SELECT index, number::int 24 | FROM day04.input_numbers, 25 | LATERAL unnest(regexp_split_to_array(line, ',')) 26 | WITH ORDINALITY 27 | AS t(number, index) 28 | ), boards_split AS ( 29 | -- use the newline to split each board into a dedicated ID 30 | -- also calculate the row using the same mechanism 31 | SELECT *, 32 | (sum(CASE WHEN line = '' THEN 1 ELSE 0 END) OVER (ORDER BY id)) + 1 as board_id, 33 | (sum(CASE WHEN line <> '' THEN 1 ELSE -5 END) OVER (ORDER BY id)) as row 34 | FROM day04.input_boards 35 | ), boards AS ( 36 | -- take the split boards and now split columns to assign col numbers 37 | SELECT board_id, 38 | row, 39 | col, 40 | number::int 41 | FROM boards_split, 42 | LATERAL unnest(regexp_split_to_array(trim(line), '\s+')) 43 | WITH ORDINALITY 44 | AS t(number, col) 45 | WHERE line <> '' 46 | ), boards_fk AS ( 47 | -- replace all our numbers in our boards with their order 48 | SELECT b.board_id, 49 | b.row, 50 | b.col, 51 | n.index as pick_order 52 | FROM boards b 53 | LEFT JOIN numbers n ON n.number = b.number 54 | ORDER BY board_id, row, col 55 | ), winning_row AS ( 56 | -- all rows ordered by the one that won first 57 | SELECT board_id, 58 | row, 59 | max(pick_order) as most_recent 60 | FROM boards_fk 61 | GROUP BY board_id, row 62 | ORDER BY most_recent 63 | ), winning_col AS ( 64 | -- all columns ordered by the one that won first 65 | SELECT board_id, 66 | col, 67 | max(pick_order) as most_recent 68 | FROM boards_fk 69 | GROUP BY board_id, col 70 | ORDER BY most_recent 71 | ), winning_row_unmarked AS ( 72 | -- calculate the sum of the unmarked numbers left on the winning rows 73 | SELECT w.board_id, 74 | w.row, 75 | w.most_recent as winning_pick, 76 | sum(n.number) as remainder_sum 77 | FROM winning_row w 78 | LEFT JOIN boards_fk b ON b.board_id = w.board_id 79 | AND b.pick_order > w.most_recent 80 | LEFT JOIN numbers n ON n.index = b.pick_order 81 | GROUP BY w.board_id, w.row, w.most_recent 82 | ORDER BY w.most_recent 83 | ), winning_col_unmarked AS ( 84 | -- calculate the sum of the unmarked numbers left on the winning col 85 | SELECT w.board_id, 86 | w.col, 87 | w.most_recent as winning_pick, 88 | sum(n.number) as remainder_sum 89 | FROM winning_col w 90 | LEFT JOIN boards_fk b ON b.board_id = w.board_id 91 | AND b.pick_order > w.most_recent 92 | LEFT JOIN numbers n ON n.index = b.pick_order 93 | GROUP BY w.board_id, w.col, w.most_recent 94 | ORDER BY w.most_recent 95 | ), possible_answers AS ( 96 | -- get the possible col and row answer 97 | (SELECT w.board_id, 98 | 'row: ' || w.row as desc, 99 | w.most_recent as winning_pick, 100 | n.number as most_recent, 101 | rem.remainder_sum, 102 | n.number * rem.remainder_sum as answer 103 | FROM winning_row_unmarked rem 104 | JOIN winning_row w ON w.board_id = rem.board_id AND w.row = rem.row 105 | JOIN numbers n ON n.index = w.most_recent 106 | ORDER BY rem.winning_pick) 107 | 108 | UNION 109 | 110 | (SELECT w.board_id, 111 | 'col: ' || w.col as desc, 112 | w.most_recent as winning_pick, 113 | n.number as most_recent, 114 | rem.remainder_sum, 115 | n.number * rem.remainder_sum as answer 116 | FROM winning_col_unmarked rem 117 | JOIN winning_col w ON w.board_id = rem.board_id AND w.col = rem.col 118 | JOIN numbers n ON n.index = w.most_recent 119 | ORDER BY rem.winning_pick) 120 | ) 121 | SELECT * 122 | FROM possible_answers 123 | ORDER BY winning_pick 124 | LIMIT 1 ; 125 | -------------------------------------------------------------------------------- /day04/answer_p2.sql: -------------------------------------------------------------------------------- 1 | -- Put everything in a schema so its easy to reset. This also makes 2 | -- this automatically reset so we can just run it many times. 3 | DROP SCHEMA IF EXISTS day04 CASCADE; 4 | CREATE SCHEMA day04; 5 | 6 | -- Both input_* tables are /raw/ input tables. These are formatted 7 | -- so we can do a raw, unprocessed copy directly from the input files. 8 | CREATE TABLE day04.input_numbers ( 9 | line TEXT NOT NULL 10 | ); 11 | 12 | CREATE TABLE day04.input_boards ( 13 | id SERIAL, 14 | line TEXT NOT NULL 15 | ); 16 | 17 | -- Use \COPY rather than COPY so its client-side in psql 18 | \COPY day04.input_numbers FROM 'day04/input_numbers.txt' WITH (DELIMITER 'X'); 19 | \COPY day04.input_boards (line) FROM 'day04/input_boards.txt' WITH (DELIMITER 'X'); 20 | 21 | WITH numbers AS ( 22 | -- convert our line of draws into a list of number and order 23 | SELECT index, number::int 24 | FROM day04.input_numbers, 25 | LATERAL unnest(regexp_split_to_array(line, ',')) 26 | WITH ORDINALITY 27 | AS t(number, index) 28 | ), boards_split AS ( 29 | -- use the newline to split each board into a dedicated ID 30 | -- also calculate the row using the same mechanism 31 | SELECT *, 32 | (sum(CASE WHEN line = '' THEN 1 ELSE 0 END) OVER (ORDER BY id)) + 1 as board_id, 33 | (sum(CASE WHEN line <> '' THEN 1 ELSE -5 END) OVER (ORDER BY id)) as row 34 | FROM day04.input_boards 35 | ), boards AS ( 36 | -- take the split boards and now split columns to assign col numbers 37 | SELECT board_id, 38 | row, 39 | col, 40 | number::int 41 | FROM boards_split, 42 | LATERAL unnest(regexp_split_to_array(trim(line), '\s+')) 43 | WITH ORDINALITY 44 | AS t(number, col) 45 | WHERE line <> '' 46 | ), boards_fk AS ( 47 | -- replace all our numbers in our boards with their order 48 | SELECT b.board_id, 49 | b.row, 50 | b.col, 51 | n.index as pick_order 52 | FROM boards b 53 | LEFT JOIN numbers n ON n.number = b.number 54 | ORDER BY board_id, row, col 55 | ), winning_row AS ( 56 | -- all rows ordered by the one that won first 57 | SELECT board_id, 58 | row, 59 | sum(pick_order), 60 | max(pick_order) as most_recent 61 | FROM boards_fk 62 | GROUP BY board_id, row 63 | ORDER BY most_recent 64 | ), winning_col AS ( 65 | -- all columns ordered by the one that won first 66 | SELECT board_id, 67 | col, 68 | sum(pick_order), 69 | max(pick_order) as most_recent 70 | FROM boards_fk 71 | GROUP BY board_id, col 72 | ORDER BY most_recent 73 | ), winning_row_unmarked AS ( 74 | -- calculate the sum of the unmarked numbers left on the winning rows 75 | SELECT w.board_id, 76 | w.row, 77 | w.most_recent as winning_pick, 78 | sum(n.number) as remainder_sum 79 | FROM winning_row w 80 | LEFT JOIN boards_fk b ON b.board_id = w.board_id 81 | AND b.row <> w.row 82 | AND b.pick_order > w.most_recent 83 | LEFT JOIN numbers n ON n.index = b.pick_order 84 | GROUP BY w.board_id, w.row, w.most_recent 85 | ORDER BY w.most_recent 86 | ), winning_col_unmarked AS ( 87 | -- calculate the sum of the unmarked numbers left on the winning col 88 | SELECT w.board_id, 89 | w.col, 90 | w.most_recent as winning_pick, 91 | sum(n.number) as remainder_sum 92 | FROM winning_col w 93 | LEFT JOIN boards_fk b ON b.board_id = w.board_id 94 | AND b.col <> w.col 95 | AND b.pick_order > w.most_recent 96 | LEFT JOIN numbers n ON n.index = b.pick_order 97 | GROUP BY w.board_id, w.col, w.most_recent 98 | ORDER BY w.most_recent 99 | ), possible_answers AS ( 100 | -- get the possible col and row answer 101 | (SELECT w.board_id, 102 | 'row: ' || w.row as desc, 103 | w.most_recent as winning_pick, 104 | n.number as most_recent, 105 | rem.remainder_sum, 106 | n.number * rem.remainder_sum as answer 107 | FROM winning_row_unmarked rem 108 | JOIN winning_row w ON w.board_id = rem.board_id AND w.row = rem.row 109 | JOIN numbers n ON n.index = w.most_recent) 110 | 111 | UNION 112 | 113 | (SELECT w.board_id, 114 | 'col: ' || w.col as desc, 115 | w.most_recent as winning_pick, 116 | n.number as most_recent, 117 | rem.remainder_sum, 118 | n.number * rem.remainder_sum as answer 119 | FROM winning_col_unmarked rem 120 | JOIN winning_col w ON w.board_id = rem.board_id AND w.col = rem.col 121 | JOIN numbers n ON n.index = w.most_recent) 122 | ), board_order AS ( 123 | -- the order in which boards won 124 | SELECT board_id, 125 | min(winning_pick) as earliest_win 126 | FROM possible_answers 127 | GROUP BY board_id 128 | ) 129 | SELECT * 130 | FROM board_order bo 131 | JOIN possible_answers a ON a.board_id = bo.board_id 132 | AND a.winning_pick = bo.earliest_win 133 | ORDER BY bo.earliest_win DESC 134 | LIMIT 1; 135 | -------------------------------------------------------------------------------- /day04/input_boards.txt: -------------------------------------------------------------------------------- 1 | 50 98 65 14 47 2 | 0 22 3 83 46 3 | 87 93 81 84 58 4 | 40 35 28 74 48 5 | 45 99 59 37 64 6 | 7 | 85 66 90 32 88 8 | 95 6 4 74 27 9 | 1 10 70 41 92 10 | 54 36 42 9 39 11 | 60 99 31 67 16 12 | 13 | 4 44 66 10 58 14 | 33 64 93 42 46 15 | 19 63 6 83 54 16 | 60 51 76 8 30 17 | 71 49 73 7 55 18 | 19 | 17 67 52 61 98 20 | 46 5 4 51 76 21 | 73 59 74 8 33 22 | 48 96 20 26 15 23 | 55 19 86 29 43 24 | 25 | 20 75 12 67 41 26 | 89 36 65 66 92 27 | 40 19 1 0 28 28 | 99 61 85 58 50 29 | 44 72 57 35 86 30 | 31 | 69 87 27 59 33 32 | 47 34 60 93 9 33 | 71 84 46 24 96 34 | 15 91 5 61 19 35 | 57 78 55 31 8 36 | 37 | 19 10 1 81 96 38 | 27 71 2 52 56 39 | 15 22 48 82 34 40 | 64 47 42 49 51 41 | 26 72 61 12 57 42 | 43 | 71 94 40 34 26 44 | 12 80 57 38 55 45 | 4 56 11 73 49 46 | 75 60 61 9 50 47 | 91 70 23 1 90 48 | 49 | 39 86 30 73 38 50 | 6 53 58 14 36 51 | 85 12 75 88 5 52 | 0 29 41 21 15 53 | 47 66 59 54 1 54 | 55 | 99 97 50 17 60 56 | 36 13 29 80 32 57 | 49 85 75 71 15 58 | 10 79 41 61 66 59 | 68 57 55 74 98 60 | 61 | 68 33 87 89 59 62 | 96 35 76 78 55 63 | 4 63 51 10 65 64 | 58 38 22 54 9 65 | 66 18 37 60 6 66 | 67 | 43 86 50 23 77 68 | 10 42 19 61 2 69 | 40 29 20 84 0 70 | 70 59 96 80 57 71 | 76 12 39 36 6 72 | 73 | 73 43 92 37 99 74 | 36 42 10 77 87 75 | 3 57 4 20 35 76 | 18 7 46 91 11 77 | 17 98 8 53 61 78 | 79 | 22 37 89 51 9 80 | 71 6 72 87 32 81 | 13 79 86 53 98 82 | 16 2 93 48 38 83 | 63 82 66 61 69 84 | 85 | 73 90 85 54 65 86 | 9 66 28 5 63 87 | 91 50 70 59 80 88 | 95 68 92 72 67 89 | 69 88 36 43 53 90 | 91 | 36 81 66 78 90 92 | 2 25 94 82 55 93 | 34 45 1 14 37 94 | 13 4 70 48 75 95 | 67 73 32 18 91 96 | 97 | 33 93 71 48 47 98 | 8 79 69 53 82 99 | 5 31 80 45 37 100 | 67 77 41 56 97 101 | 65 46 62 42 81 102 | 103 | 67 70 59 24 88 104 | 84 11 29 52 78 105 | 4 39 12 90 2 106 | 44 3 10 75 89 107 | 30 93 22 14 8 108 | 109 | 79 60 98 99 49 110 | 23 26 86 91 38 111 | 77 45 95 66 75 112 | 81 42 85 21 3 113 | 40 37 65 20 50 114 | 115 | 12 54 0 86 52 116 | 15 56 29 39 94 117 | 66 79 14 65 26 118 | 3 4 59 60 40 119 | 47 48 19 13 85 120 | 121 | 32 44 69 90 21 122 | 35 8 1 59 56 123 | 72 71 84 18 11 124 | 96 38 23 37 79 125 | 92 20 33 94 17 126 | 127 | 1 94 42 21 82 128 | 92 60 9 32 38 129 | 71 3 37 77 18 130 | 89 16 74 76 2 131 | 83 30 28 11 70 132 | 133 | 94 3 1 71 87 134 | 6 66 19 76 28 135 | 10 86 22 62 2 136 | 67 0 31 46 27 137 | 8 33 43 92 29 138 | 139 | 35 90 8 30 27 140 | 67 60 82 68 1 141 | 5 29 93 44 34 142 | 56 65 48 37 51 143 | 57 45 63 94 77 144 | 145 | 67 80 45 57 43 146 | 37 81 25 84 82 147 | 50 8 9 64 7 148 | 29 18 52 16 14 149 | 73 28 11 76 6 150 | 151 | 5 76 67 18 16 152 | 68 47 15 29 59 153 | 46 32 40 9 84 154 | 30 17 20 22 3 155 | 35 80 38 72 88 156 | 157 | 35 44 14 89 72 158 | 75 67 56 2 3 159 | 58 41 49 12 52 160 | 92 9 22 34 88 161 | 65 39 93 61 47 162 | 163 | 38 67 33 18 60 164 | 34 50 69 31 83 165 | 29 30 9 12 95 166 | 79 2 24 54 87 167 | 46 68 48 58 42 168 | 169 | 61 87 46 26 34 170 | 74 85 9 54 38 171 | 50 29 84 40 4 172 | 49 39 33 99 53 173 | 77 59 0 42 35 174 | 175 | 86 68 23 62 5 176 | 96 92 7 4 1 177 | 50 70 12 83 46 178 | 34 63 91 56 11 179 | 76 90 71 88 95 180 | 181 | 19 18 13 3 62 182 | 42 29 57 79 85 183 | 39 64 14 28 98 184 | 99 36 91 9 63 185 | 69 66 2 17 31 186 | 187 | 51 43 49 98 94 188 | 31 64 53 54 57 189 | 3 28 10 12 2 190 | 24 99 95 35 17 191 | 76 27 48 0 41 192 | 193 | 80 62 13 38 98 194 | 32 15 16 8 96 195 | 93 43 81 99 40 196 | 20 57 37 24 3 197 | 94 17 70 14 7 198 | 199 | 52 71 49 95 84 200 | 76 38 45 59 89 201 | 1 7 27 0 98 202 | 92 64 8 50 68 203 | 13 91 26 51 2 204 | 205 | 31 45 25 1 5 206 | 50 68 77 61 53 207 | 74 20 99 38 63 208 | 76 44 15 42 51 209 | 67 87 86 12 24 210 | 211 | 49 0 70 82 9 212 | 2 24 96 74 60 213 | 68 16 40 32 20 214 | 48 6 98 11 65 215 | 94 10 54 8 95 216 | 217 | 74 41 11 33 76 218 | 2 10 44 89 23 219 | 56 45 78 60 34 220 | 15 5 26 83 71 221 | 20 72 85 75 54 222 | 223 | 15 59 93 53 8 224 | 4 10 84 44 36 225 | 17 62 24 27 98 226 | 87 54 73 13 35 227 | 9 48 52 33 7 228 | 229 | 56 80 70 74 35 230 | 53 69 75 25 27 231 | 47 91 85 62 32 232 | 93 26 89 18 52 233 | 16 73 49 55 77 234 | 235 | 42 40 54 67 73 236 | 11 10 49 35 59 237 | 12 93 37 15 69 238 | 97 41 47 39 2 239 | 75 99 21 29 26 240 | 241 | 23 75 41 10 86 242 | 71 67 66 38 99 243 | 91 92 63 40 28 244 | 69 97 42 77 60 245 | 44 53 12 84 57 246 | 247 | 72 51 31 90 37 248 | 35 89 55 73 87 249 | 46 32 45 0 58 250 | 50 81 13 18 66 251 | 38 4 40 62 22 252 | 253 | 14 48 35 76 83 254 | 13 70 26 4 1 255 | 30 22 91 93 29 256 | 69 41 74 40 63 257 | 80 65 66 72 23 258 | 259 | 23 65 33 56 38 260 | 84 41 34 21 2 261 | 4 78 27 17 11 262 | 22 53 52 32 80 263 | 24 25 42 91 99 264 | 265 | 54 51 0 23 52 266 | 92 69 10 46 7 267 | 20 35 12 37 73 268 | 19 56 26 79 32 269 | 27 74 34 5 57 270 | 271 | 75 10 24 32 7 272 | 96 54 22 78 5 273 | 23 69 65 43 20 274 | 29 85 44 92 71 275 | 41 87 73 0 48 276 | 277 | 54 92 16 36 37 278 | 42 59 4 9 44 279 | 52 14 12 6 47 280 | 57 38 70 82 0 281 | 53 81 32 35 3 282 | 283 | 17 22 62 80 30 284 | 8 28 15 42 46 285 | 79 64 32 29 75 286 | 5 0 9 90 69 287 | 41 71 85 1 6 288 | 289 | 68 89 40 31 39 290 | 32 48 64 38 28 291 | 80 98 88 14 97 292 | 6 60 52 11 55 293 | 95 34 63 81 4 294 | 295 | 80 33 14 83 68 296 | 78 69 81 59 15 297 | 72 0 74 21 75 298 | 49 6 67 73 64 299 | 8 25 87 3 45 300 | 301 | 34 97 86 1 79 302 | 49 12 63 10 59 303 | 88 30 84 74 87 304 | 67 47 26 0 57 305 | 71 40 2 76 98 306 | 307 | 15 89 23 65 44 308 | 27 87 54 38 12 309 | 43 29 18 39 94 310 | 48 0 7 57 61 311 | 70 28 60 68 50 312 | 313 | 13 34 49 67 40 314 | 88 74 99 20 26 315 | 63 69 62 24 32 316 | 35 45 96 79 1 317 | 92 7 17 76 30 318 | 319 | 95 21 75 46 74 320 | 39 7 58 23 90 321 | 61 64 37 81 82 322 | 92 36 54 9 53 323 | 17 51 33 10 27 324 | 325 | 67 35 44 22 23 326 | 28 96 1 56 29 327 | 0 12 5 50 99 328 | 70 42 8 24 25 329 | 39 53 51 89 85 330 | 331 | 50 15 94 84 27 332 | 72 26 51 3 85 333 | 63 45 1 64 44 334 | 17 80 13 88 2 335 | 12 97 91 25 18 336 | 337 | 59 14 9 67 63 338 | 6 18 26 98 50 339 | 86 74 75 56 34 340 | 48 7 99 20 64 341 | 8 53 10 15 57 342 | 343 | 6 35 13 68 24 344 | 90 19 91 71 86 345 | 95 58 10 44 98 346 | 8 41 60 1 16 347 | 29 59 43 84 48 348 | 349 | 48 56 8 74 4 350 | 66 30 77 35 90 351 | 94 0 75 49 84 352 | 5 39 11 54 87 353 | 33 58 96 22 2 354 | 355 | 5 38 57 63 65 356 | 74 58 22 8 81 357 | 45 96 78 3 11 358 | 28 42 30 39 51 359 | 87 33 34 75 14 360 | 361 | 56 34 67 70 17 362 | 7 80 10 31 85 363 | 68 59 63 74 40 364 | 13 81 99 62 6 365 | 92 84 71 37 39 366 | 367 | 85 99 74 16 10 368 | 12 21 91 2 83 369 | 4 94 38 51 36 370 | 41 97 45 65 24 371 | 50 82 92 52 35 372 | 373 | 28 65 6 13 23 374 | 7 57 86 18 67 375 | 26 85 29 22 89 376 | 99 62 94 31 96 377 | 14 17 50 56 9 378 | 379 | 98 10 63 4 8 380 | 46 21 58 89 3 381 | 27 12 11 55 16 382 | 61 38 43 33 54 383 | 53 14 99 31 25 384 | 385 | 25 70 24 40 14 386 | 75 82 58 68 41 387 | 22 71 72 93 1 388 | 47 97 6 81 45 389 | 92 42 2 76 12 390 | 391 | 31 84 30 0 85 392 | 55 70 72 45 57 393 | 78 52 67 60 22 394 | 43 32 8 44 34 395 | 14 64 91 89 18 396 | 397 | 70 19 62 16 56 398 | 84 49 41 3 20 399 | 85 5 76 95 22 400 | 63 55 37 31 72 401 | 42 17 28 65 1 402 | 403 | 85 17 57 62 48 404 | 34 29 69 52 28 405 | 90 64 54 21 38 406 | 0 50 84 44 60 407 | 93 80 75 89 83 408 | 409 | 39 84 78 12 5 410 | 29 4 35 7 85 411 | 73 25 58 27 45 412 | 22 90 91 47 74 413 | 60 96 15 24 26 414 | 415 | 13 30 82 31 43 416 | 23 71 1 51 36 417 | 40 62 25 54 86 418 | 8 83 2 47 34 419 | 33 41 27 98 24 420 | 421 | 13 25 53 50 56 422 | 77 4 41 19 22 423 | 68 70 75 9 65 424 | 30 33 60 74 80 425 | 31 83 34 79 11 426 | 427 | 11 90 38 78 73 428 | 17 16 14 37 4 429 | 80 68 21 70 92 430 | 47 26 81 67 25 431 | 10 31 23 41 22 432 | 433 | 90 62 2 50 79 434 | 77 51 8 11 13 435 | 32 29 43 88 33 436 | 39 34 89 45 23 437 | 91 9 6 68 3 438 | 439 | 62 70 89 27 87 440 | 45 65 96 80 29 441 | 1 54 90 68 16 442 | 72 50 28 95 12 443 | 21 71 81 10 60 444 | 445 | 33 14 60 44 78 446 | 6 65 87 11 8 447 | 79 21 59 35 19 448 | 26 69 67 42 27 449 | 25 36 80 10 45 450 | 451 | 71 24 80 87 56 452 | 7 61 43 38 18 453 | 52 46 41 28 48 454 | 0 74 20 34 63 455 | 3 84 42 85 9 456 | 457 | 36 64 41 7 49 458 | 91 92 13 94 88 459 | 73 98 79 0 12 460 | 76 66 86 67 9 461 | 2 85 74 5 34 462 | 463 | 8 81 7 56 28 464 | 36 13 42 29 75 465 | 12 27 85 45 9 466 | 26 25 62 41 22 467 | 79 11 95 0 24 468 | 469 | 72 76 81 67 16 470 | 96 41 94 58 7 471 | 0 79 38 27 11 472 | 61 36 56 88 39 473 | 89 63 31 75 8 474 | 475 | 62 51 5 46 28 476 | 77 97 89 86 13 477 | 87 55 73 90 57 478 | 84 44 40 49 34 479 | 25 0 58 6 21 480 | 481 | 7 56 15 41 94 482 | 42 89 16 18 74 483 | 57 79 96 35 3 484 | 14 45 20 19 80 485 | 87 85 28 69 17 486 | 487 | 27 88 54 62 65 488 | 44 93 69 13 9 489 | 85 63 43 11 47 490 | 83 57 30 20 56 491 | 71 46 49 7 77 492 | 493 | 45 24 75 39 69 494 | 48 74 44 49 64 495 | 65 25 22 46 93 496 | 88 52 27 37 50 497 | 19 35 47 54 67 498 | 499 | 44 32 71 13 57 500 | 7 38 26 98 65 501 | 46 1 21 8 55 502 | 30 62 92 27 3 503 | 69 50 99 85 11 504 | 505 | 86 6 64 34 97 506 | 47 98 7 38 9 507 | 26 68 75 92 54 508 | 58 42 13 78 37 509 | 85 28 81 16 51 510 | 511 | 82 74 15 4 86 512 | 55 0 70 88 24 513 | 50 79 63 40 21 514 | 47 39 61 49 36 515 | 89 16 13 2 37 516 | 517 | 89 19 9 82 13 518 | 84 34 58 56 10 519 | 27 92 46 4 94 520 | 44 24 52 86 55 521 | 39 23 22 99 5 522 | 523 | 65 92 8 86 77 524 | 98 79 72 28 78 525 | 16 23 3 55 48 526 | 68 95 66 30 43 527 | 50 31 15 11 45 528 | 529 | 32 70 25 59 31 530 | 47 68 77 56 23 531 | 66 78 54 88 50 532 | 55 60 58 89 83 533 | 84 99 86 97 95 534 | 535 | 53 46 1 94 87 536 | 8 80 38 77 81 537 | 17 51 47 19 69 538 | 86 50 71 5 93 539 | 61 66 36 58 0 540 | 541 | 90 58 17 29 92 542 | 67 1 8 64 99 543 | 63 22 57 19 68 544 | 78 36 93 53 2 545 | 27 48 62 39 14 546 | 547 | 8 49 22 90 54 548 | 26 4 99 27 34 549 | 78 25 11 85 28 550 | 31 42 36 53 15 551 | 64 75 60 45 35 552 | 553 | 99 84 26 53 90 554 | 61 51 98 39 86 555 | 47 37 52 80 63 556 | 67 49 35 70 11 557 | 32 45 94 73 43 558 | 559 | 91 92 74 94 32 560 | 27 56 50 33 54 561 | 67 46 35 25 10 562 | 93 97 30 90 4 563 | 57 15 69 83 39 564 | 565 | 71 68 74 81 11 566 | 44 98 60 17 73 567 | 43 40 32 38 39 568 | 61 56 97 94 70 569 | 23 2 86 91 54 570 | 571 | 19 98 93 42 88 572 | 0 16 30 32 71 573 | 89 86 81 76 68 574 | 29 2 14 72 63 575 | 7 27 67 59 1 576 | 577 | 24 18 28 98 95 578 | 10 62 80 71 36 579 | 3 89 20 63 46 580 | 47 65 84 22 6 581 | 82 19 81 38 45 582 | 583 | 54 85 67 34 79 584 | 25 58 38 73 61 585 | 72 98 4 19 40 586 | 32 10 29 31 89 587 | 15 33 5 7 63 588 | 589 | 49 48 71 81 88 590 | 70 5 39 41 22 591 | 19 20 7 75 23 592 | 69 46 63 14 54 593 | 80 45 94 6 55 594 | 595 | 88 62 76 78 95 596 | 64 65 36 58 22 597 | 7 21 98 93 42 598 | 79 99 9 89 10 599 | 6 5 33 92 72 600 | -------------------------------------------------------------------------------- /day05/input.txt: -------------------------------------------------------------------------------- 1 | 419,207 -> 419,109 2 | 300,888 -> 803,385 3 | 104,959 -> 457,959 4 | 987,951 -> 987,385 5 | 173,602 -> 919,602 6 | 173,70 -> 305,70 7 | 341,19 -> 486,19 8 | 128,579 -> 128,100 9 | 210,867 -> 969,867 10 | 880,493 -> 880,58 11 | 937,831 -> 131,25 12 | 520,921 -> 476,965 13 | 760,147 -> 461,147 14 | 646,108 -> 646,27 15 | 99,906 -> 99,591 16 | 19,956 -> 19,273 17 | 89,201 -> 326,201 18 | 275,948 -> 962,261 19 | 292,489 -> 689,489 20 | 674,109 -> 20,763 21 | 861,861 -> 529,529 22 | 155,200 -> 273,200 23 | 628,803 -> 209,384 24 | 654,401 -> 578,325 25 | 723,625 -> 828,730 26 | 137,406 -> 862,406 27 | 893,45 -> 41,897 28 | 631,10 -> 941,320 29 | 618,435 -> 537,435 30 | 939,29 -> 30,938 31 | 505,796 -> 505,244 32 | 799,779 -> 77,779 33 | 938,576 -> 427,576 34 | 522,635 -> 405,518 35 | 244,89 -> 946,89 36 | 447,791 -> 316,660 37 | 560,731 -> 687,731 38 | 16,878 -> 835,59 39 | 45,707 -> 45,565 40 | 767,166 -> 404,529 41 | 791,260 -> 791,950 42 | 373,949 -> 373,156 43 | 38,774 -> 38,557 44 | 445,537 -> 445,370 45 | 817,756 -> 959,898 46 | 472,551 -> 952,71 47 | 696,381 -> 657,420 48 | 43,829 -> 43,190 49 | 101,635 -> 728,635 50 | 197,532 -> 140,532 51 | 693,368 -> 299,368 52 | 433,140 -> 433,610 53 | 136,58 -> 136,666 54 | 472,294 -> 886,294 55 | 690,883 -> 671,864 56 | 141,598 -> 141,118 57 | 56,651 -> 56,957 58 | 747,82 -> 747,91 59 | 219,455 -> 55,291 60 | 444,131 -> 444,802 61 | 326,459 -> 528,661 62 | 245,965 -> 143,965 63 | 916,316 -> 630,316 64 | 263,55 -> 977,769 65 | 262,451 -> 587,451 66 | 960,178 -> 960,564 67 | 960,88 -> 476,572 68 | 314,259 -> 314,169 69 | 404,742 -> 429,742 70 | 830,921 -> 409,921 71 | 181,396 -> 463,678 72 | 338,293 -> 23,608 73 | 851,667 -> 851,350 74 | 181,859 -> 718,322 75 | 314,240 -> 870,796 76 | 778,984 -> 77,283 77 | 476,178 -> 440,178 78 | 935,357 -> 841,263 79 | 695,683 -> 414,964 80 | 760,241 -> 306,241 81 | 390,355 -> 791,355 82 | 460,710 -> 851,710 83 | 559,448 -> 870,448 84 | 161,526 -> 301,386 85 | 935,495 -> 633,193 86 | 205,536 -> 383,536 87 | 290,626 -> 290,94 88 | 55,972 -> 946,81 89 | 240,531 -> 631,922 90 | 189,806 -> 573,806 91 | 518,827 -> 866,479 92 | 239,829 -> 260,829 93 | 151,51 -> 849,51 94 | 301,736 -> 532,736 95 | 23,889 -> 336,889 96 | 284,124 -> 284,933 97 | 637,610 -> 67,40 98 | 610,828 -> 610,159 99 | 763,590 -> 763,963 100 | 804,576 -> 804,694 101 | 689,872 -> 82,265 102 | 440,377 -> 190,127 103 | 933,330 -> 310,953 104 | 873,99 -> 873,328 105 | 756,808 -> 860,808 106 | 119,64 -> 928,873 107 | 74,144 -> 489,559 108 | 957,938 -> 838,938 109 | 148,320 -> 932,320 110 | 386,171 -> 386,985 111 | 357,171 -> 494,171 112 | 254,67 -> 254,95 113 | 196,910 -> 827,910 114 | 107,114 -> 758,114 115 | 971,40 -> 801,40 116 | 504,602 -> 215,891 117 | 184,310 -> 720,846 118 | 280,300 -> 955,975 119 | 49,637 -> 49,572 120 | 352,512 -> 739,899 121 | 610,123 -> 585,123 122 | 808,881 -> 758,881 123 | 646,980 -> 818,980 124 | 948,482 -> 384,482 125 | 115,144 -> 852,881 126 | 506,836 -> 547,836 127 | 985,369 -> 374,980 128 | 883,975 -> 48,975 129 | 447,664 -> 312,799 130 | 24,597 -> 24,331 131 | 45,19 -> 979,953 132 | 210,689 -> 210,430 133 | 704,806 -> 704,612 134 | 985,982 -> 124,121 135 | 70,174 -> 550,174 136 | 463,12 -> 637,12 137 | 107,97 -> 716,97 138 | 935,265 -> 390,810 139 | 42,223 -> 42,86 140 | 60,245 -> 60,473 141 | 695,735 -> 208,735 142 | 547,265 -> 802,265 143 | 941,667 -> 941,806 144 | 250,286 -> 611,286 145 | 10,64 -> 630,64 146 | 482,889 -> 482,150 147 | 441,820 -> 776,820 148 | 529,474 -> 529,265 149 | 533,465 -> 217,149 150 | 242,473 -> 242,830 151 | 633,160 -> 476,317 152 | 942,24 -> 942,784 153 | 80,313 -> 92,325 154 | 295,109 -> 295,712 155 | 31,964 -> 857,138 156 | 285,255 -> 955,925 157 | 650,610 -> 650,366 158 | 722,586 -> 625,586 159 | 580,384 -> 580,531 160 | 78,407 -> 896,407 161 | 296,310 -> 730,744 162 | 717,966 -> 924,966 163 | 524,551 -> 524,671 164 | 44,127 -> 784,867 165 | 214,849 -> 238,849 166 | 749,320 -> 749,241 167 | 886,146 -> 336,696 168 | 889,933 -> 455,499 169 | 644,232 -> 79,797 170 | 400,979 -> 626,979 171 | 433,681 -> 433,523 172 | 447,57 -> 676,57 173 | 185,416 -> 659,890 174 | 849,645 -> 257,53 175 | 633,721 -> 633,901 176 | 766,355 -> 766,56 177 | 669,393 -> 669,523 178 | 833,336 -> 833,58 179 | 52,114 -> 52,413 180 | 699,957 -> 109,957 181 | 14,953 -> 945,22 182 | 641,15 -> 929,303 183 | 25,874 -> 866,33 184 | 856,73 -> 28,901 185 | 94,892 -> 592,892 186 | 256,357 -> 256,700 187 | 960,579 -> 31,579 188 | 940,859 -> 940,987 189 | 507,673 -> 820,986 190 | 164,361 -> 133,361 191 | 210,424 -> 876,424 192 | 28,186 -> 28,376 193 | 452,149 -> 531,149 194 | 142,160 -> 142,435 195 | 180,801 -> 180,439 196 | 681,267 -> 42,267 197 | 724,414 -> 786,476 198 | 762,492 -> 762,427 199 | 902,808 -> 227,133 200 | 70,923 -> 821,172 201 | 468,12 -> 457,12 202 | 208,129 -> 986,907 203 | 78,786 -> 78,352 204 | 573,869 -> 820,869 205 | 780,680 -> 520,940 206 | 276,66 -> 276,244 207 | 423,629 -> 592,629 208 | 888,507 -> 888,139 209 | 869,878 -> 869,951 210 | 274,614 -> 625,965 211 | 926,289 -> 982,233 212 | 102,687 -> 102,214 213 | 52,264 -> 52,12 214 | 904,43 -> 657,43 215 | 184,685 -> 184,628 216 | 506,912 -> 601,817 217 | 356,524 -> 87,524 218 | 202,260 -> 202,276 219 | 970,63 -> 83,950 220 | 402,332 -> 950,880 221 | 195,666 -> 843,666 222 | 13,82 -> 892,961 223 | 614,28 -> 614,871 224 | 892,162 -> 892,101 225 | 363,665 -> 59,665 226 | 768,208 -> 410,208 227 | 483,300 -> 295,300 228 | 590,108 -> 881,108 229 | 837,967 -> 837,326 230 | 368,731 -> 368,913 231 | 900,921 -> 873,921 232 | 896,931 -> 848,979 233 | 562,939 -> 857,939 234 | 85,351 -> 598,351 235 | 917,30 -> 624,30 236 | 605,314 -> 605,303 237 | 382,655 -> 340,697 238 | 949,115 -> 653,115 239 | 667,311 -> 370,608 240 | 971,983 -> 39,51 241 | 178,687 -> 178,69 242 | 906,197 -> 296,807 243 | 947,886 -> 383,322 244 | 551,667 -> 551,238 245 | 86,65 -> 916,895 246 | 589,887 -> 865,611 247 | 332,53 -> 84,53 248 | 361,148 -> 55,148 249 | 883,205 -> 661,205 250 | 415,552 -> 52,552 251 | 46,42 -> 46,952 252 | 955,13 -> 39,929 253 | 677,482 -> 208,482 254 | 414,268 -> 927,268 255 | 101,509 -> 101,149 256 | 946,971 -> 139,164 257 | 223,597 -> 223,517 258 | 805,896 -> 796,896 259 | 565,875 -> 878,875 260 | 472,431 -> 472,732 261 | 643,15 -> 643,202 262 | 618,725 -> 618,284 263 | 376,532 -> 376,120 264 | 807,981 -> 415,981 265 | 716,401 -> 61,401 266 | 893,955 -> 743,805 267 | 264,935 -> 264,677 268 | 586,908 -> 638,908 269 | 780,277 -> 780,418 270 | 234,410 -> 428,410 271 | 899,214 -> 899,703 272 | 948,51 -> 948,509 273 | 238,664 -> 879,23 274 | 20,877 -> 638,877 275 | 146,738 -> 109,738 276 | 670,893 -> 524,893 277 | 317,423 -> 27,713 278 | 91,600 -> 477,986 279 | 902,63 -> 902,797 280 | 647,839 -> 647,667 281 | 227,358 -> 236,349 282 | 985,541 -> 660,866 283 | 86,562 -> 86,949 284 | 368,851 -> 863,356 285 | 327,905 -> 57,635 286 | 561,275 -> 781,495 287 | 196,65 -> 626,65 288 | 110,688 -> 720,78 289 | 720,472 -> 115,472 290 | 817,135 -> 817,876 291 | 752,387 -> 752,104 292 | 78,127 -> 635,684 293 | 812,170 -> 155,170 294 | 606,718 -> 804,916 295 | 843,494 -> 979,494 296 | 919,346 -> 454,346 297 | 866,828 -> 818,828 298 | 114,115 -> 114,250 299 | 895,308 -> 370,308 300 | 665,893 -> 690,893 301 | 939,275 -> 741,275 302 | 290,321 -> 290,910 303 | 747,327 -> 107,967 304 | 734,715 -> 391,372 305 | 368,497 -> 506,359 306 | 773,945 -> 391,563 307 | 772,537 -> 733,537 308 | 271,679 -> 488,679 309 | 665,745 -> 665,984 310 | 143,177 -> 685,719 311 | 671,860 -> 147,860 312 | 674,365 -> 857,182 313 | 343,74 -> 985,716 314 | 284,46 -> 180,46 315 | 595,800 -> 20,225 316 | 57,278 -> 792,278 317 | 649,285 -> 165,769 318 | 600,24 -> 600,116 319 | 862,939 -> 862,871 320 | 153,917 -> 682,388 321 | 117,884 -> 257,884 322 | 726,763 -> 531,763 323 | 810,985 -> 899,985 324 | 718,942 -> 718,466 325 | 674,19 -> 674,203 326 | 117,677 -> 117,918 327 | 928,261 -> 928,945 328 | 719,390 -> 719,321 329 | 822,601 -> 484,263 330 | 725,793 -> 725,111 331 | 201,745 -> 588,745 332 | 404,889 -> 908,385 333 | 981,39 -> 610,410 334 | 148,426 -> 711,989 335 | 128,260 -> 319,451 336 | 325,306 -> 325,585 337 | 557,415 -> 557,745 338 | 915,101 -> 648,101 339 | 104,636 -> 104,520 340 | 93,964 -> 641,416 341 | 201,709 -> 201,90 342 | 921,571 -> 798,571 343 | 313,624 -> 313,510 344 | 343,649 -> 28,649 345 | 688,246 -> 24,910 346 | 696,610 -> 353,610 347 | 126,310 -> 126,394 348 | 457,98 -> 457,981 349 | 277,707 -> 277,531 350 | 943,721 -> 37,721 351 | 959,295 -> 702,295 352 | 23,547 -> 891,547 353 | 209,114 -> 931,836 354 | 737,174 -> 737,195 355 | 208,890 -> 115,797 356 | 170,401 -> 726,401 357 | 11,218 -> 11,297 358 | 989,10 -> 10,989 359 | 866,86 -> 487,86 360 | 867,31 -> 867,334 361 | 846,414 -> 861,414 362 | 478,315 -> 478,697 363 | 572,843 -> 731,843 364 | 657,12 -> 161,508 365 | 903,194 -> 142,955 366 | 612,321 -> 147,786 367 | 813,920 -> 259,920 368 | 834,389 -> 651,206 369 | 824,153 -> 824,557 370 | 399,871 -> 115,871 371 | 270,785 -> 270,120 372 | 469,640 -> 753,640 373 | 620,132 -> 620,175 374 | 620,234 -> 666,234 375 | 594,409 -> 948,55 376 | 670,323 -> 670,89 377 | 262,65 -> 262,379 378 | 879,617 -> 284,22 379 | 493,423 -> 761,423 380 | 17,931 -> 906,42 381 | 512,494 -> 473,494 382 | 122,230 -> 122,87 383 | 15,207 -> 533,207 384 | 216,183 -> 50,183 385 | 360,107 -> 280,107 386 | 403,841 -> 941,841 387 | 913,442 -> 500,29 388 | 864,947 -> 864,85 389 | 500,516 -> 634,382 390 | 283,20 -> 669,20 391 | 916,770 -> 176,30 392 | 966,73 -> 252,787 393 | 847,841 -> 171,165 394 | 163,219 -> 766,219 395 | 482,515 -> 275,308 396 | 528,949 -> 240,949 397 | 725,574 -> 847,696 398 | 109,131 -> 109,538 399 | 655,837 -> 476,837 400 | 803,631 -> 803,51 401 | 977,83 -> 149,911 402 | 207,231 -> 171,231 403 | 617,29 -> 617,294 404 | 838,708 -> 446,708 405 | 711,597 -> 612,498 406 | 975,942 -> 279,246 407 | 315,128 -> 315,293 408 | 146,962 -> 873,235 409 | 448,180 -> 54,180 410 | 177,680 -> 866,680 411 | 891,265 -> 741,265 412 | 656,949 -> 414,949 413 | 909,456 -> 196,456 414 | 574,286 -> 58,286 415 | 861,691 -> 861,383 416 | 779,351 -> 779,827 417 | 459,989 -> 459,350 418 | 936,480 -> 936,699 419 | 645,309 -> 348,606 420 | 861,62 -> 621,302 421 | 568,324 -> 568,358 422 | 889,221 -> 889,335 423 | 538,759 -> 538,266 424 | 780,736 -> 780,827 425 | 866,518 -> 983,401 426 | 67,871 -> 840,98 427 | 432,664 -> 664,664 428 | 146,24 -> 755,24 429 | 964,585 -> 964,770 430 | 372,144 -> 809,144 431 | 688,827 -> 867,827 432 | 137,916 -> 137,942 433 | 846,131 -> 846,46 434 | 764,21 -> 457,328 435 | 140,66 -> 799,725 436 | 703,224 -> 83,844 437 | 557,67 -> 557,681 438 | 355,544 -> 764,135 439 | 625,893 -> 126,394 440 | 842,214 -> 842,322 441 | 582,778 -> 582,762 442 | 341,861 -> 341,859 443 | 143,767 -> 52,858 444 | 114,109 -> 114,200 445 | 394,210 -> 396,212 446 | 861,353 -> 861,652 447 | 873,553 -> 62,553 448 | 44,962 -> 984,22 449 | 734,56 -> 734,828 450 | 798,516 -> 950,516 451 | 367,755 -> 367,618 452 | 868,637 -> 868,780 453 | 192,952 -> 192,734 454 | 603,109 -> 705,211 455 | 12,17 -> 984,989 456 | 910,147 -> 910,620 457 | 515,749 -> 515,517 458 | 775,136 -> 761,150 459 | 662,636 -> 662,21 460 | 894,490 -> 310,490 461 | 956,732 -> 297,73 462 | 514,99 -> 140,99 463 | 308,419 -> 691,419 464 | 485,86 -> 485,187 465 | 737,783 -> 979,783 466 | 90,76 -> 869,855 467 | 959,112 -> 84,112 468 | 879,494 -> 879,257 469 | 933,425 -> 933,619 470 | 64,391 -> 64,21 471 | 106,305 -> 253,452 472 | 324,152 -> 853,152 473 | 666,225 -> 39,852 474 | 370,904 -> 257,791 475 | 592,845 -> 592,15 476 | 936,971 -> 267,302 477 | 147,210 -> 62,210 478 | 308,323 -> 495,323 479 | 212,918 -> 110,918 480 | 229,392 -> 685,848 481 | 896,132 -> 326,702 482 | 483,143 -> 605,265 483 | 251,317 -> 130,317 484 | 758,93 -> 445,93 485 | 156,286 -> 458,286 486 | 401,904 -> 383,904 487 | 244,256 -> 851,256 488 | 928,411 -> 612,411 489 | 642,920 -> 642,420 490 | 494,707 -> 494,225 491 | 87,112 -> 87,256 492 | 972,907 -> 83,18 493 | 139,104 -> 139,761 494 | 493,725 -> 493,529 495 | 981,145 -> 459,667 496 | 390,240 -> 702,240 497 | 466,982 -> 807,982 498 | 320,143 -> 692,515 499 | 477,649 -> 477,206 500 | 456,254 -> 456,578 501 | -------------------------------------------------------------------------------- /day02/input.txt: -------------------------------------------------------------------------------- 1 | forward 4 2 | forward 6 3 | down 8 4 | forward 3 5 | forward 9 6 | down 7 7 | down 7 8 | down 1 9 | forward 1 10 | forward 5 11 | up 4 12 | forward 3 13 | forward 9 14 | forward 5 15 | down 8 16 | forward 6 17 | forward 8 18 | up 4 19 | forward 1 20 | forward 4 21 | up 3 22 | down 2 23 | down 2 24 | up 8 25 | forward 9 26 | down 5 27 | down 6 28 | down 4 29 | forward 1 30 | forward 7 31 | down 1 32 | forward 2 33 | down 7 34 | down 6 35 | forward 3 36 | forward 1 37 | down 7 38 | forward 3 39 | up 7 40 | up 1 41 | forward 6 42 | down 8 43 | down 4 44 | down 1 45 | down 7 46 | forward 9 47 | down 2 48 | forward 9 49 | up 4 50 | down 7 51 | forward 9 52 | forward 9 53 | up 4 54 | up 7 55 | up 2 56 | forward 1 57 | down 9 58 | forward 2 59 | forward 8 60 | forward 5 61 | down 9 62 | forward 5 63 | up 1 64 | forward 8 65 | down 6 66 | down 1 67 | down 1 68 | down 8 69 | down 6 70 | down 4 71 | down 6 72 | forward 7 73 | forward 5 74 | forward 4 75 | up 8 76 | up 4 77 | forward 6 78 | forward 9 79 | forward 6 80 | down 2 81 | up 8 82 | forward 3 83 | forward 8 84 | down 5 85 | forward 1 86 | down 6 87 | down 7 88 | up 4 89 | down 8 90 | forward 6 91 | up 4 92 | forward 7 93 | down 8 94 | down 8 95 | down 2 96 | down 8 97 | up 7 98 | forward 7 99 | forward 6 100 | down 2 101 | forward 9 102 | down 7 103 | down 4 104 | forward 1 105 | up 9 106 | down 6 107 | up 7 108 | down 6 109 | down 2 110 | down 2 111 | forward 3 112 | down 8 113 | forward 4 114 | down 7 115 | down 2 116 | up 8 117 | down 6 118 | forward 2 119 | forward 2 120 | down 6 121 | up 6 122 | down 7 123 | up 5 124 | up 4 125 | up 9 126 | forward 9 127 | forward 7 128 | down 4 129 | down 4 130 | up 5 131 | down 2 132 | forward 3 133 | down 9 134 | down 5 135 | forward 8 136 | up 3 137 | forward 7 138 | forward 9 139 | down 3 140 | forward 1 141 | up 1 142 | forward 5 143 | down 8 144 | down 2 145 | forward 3 146 | down 6 147 | down 8 148 | up 9 149 | down 9 150 | forward 4 151 | up 5 152 | forward 8 153 | forward 7 154 | forward 7 155 | down 3 156 | down 5 157 | forward 8 158 | down 1 159 | down 2 160 | forward 2 161 | up 9 162 | down 3 163 | down 9 164 | forward 2 165 | down 4 166 | up 9 167 | up 3 168 | down 1 169 | down 1 170 | forward 6 171 | down 5 172 | down 9 173 | forward 2 174 | up 5 175 | forward 3 176 | down 1 177 | down 7 178 | forward 1 179 | forward 1 180 | down 7 181 | up 3 182 | up 1 183 | up 6 184 | forward 9 185 | up 1 186 | down 8 187 | down 5 188 | up 6 189 | up 2 190 | down 8 191 | forward 3 192 | forward 1 193 | down 7 194 | up 1 195 | down 9 196 | down 9 197 | up 8 198 | forward 4 199 | up 8 200 | forward 8 201 | down 5 202 | forward 5 203 | forward 2 204 | forward 1 205 | forward 5 206 | down 8 207 | forward 6 208 | forward 8 209 | down 5 210 | forward 8 211 | up 1 212 | up 9 213 | up 7 214 | down 5 215 | down 9 216 | up 4 217 | down 7 218 | up 8 219 | up 3 220 | forward 6 221 | down 9 222 | forward 4 223 | down 4 224 | forward 2 225 | forward 3 226 | down 4 227 | down 5 228 | down 3 229 | forward 9 230 | forward 5 231 | forward 9 232 | forward 4 233 | down 5 234 | down 7 235 | down 5 236 | forward 8 237 | up 5 238 | down 2 239 | forward 3 240 | forward 4 241 | down 5 242 | up 8 243 | forward 5 244 | down 2 245 | up 4 246 | down 5 247 | down 2 248 | forward 1 249 | up 3 250 | down 6 251 | down 8 252 | down 3 253 | forward 1 254 | up 5 255 | forward 1 256 | down 3 257 | forward 4 258 | down 6 259 | forward 8 260 | forward 4 261 | forward 1 262 | down 8 263 | down 2 264 | forward 8 265 | down 5 266 | forward 2 267 | forward 2 268 | down 9 269 | forward 1 270 | forward 8 271 | up 1 272 | forward 1 273 | down 1 274 | down 7 275 | down 4 276 | up 4 277 | down 3 278 | forward 1 279 | forward 9 280 | down 9 281 | up 6 282 | up 8 283 | down 2 284 | down 2 285 | down 3 286 | forward 2 287 | forward 9 288 | down 1 289 | up 9 290 | down 3 291 | down 9 292 | down 1 293 | down 7 294 | forward 9 295 | forward 7 296 | down 5 297 | down 2 298 | down 9 299 | down 2 300 | down 7 301 | up 7 302 | down 2 303 | up 3 304 | up 5 305 | forward 8 306 | up 7 307 | forward 1 308 | down 9 309 | down 9 310 | down 1 311 | forward 6 312 | down 7 313 | up 4 314 | up 4 315 | down 9 316 | up 5 317 | up 8 318 | down 3 319 | down 5 320 | forward 6 321 | up 3 322 | down 8 323 | down 5 324 | forward 9 325 | up 6 326 | forward 9 327 | forward 5 328 | up 6 329 | up 9 330 | down 2 331 | up 5 332 | forward 9 333 | down 1 334 | up 1 335 | down 9 336 | forward 4 337 | forward 4 338 | forward 8 339 | down 5 340 | down 3 341 | down 7 342 | forward 5 343 | down 6 344 | forward 3 345 | down 5 346 | down 5 347 | up 5 348 | forward 8 349 | forward 1 350 | forward 2 351 | forward 6 352 | up 1 353 | down 5 354 | down 4 355 | up 5 356 | forward 3 357 | forward 2 358 | forward 2 359 | forward 2 360 | forward 7 361 | forward 8 362 | down 2 363 | up 8 364 | forward 4 365 | down 4 366 | forward 7 367 | down 6 368 | down 7 369 | forward 5 370 | down 5 371 | forward 1 372 | down 8 373 | forward 6 374 | down 1 375 | forward 3 376 | up 3 377 | down 7 378 | down 2 379 | up 4 380 | down 3 381 | up 2 382 | up 8 383 | down 2 384 | forward 5 385 | forward 3 386 | down 9 387 | down 9 388 | up 2 389 | forward 6 390 | forward 9 391 | down 1 392 | forward 6 393 | down 4 394 | up 2 395 | down 7 396 | down 3 397 | down 3 398 | forward 2 399 | down 5 400 | down 9 401 | down 7 402 | forward 7 403 | forward 9 404 | up 8 405 | down 8 406 | down 3 407 | up 5 408 | down 9 409 | forward 8 410 | forward 8 411 | down 1 412 | forward 5 413 | forward 2 414 | forward 7 415 | down 9 416 | down 7 417 | forward 6 418 | up 9 419 | forward 3 420 | forward 5 421 | up 7 422 | down 9 423 | forward 9 424 | forward 4 425 | forward 5 426 | forward 9 427 | forward 8 428 | forward 1 429 | forward 2 430 | forward 8 431 | down 7 432 | forward 3 433 | up 2 434 | up 7 435 | forward 1 436 | forward 3 437 | forward 9 438 | up 3 439 | down 2 440 | forward 3 441 | forward 6 442 | forward 3 443 | forward 3 444 | forward 3 445 | forward 1 446 | forward 1 447 | up 5 448 | down 5 449 | up 5 450 | down 5 451 | down 5 452 | forward 8 453 | forward 1 454 | down 4 455 | forward 7 456 | down 6 457 | down 1 458 | down 2 459 | down 2 460 | down 6 461 | up 8 462 | forward 3 463 | forward 2 464 | up 8 465 | up 2 466 | forward 1 467 | forward 6 468 | forward 5 469 | forward 6 470 | forward 7 471 | down 8 472 | forward 1 473 | down 4 474 | forward 2 475 | up 4 476 | forward 4 477 | down 1 478 | forward 5 479 | down 7 480 | forward 7 481 | up 7 482 | forward 1 483 | down 2 484 | forward 8 485 | forward 5 486 | up 8 487 | up 8 488 | up 2 489 | down 9 490 | forward 2 491 | down 4 492 | down 3 493 | down 5 494 | down 5 495 | down 2 496 | up 5 497 | forward 6 498 | up 7 499 | forward 8 500 | up 7 501 | down 4 502 | forward 1 503 | down 3 504 | forward 2 505 | forward 1 506 | down 2 507 | up 7 508 | forward 5 509 | up 8 510 | up 1 511 | down 4 512 | forward 6 513 | down 4 514 | up 9 515 | forward 5 516 | down 2 517 | down 7 518 | down 7 519 | forward 4 520 | forward 4 521 | forward 9 522 | down 1 523 | forward 6 524 | forward 1 525 | up 9 526 | forward 4 527 | forward 4 528 | forward 8 529 | forward 3 530 | forward 4 531 | down 3 532 | up 5 533 | up 1 534 | forward 3 535 | down 6 536 | down 4 537 | down 2 538 | forward 3 539 | forward 8 540 | up 6 541 | up 3 542 | forward 8 543 | down 3 544 | down 6 545 | forward 1 546 | up 7 547 | down 4 548 | down 5 549 | up 7 550 | forward 3 551 | up 4 552 | forward 9 553 | forward 6 554 | down 3 555 | forward 4 556 | down 6 557 | forward 1 558 | forward 6 559 | forward 4 560 | forward 2 561 | forward 1 562 | forward 3 563 | forward 1 564 | down 1 565 | down 9 566 | down 5 567 | down 7 568 | down 4 569 | down 8 570 | up 1 571 | down 6 572 | down 1 573 | forward 4 574 | down 9 575 | up 9 576 | down 6 577 | forward 6 578 | forward 8 579 | up 7 580 | forward 4 581 | down 3 582 | forward 9 583 | forward 6 584 | forward 8 585 | down 1 586 | up 2 587 | down 2 588 | down 8 589 | forward 4 590 | down 9 591 | down 3 592 | forward 5 593 | down 9 594 | down 4 595 | up 5 596 | down 8 597 | down 4 598 | down 9 599 | up 4 600 | down 5 601 | down 7 602 | down 3 603 | up 1 604 | up 1 605 | down 4 606 | down 6 607 | forward 8 608 | down 8 609 | down 6 610 | forward 6 611 | forward 9 612 | forward 3 613 | forward 3 614 | down 2 615 | down 4 616 | forward 3 617 | up 5 618 | up 3 619 | down 5 620 | down 1 621 | forward 5 622 | forward 7 623 | forward 1 624 | forward 4 625 | forward 5 626 | forward 1 627 | down 7 628 | down 8 629 | up 9 630 | down 8 631 | down 5 632 | up 3 633 | down 5 634 | down 5 635 | forward 8 636 | down 2 637 | forward 7 638 | forward 7 639 | down 1 640 | forward 2 641 | forward 7 642 | forward 5 643 | down 6 644 | forward 5 645 | down 5 646 | forward 4 647 | down 8 648 | forward 7 649 | up 5 650 | forward 5 651 | down 7 652 | down 7 653 | up 4 654 | forward 8 655 | up 1 656 | forward 3 657 | forward 7 658 | down 2 659 | forward 1 660 | down 4 661 | up 8 662 | forward 3 663 | forward 1 664 | forward 6 665 | forward 3 666 | up 4 667 | forward 3 668 | down 3 669 | forward 7 670 | forward 9 671 | forward 8 672 | down 6 673 | down 8 674 | up 6 675 | down 9 676 | forward 7 677 | forward 1 678 | up 4 679 | forward 5 680 | forward 8 681 | down 7 682 | down 9 683 | up 6 684 | up 6 685 | forward 9 686 | down 1 687 | forward 8 688 | down 9 689 | down 5 690 | forward 6 691 | forward 1 692 | down 4 693 | forward 8 694 | down 9 695 | down 4 696 | forward 5 697 | forward 7 698 | forward 3 699 | down 2 700 | forward 6 701 | forward 3 702 | forward 8 703 | down 1 704 | down 5 705 | up 6 706 | down 2 707 | down 1 708 | up 3 709 | down 7 710 | up 1 711 | forward 8 712 | down 6 713 | down 6 714 | forward 8 715 | up 3 716 | forward 8 717 | up 3 718 | forward 3 719 | forward 7 720 | forward 1 721 | down 1 722 | up 5 723 | forward 5 724 | forward 9 725 | forward 5 726 | forward 1 727 | forward 4 728 | down 8 729 | forward 2 730 | up 3 731 | forward 3 732 | down 9 733 | forward 2 734 | forward 6 735 | forward 3 736 | up 8 737 | up 1 738 | down 6 739 | forward 3 740 | down 4 741 | down 5 742 | forward 6 743 | forward 9 744 | down 4 745 | down 9 746 | down 7 747 | down 1 748 | up 3 749 | up 6 750 | forward 4 751 | forward 5 752 | down 1 753 | forward 3 754 | up 5 755 | forward 7 756 | down 9 757 | forward 5 758 | down 5 759 | down 1 760 | down 1 761 | down 1 762 | up 8 763 | down 4 764 | down 9 765 | forward 5 766 | down 5 767 | up 5 768 | up 3 769 | forward 1 770 | forward 7 771 | down 2 772 | forward 6 773 | forward 5 774 | up 4 775 | up 4 776 | forward 1 777 | down 7 778 | down 8 779 | up 3 780 | down 3 781 | up 4 782 | forward 2 783 | up 4 784 | up 4 785 | forward 8 786 | forward 1 787 | forward 2 788 | forward 7 789 | down 6 790 | forward 8 791 | forward 9 792 | forward 6 793 | forward 9 794 | down 3 795 | up 3 796 | forward 5 797 | down 1 798 | forward 1 799 | forward 4 800 | forward 2 801 | down 6 802 | up 7 803 | forward 9 804 | down 2 805 | up 5 806 | forward 6 807 | down 9 808 | down 6 809 | down 8 810 | forward 2 811 | down 7 812 | forward 6 813 | down 8 814 | forward 3 815 | forward 7 816 | forward 6 817 | down 7 818 | down 6 819 | forward 5 820 | up 8 821 | forward 6 822 | down 1 823 | up 9 824 | forward 6 825 | down 6 826 | down 5 827 | down 6 828 | up 2 829 | down 3 830 | down 7 831 | down 3 832 | forward 4 833 | up 9 834 | up 2 835 | forward 1 836 | forward 7 837 | forward 7 838 | forward 9 839 | forward 8 840 | forward 7 841 | down 3 842 | forward 4 843 | forward 8 844 | down 9 845 | forward 2 846 | forward 2 847 | up 9 848 | up 7 849 | forward 2 850 | down 8 851 | down 3 852 | down 1 853 | forward 1 854 | forward 3 855 | down 2 856 | forward 7 857 | up 4 858 | down 7 859 | down 1 860 | forward 8 861 | forward 2 862 | up 1 863 | down 5 864 | forward 8 865 | up 5 866 | up 7 867 | forward 4 868 | forward 7 869 | up 4 870 | up 3 871 | forward 5 872 | forward 9 873 | forward 1 874 | forward 3 875 | down 9 876 | up 2 877 | forward 8 878 | down 3 879 | forward 3 880 | forward 2 881 | down 8 882 | down 2 883 | down 3 884 | forward 1 885 | up 7 886 | down 1 887 | forward 3 888 | forward 8 889 | down 3 890 | down 9 891 | up 1 892 | down 9 893 | up 7 894 | up 7 895 | forward 7 896 | forward 7 897 | up 8 898 | down 2 899 | down 7 900 | down 1 901 | forward 5 902 | forward 5 903 | forward 7 904 | down 8 905 | forward 5 906 | down 9 907 | down 8 908 | forward 3 909 | up 9 910 | forward 3 911 | up 6 912 | forward 7 913 | up 7 914 | forward 3 915 | forward 2 916 | down 1 917 | down 4 918 | forward 1 919 | forward 8 920 | up 5 921 | down 5 922 | up 1 923 | down 5 924 | up 1 925 | up 6 926 | forward 5 927 | forward 5 928 | down 3 929 | down 3 930 | forward 2 931 | up 3 932 | up 2 933 | down 6 934 | down 5 935 | down 1 936 | down 1 937 | up 6 938 | forward 2 939 | forward 2 940 | up 4 941 | up 6 942 | up 6 943 | down 8 944 | up 2 945 | forward 4 946 | down 3 947 | forward 3 948 | up 4 949 | down 5 950 | forward 6 951 | forward 7 952 | up 6 953 | down 3 954 | down 7 955 | up 4 956 | down 2 957 | up 2 958 | forward 1 959 | down 8 960 | down 1 961 | down 1 962 | up 9 963 | down 1 964 | down 1 965 | up 1 966 | forward 8 967 | forward 4 968 | down 4 969 | forward 1 970 | down 4 971 | up 7 972 | forward 7 973 | forward 3 974 | down 4 975 | forward 9 976 | forward 1 977 | down 3 978 | down 2 979 | forward 7 980 | up 1 981 | forward 3 982 | up 3 983 | down 3 984 | down 7 985 | up 3 986 | up 4 987 | forward 7 988 | down 2 989 | up 2 990 | down 9 991 | up 1 992 | forward 3 993 | up 8 994 | up 8 995 | down 8 996 | down 1 997 | up 8 998 | up 4 999 | down 6 1000 | forward 8 1001 | -------------------------------------------------------------------------------- /day03/input.txt: -------------------------------------------------------------------------------- 1 | 000110010001 2 | 101000110000 3 | 000110010111 4 | 100011100010 5 | 111001100001 6 | 001010001010 7 | 010100100101 8 | 011000010000 9 | 111111011010 10 | 001111011101 11 | 011011010010 12 | 001100010101 13 | 001010101100 14 | 000000000000 15 | 100010111111 16 | 100100110011 17 | 111100100001 18 | 011110001110 19 | 000110100101 20 | 011101111001 21 | 111101110110 22 | 101001001111 23 | 010111100010 24 | 001110100011 25 | 110010111101 26 | 110000001101 27 | 110110111101 28 | 101100000110 29 | 101101010110 30 | 001011001110 31 | 111110000111 32 | 011110010110 33 | 011001110100 34 | 110101101110 35 | 101110001100 36 | 100111000010 37 | 101111010001 38 | 111110000101 39 | 010100111111 40 | 010110111011 41 | 000000100101 42 | 001000101011 43 | 011100101110 44 | 010011000100 45 | 110011100001 46 | 100100101110 47 | 111101110011 48 | 010100010010 49 | 110100010000 50 | 000101001101 51 | 101010110100 52 | 000011100110 53 | 000100110100 54 | 111001011001 55 | 010101001110 56 | 110100110100 57 | 111010001010 58 | 111111101111 59 | 111000011001 60 | 111110000000 61 | 011111111011 62 | 010100100001 63 | 010110100100 64 | 110000011110 65 | 001100101101 66 | 010011001000 67 | 101110110110 68 | 001001011011 69 | 100100101101 70 | 001111000100 71 | 101001010000 72 | 110101010010 73 | 101111100101 74 | 001011101010 75 | 001110010111 76 | 100111111000 77 | 010010110110 78 | 000100100010 79 | 010111100100 80 | 001000100001 81 | 101100100111 82 | 111001000001 83 | 110010111100 84 | 000110011101 85 | 000001010010 86 | 001010010111 87 | 001101000100 88 | 000110111101 89 | 111011011000 90 | 011110101000 91 | 100101000011 92 | 001000011100 93 | 111101001001 94 | 000011110011 95 | 011010101001 96 | 000111000101 97 | 011000011001 98 | 011010010100 99 | 010110001110 100 | 011010010110 101 | 111010111110 102 | 010101000010 103 | 100010011100 104 | 110001111100 105 | 100101100001 106 | 010001110010 107 | 001000010011 108 | 111010011101 109 | 110001111000 110 | 101100010011 111 | 010000010110 112 | 101011001101 113 | 000110000101 114 | 010000101111 115 | 001100010100 116 | 100110010111 117 | 010000010001 118 | 011100100101 119 | 110011010000 120 | 111101001110 121 | 001101110010 122 | 000011000110 123 | 011000010111 124 | 000101010000 125 | 101111110110 126 | 101001011000 127 | 111010001000 128 | 001100100010 129 | 111100001100 130 | 011000001100 131 | 111010110100 132 | 011111010110 133 | 111011100000 134 | 110010110110 135 | 100111001101 136 | 101111111010 137 | 000101101110 138 | 011011000111 139 | 110001101100 140 | 001110001110 141 | 100100001011 142 | 111000001110 143 | 110000111111 144 | 100110111111 145 | 100100000011 146 | 111101110001 147 | 000100001111 148 | 000101000111 149 | 001011000111 150 | 010011001100 151 | 100001101110 152 | 111100001010 153 | 110100101101 154 | 100111100001 155 | 011000100111 156 | 101010010010 157 | 111101000111 158 | 000010110101 159 | 001100010010 160 | 001111111101 161 | 001101111011 162 | 001011101110 163 | 011100000111 164 | 110010111111 165 | 100110110101 166 | 100110000001 167 | 001011100010 168 | 100010111000 169 | 000000111000 170 | 111010100100 171 | 010101101110 172 | 100111011111 173 | 111101010100 174 | 010000111011 175 | 000101100001 176 | 101010100000 177 | 101110111100 178 | 010000011011 179 | 000101110110 180 | 100110000000 181 | 001001001001 182 | 110110101100 183 | 001100110011 184 | 100111001111 185 | 110111011101 186 | 001110110010 187 | 001010110000 188 | 001001100101 189 | 111100101101 190 | 100001111100 191 | 011001011110 192 | 010010100010 193 | 001011100100 194 | 000100111010 195 | 010110011100 196 | 011100000101 197 | 001110101010 198 | 010011101010 199 | 000011010001 200 | 011101101100 201 | 110100101001 202 | 101011110110 203 | 001010010101 204 | 111110011010 205 | 011001101111 206 | 001000111111 207 | 000011101101 208 | 010001001001 209 | 111011000010 210 | 001011110010 211 | 010000011001 212 | 110000110001 213 | 011001001000 214 | 110011011000 215 | 110101011001 216 | 100000100011 217 | 010011001111 218 | 100100101000 219 | 111111111100 220 | 011011010101 221 | 101100101010 222 | 111110011111 223 | 010101001000 224 | 011110100000 225 | 101001111111 226 | 110000101110 227 | 101011101110 228 | 101111001110 229 | 100000101101 230 | 010010001011 231 | 010100110111 232 | 111011110001 233 | 000100000010 234 | 100000111000 235 | 111111111000 236 | 110111100111 237 | 000001101101 238 | 100001110011 239 | 011010111110 240 | 100111111100 241 | 111111001010 242 | 001001000100 243 | 010010101101 244 | 110100100000 245 | 100010011111 246 | 010000000110 247 | 110111010111 248 | 101000001000 249 | 100100101001 250 | 001001000010 251 | 001111111010 252 | 001011011000 253 | 100010001111 254 | 110011101110 255 | 010111001110 256 | 001011010011 257 | 111011011011 258 | 010100100100 259 | 101011000111 260 | 000011111111 261 | 000110000111 262 | 110000110100 263 | 100101011011 264 | 001001110110 265 | 011100001001 266 | 001111110100 267 | 001111001101 268 | 110010011001 269 | 000100001001 270 | 000110010110 271 | 100001001010 272 | 011100111000 273 | 011101010111 274 | 011111000110 275 | 001000001001 276 | 110011000101 277 | 111111011011 278 | 111110010011 279 | 101111100000 280 | 101011000100 281 | 111110011101 282 | 010100101010 283 | 101011110000 284 | 000100010100 285 | 110110010010 286 | 100011001101 287 | 110110011010 288 | 011100111011 289 | 001111100001 290 | 110011100101 291 | 111001101011 292 | 010000110101 293 | 100100011100 294 | 111000111001 295 | 111000001011 296 | 010110100011 297 | 110011010100 298 | 010011101111 299 | 011011110111 300 | 010101101010 301 | 000000100100 302 | 100111011101 303 | 001101011000 304 | 110111000101 305 | 001011110100 306 | 001100000100 307 | 101010110010 308 | 011000100000 309 | 011001010100 310 | 111100000000 311 | 000100011000 312 | 001000111000 313 | 101101110010 314 | 000100011001 315 | 000100101001 316 | 010010010101 317 | 100010101101 318 | 100010010110 319 | 110101110000 320 | 100011100110 321 | 010010011100 322 | 010001011011 323 | 011100000110 324 | 101000101011 325 | 111010010000 326 | 011100111001 327 | 100001100110 328 | 111100000110 329 | 100001011100 330 | 111001110101 331 | 111011100111 332 | 110101010001 333 | 111100011000 334 | 100111101010 335 | 011110110000 336 | 001011000101 337 | 011010011111 338 | 111100111110 339 | 010100011010 340 | 000010011101 341 | 000110000110 342 | 011001010001 343 | 111000011100 344 | 000111010110 345 | 000000110101 346 | 010011101011 347 | 110011001110 348 | 011011110110 349 | 101100010101 350 | 000011011001 351 | 001100101011 352 | 101000010101 353 | 101100011010 354 | 000111111110 355 | 000011001001 356 | 111011101110 357 | 100111111010 358 | 000101000011 359 | 111100010011 360 | 010001101010 361 | 101001011110 362 | 110010110000 363 | 110101101001 364 | 000011101110 365 | 101101001010 366 | 110100001101 367 | 011100000011 368 | 100011100101 369 | 111010100110 370 | 100010110001 371 | 001011010000 372 | 001001010100 373 | 100101110100 374 | 100100001111 375 | 001000001010 376 | 111001000101 377 | 110110100000 378 | 001010100010 379 | 100100001110 380 | 100111010010 381 | 010110111000 382 | 010100001010 383 | 000010101100 384 | 001010111100 385 | 001111101001 386 | 101011111101 387 | 011011001001 388 | 101000100110 389 | 001010011101 390 | 001011110000 391 | 111110100000 392 | 101100111010 393 | 101111010111 394 | 011000000101 395 | 101100000010 396 | 010101111110 397 | 000011011100 398 | 111110111010 399 | 011110101110 400 | 111011100010 401 | 111100010001 402 | 100000100110 403 | 010111010000 404 | 100010100101 405 | 010111101010 406 | 011011111111 407 | 110111101000 408 | 100000010000 409 | 001011000010 410 | 001001100011 411 | 001000100110 412 | 001001001011 413 | 011110101101 414 | 010111111101 415 | 100100111100 416 | 000011001101 417 | 010101100000 418 | 111100011100 419 | 010111001010 420 | 001101010011 421 | 111011101111 422 | 000000111101 423 | 100000110110 424 | 010000001101 425 | 011110001011 426 | 111100111100 427 | 100101111110 428 | 001000110010 429 | 101011010000 430 | 000101001111 431 | 100001101101 432 | 011011110001 433 | 010010110010 434 | 111011110111 435 | 000001110110 436 | 100110011110 437 | 101100110011 438 | 011011011010 439 | 100100101010 440 | 011011000110 441 | 000100100011 442 | 100101101001 443 | 100110110000 444 | 100100011001 445 | 001010010001 446 | 000001011101 447 | 010011011010 448 | 010101100101 449 | 111101111011 450 | 010100111011 451 | 111000001001 452 | 101100110101 453 | 011111101010 454 | 111110110111 455 | 111111110000 456 | 011001001100 457 | 110001100100 458 | 001000000011 459 | 000110001010 460 | 111000010100 461 | 010101000000 462 | 101001100000 463 | 001010010010 464 | 010001100000 465 | 001000101110 466 | 110111100001 467 | 001111000010 468 | 100111111101 469 | 010111101110 470 | 000110000011 471 | 011100111101 472 | 000011001111 473 | 011101100110 474 | 011110111110 475 | 000010001010 476 | 111101001100 477 | 101101110011 478 | 001000101111 479 | 001011001000 480 | 010110100101 481 | 000110110010 482 | 101101001000 483 | 010100100000 484 | 001111011110 485 | 111001111111 486 | 110010011101 487 | 011010110001 488 | 101101111010 489 | 011000110110 490 | 011101011111 491 | 000011000111 492 | 011010101101 493 | 010000100110 494 | 111001101110 495 | 100001110100 496 | 111100110110 497 | 000001101011 498 | 011111000011 499 | 010001011001 500 | 101010001000 501 | 001100111001 502 | 101111111111 503 | 100000001101 504 | 110011000000 505 | 111000101011 506 | 110001010110 507 | 011100010001 508 | 110110100110 509 | 000010010100 510 | 000001000101 511 | 110111101011 512 | 101110011011 513 | 010010111000 514 | 110000101101 515 | 110100011101 516 | 000111110001 517 | 110001001010 518 | 011000111110 519 | 100111010110 520 | 111100111000 521 | 000010101001 522 | 111100100101 523 | 100110111001 524 | 001001010000 525 | 101110000010 526 | 110011110101 527 | 100010011101 528 | 011000100101 529 | 101011001000 530 | 100111011000 531 | 110101011111 532 | 111100010110 533 | 111001100110 534 | 001110001000 535 | 110110101001 536 | 111001011010 537 | 101011100101 538 | 001101100001 539 | 000111000110 540 | 110001110110 541 | 111100101011 542 | 100010100100 543 | 000101110001 544 | 011101001000 545 | 001110001100 546 | 100100001010 547 | 101010101111 548 | 100011010011 549 | 010001111101 550 | 100101001001 551 | 111110101111 552 | 010011000101 553 | 000110111011 554 | 101101100011 555 | 000110110110 556 | 100000110000 557 | 000001000001 558 | 011111010111 559 | 111110010101 560 | 111101011011 561 | 101011110111 562 | 001000011111 563 | 010010010000 564 | 110110110010 565 | 000110100000 566 | 010010110101 567 | 110110001111 568 | 101111101000 569 | 110101110101 570 | 001100111110 571 | 100101101110 572 | 101111110101 573 | 000111101001 574 | 001011011111 575 | 111011001011 576 | 001001101100 577 | 010101111010 578 | 111110001100 579 | 100010111100 580 | 011000110111 581 | 111111101100 582 | 101001100001 583 | 110000110111 584 | 100010101000 585 | 010010100011 586 | 101110011001 587 | 011101001001 588 | 110000000110 589 | 000110000010 590 | 000111111101 591 | 110001001100 592 | 001001101010 593 | 101010011010 594 | 101100111101 595 | 110010100010 596 | 000101110101 597 | 000000010101 598 | 101010110000 599 | 101010110001 600 | 101001001100 601 | 010001101110 602 | 010011111001 603 | 010010111011 604 | 001110110101 605 | 101000000110 606 | 101110000101 607 | 110110001101 608 | 101000100000 609 | 011001100110 610 | 101111100110 611 | 111110001010 612 | 110010101011 613 | 100111000111 614 | 111001111101 615 | 100001011111 616 | 101101101110 617 | 010100100010 618 | 111100111011 619 | 001011100110 620 | 000001011010 621 | 101111100010 622 | 110000000000 623 | 111100010101 624 | 110100001001 625 | 100010011010 626 | 111000110010 627 | 101000110011 628 | 111101011111 629 | 100011111011 630 | 101001100111 631 | 011011111101 632 | 111011010111 633 | 011101010011 634 | 010010000111 635 | 110011111101 636 | 011101011101 637 | 010101100111 638 | 010111000000 639 | 100111000001 640 | 001110101101 641 | 000111101110 642 | 000100110000 643 | 001110110111 644 | 010000111010 645 | 001010001001 646 | 101001000111 647 | 111010100010 648 | 110001000011 649 | 011111010000 650 | 000110010000 651 | 001001011111 652 | 000100011111 653 | 110001010011 654 | 110000010011 655 | 000011010101 656 | 100101001110 657 | 101110010101 658 | 000011110000 659 | 011111100111 660 | 001111101100 661 | 101111101100 662 | 101110111101 663 | 110111111001 664 | 011110111101 665 | 111110010111 666 | 101110100001 667 | 000110100010 668 | 011000001000 669 | 111000110101 670 | 101000011100 671 | 100110010100 672 | 001111111111 673 | 111001111001 674 | 111111000110 675 | 000110100100 676 | 111000110000 677 | 110011010110 678 | 001010011001 679 | 101000011011 680 | 100011111111 681 | 011001100000 682 | 110100101100 683 | 001001111000 684 | 000100001100 685 | 010101000001 686 | 101010110111 687 | 100110100000 688 | 100110000011 689 | 111101000011 690 | 001101001010 691 | 000000011111 692 | 000101000110 693 | 001110111001 694 | 101110001011 695 | 001111011010 696 | 000100110010 697 | 010011011001 698 | 011100101001 699 | 010110011001 700 | 001011001101 701 | 011110100010 702 | 011000011100 703 | 001001110010 704 | 100000000010 705 | 010111010010 706 | 000010100000 707 | 011000011110 708 | 010100110010 709 | 010101010001 710 | 011010101100 711 | 000100100001 712 | 110101001011 713 | 111110111101 714 | 010100100110 715 | 110010000100 716 | 000101010001 717 | 110100000001 718 | 001010100011 719 | 011101100101 720 | 010101011110 721 | 010101110101 722 | 010101011100 723 | 010011001010 724 | 010011110001 725 | 111111100000 726 | 011110111010 727 | 110010101010 728 | 001111010001 729 | 111110111110 730 | 110001010101 731 | 001011010001 732 | 110111000110 733 | 000011010011 734 | 000001101001 735 | 011010100100 736 | 100000010111 737 | 000000100001 738 | 110000110010 739 | 001101111101 740 | 101011111111 741 | 100100100010 742 | 000001110111 743 | 001111110101 744 | 001111000011 745 | 101000111100 746 | 100100101111 747 | 111000000101 748 | 000011100011 749 | 110101100010 750 | 110001010111 751 | 011000111100 752 | 010000011111 753 | 000001011000 754 | 110011100000 755 | 111100100111 756 | 000010001011 757 | 100111101001 758 | 011111100000 759 | 101101111001 760 | 101100101100 761 | 001000110100 762 | 111111010111 763 | 000110001101 764 | 011111100001 765 | 111000001100 766 | 000111100100 767 | 001111000000 768 | 000101110010 769 | 101100011001 770 | 000001000100 771 | 001001001101 772 | 111001010101 773 | 000011111011 774 | 011111110000 775 | 000000110001 776 | 100111110011 777 | 101001001011 778 | 101000110110 779 | 111001010100 780 | 000011110100 781 | 010001100001 782 | 001111001110 783 | 100001101001 784 | 000001101111 785 | 101000000001 786 | 111101010000 787 | 011111011001 788 | 111111011110 789 | 110110010110 790 | 001011101100 791 | 100001010111 792 | 101011011100 793 | 110010101001 794 | 001000001100 795 | 001101010101 796 | 111111111110 797 | 001100100011 798 | 110000110110 799 | 000000000110 800 | 101000001010 801 | 001111001100 802 | 100011110001 803 | 111011000001 804 | 011010100110 805 | 011110100100 806 | 001110011111 807 | 010101101011 808 | 010110010111 809 | 101100110110 810 | 000101100010 811 | 110010010000 812 | 010100010000 813 | 111011000111 814 | 011010111011 815 | 100000100111 816 | 001111011000 817 | 001010111011 818 | 000010111111 819 | 110001000101 820 | 000111010101 821 | 010011110111 822 | 111010110000 823 | 100111110110 824 | 101011010001 825 | 011001111111 826 | 110110100010 827 | 110111110110 828 | 011010110111 829 | 111000100011 830 | 100010011000 831 | 111001000010 832 | 000100000111 833 | 011101001010 834 | 111001000111 835 | 000110010100 836 | 011011010110 837 | 100100110100 838 | 010011000001 839 | 101000111011 840 | 100100000000 841 | 010010101110 842 | 011111001101 843 | 001100001100 844 | 010111100001 845 | 100101101010 846 | 100110001101 847 | 010111000101 848 | 010100011011 849 | 000010000011 850 | 111000111111 851 | 100111011100 852 | 111110011011 853 | 011110110110 854 | 001000001111 855 | 100110110111 856 | 100000001011 857 | 001111001011 858 | 010010111101 859 | 010001111000 860 | 110010110101 861 | 011001100101 862 | 100110001111 863 | 110001101010 864 | 000100101011 865 | 101110111010 866 | 011111100011 867 | 101010111111 868 | 011101100001 869 | 100000001010 870 | 010000001000 871 | 110110001010 872 | 110001010010 873 | 101001111001 874 | 000100001101 875 | 111100001111 876 | 111101000110 877 | 001010111001 878 | 000101011010 879 | 101001010010 880 | 101011110001 881 | 011011110101 882 | 110101110100 883 | 000001111001 884 | 111000001111 885 | 101110110000 886 | 001101110101 887 | 011010110010 888 | 101000001110 889 | 100011111001 890 | 000111011101 891 | 110011010101 892 | 010111101101 893 | 000010111011 894 | 000100101010 895 | 100101100101 896 | 100000011001 897 | 010110110100 898 | 011010100000 899 | 010100010001 900 | 110010100101 901 | 010100111110 902 | 011100011101 903 | 100011110010 904 | 101000000010 905 | 011001100001 906 | 111111100100 907 | 010011000011 908 | 001101010010 909 | 111100100000 910 | 110101101111 911 | 101001110001 912 | 101100111111 913 | 010111110010 914 | 100011000100 915 | 101101001101 916 | 000000101001 917 | 110100110000 918 | 000110010010 919 | 100111001110 920 | 110011100110 921 | 010110100010 922 | 000111010100 923 | 001101000001 924 | 111010000011 925 | 011001010110 926 | 101000100010 927 | 111010001001 928 | 010101100001 929 | 011001110010 930 | 000111000111 931 | 110001010001 932 | 000111010001 933 | 000001111100 934 | 010001000001 935 | 100110000010 936 | 111111000111 937 | 110111001111 938 | 010010001001 939 | 001001101111 940 | 000110101111 941 | 110011011111 942 | 100010100111 943 | 001010000010 944 | 000000110110 945 | 111111111101 946 | 011111101111 947 | 100111101111 948 | 111111110111 949 | 101111011001 950 | 111010111011 951 | 001001111110 952 | 000010001100 953 | 111011001111 954 | 111111100011 955 | 100010010011 956 | 101110101011 957 | 111010111111 958 | 001111000110 959 | 110000001100 960 | 100110100110 961 | 001110001101 962 | 001000111100 963 | 010011000110 964 | 011011011100 965 | 110110011001 966 | 001000111010 967 | 101100000011 968 | 110100111101 969 | 011100001011 970 | 011101000100 971 | 011100010011 972 | 101001000001 973 | 000001101010 974 | 110000001010 975 | 010100010100 976 | 101001100110 977 | 000100100101 978 | 001000111101 979 | 101101011111 980 | 011001000010 981 | 101000100001 982 | 111110100011 983 | 111101010010 984 | 110111010101 985 | 010111110100 986 | 010001010001 987 | 010110011110 988 | 101001010001 989 | 100110111100 990 | 110011100010 991 | 010110001011 992 | 110001001101 993 | 001100100111 994 | 001001001111 995 | 011000110100 996 | 000010010001 997 | 101010101110 998 | 111100111111 999 | 000010100010 1000 | 011010111101 1001 | -------------------------------------------------------------------------------- /day01/input.txt: -------------------------------------------------------------------------------- 1 | 162 2 | 164 3 | 165 4 | 166 5 | 175 6 | 185 7 | 182 8 | 191 9 | 205 10 | 204 11 | 198 12 | 196 13 | 197 14 | 213 15 | 216 16 | 217 17 | 218 18 | 219 19 | 213 20 | 219 21 | 221 22 | 222 23 | 227 24 | 231 25 | 221 26 | 211 27 | 230 28 | 232 29 | 241 30 | 243 31 | 256 32 | 272 33 | 274 34 | 273 35 | 279 36 | 287 37 | 288 38 | 287 39 | 286 40 | 288 41 | 289 42 | 291 43 | 292 44 | 294 45 | 292 46 | 296 47 | 307 48 | 314 49 | 326 50 | 332 51 | 337 52 | 347 53 | 330 54 | 333 55 | 346 56 | 344 57 | 357 58 | 362 59 | 365 60 | 366 61 | 328 62 | 323 63 | 350 64 | 362 65 | 336 66 | 346 67 | 348 68 | 325 69 | 329 70 | 330 71 | 329 72 | 333 73 | 365 74 | 363 75 | 376 76 | 377 77 | 369 78 | 343 79 | 365 80 | 360 81 | 362 82 | 377 83 | 376 84 | 379 85 | 374 86 | 376 87 | 377 88 | 369 89 | 371 90 | 374 91 | 375 92 | 377 93 | 384 94 | 401 95 | 372 96 | 374 97 | 363 98 | 372 99 | 363 100 | 377 101 | 342 102 | 340 103 | 342 104 | 344 105 | 345 106 | 351 107 | 352 108 | 353 109 | 354 110 | 330 111 | 332 112 | 324 113 | 326 114 | 335 115 | 327 116 | 324 117 | 316 118 | 324 119 | 308 120 | 311 121 | 302 122 | 314 123 | 328 124 | 340 125 | 341 126 | 338 127 | 336 128 | 337 129 | 335 130 | 323 131 | 327 132 | 321 133 | 322 134 | 302 135 | 315 136 | 289 137 | 288 138 | 287 139 | 300 140 | 294 141 | 298 142 | 297 143 | 288 144 | 289 145 | 290 146 | 288 147 | 287 148 | 283 149 | 292 150 | 306 151 | 304 152 | 306 153 | 326 154 | 336 155 | 337 156 | 340 157 | 343 158 | 352 159 | 374 160 | 373 161 | 377 162 | 357 163 | 352 164 | 357 165 | 360 166 | 373 167 | 375 168 | 377 169 | 380 170 | 384 171 | 407 172 | 409 173 | 402 174 | 405 175 | 403 176 | 426 177 | 429 178 | 428 179 | 431 180 | 399 181 | 393 182 | 399 183 | 401 184 | 418 185 | 420 186 | 421 187 | 440 188 | 446 189 | 447 190 | 450 191 | 448 192 | 463 193 | 456 194 | 458 195 | 421 196 | 409 197 | 407 198 | 394 199 | 414 200 | 412 201 | 417 202 | 418 203 | 413 204 | 414 205 | 417 206 | 418 207 | 427 208 | 426 209 | 425 210 | 426 211 | 424 212 | 431 213 | 450 214 | 448 215 | 470 216 | 484 217 | 489 218 | 466 219 | 477 220 | 479 221 | 488 222 | 489 223 | 494 224 | 501 225 | 502 226 | 505 227 | 509 228 | 514 229 | 516 230 | 522 231 | 533 232 | 537 233 | 536 234 | 546 235 | 549 236 | 539 237 | 522 238 | 523 239 | 537 240 | 536 241 | 555 242 | 556 243 | 554 244 | 541 245 | 555 246 | 557 247 | 558 248 | 573 249 | 574 250 | 571 251 | 572 252 | 573 253 | 581 254 | 580 255 | 572 256 | 586 257 | 579 258 | 581 259 | 589 260 | 597 261 | 593 262 | 598 263 | 599 264 | 600 265 | 614 266 | 622 267 | 623 268 | 646 269 | 642 270 | 652 271 | 653 272 | 655 273 | 657 274 | 663 275 | 665 276 | 667 277 | 669 278 | 655 279 | 642 280 | 643 281 | 645 282 | 660 283 | 661 284 | 658 285 | 656 286 | 661 287 | 673 288 | 672 289 | 673 290 | 680 291 | 690 292 | 691 293 | 699 294 | 698 295 | 702 296 | 716 297 | 757 298 | 758 299 | 759 300 | 778 301 | 792 302 | 789 303 | 790 304 | 791 305 | 797 306 | 806 307 | 809 308 | 801 309 | 800 310 | 802 311 | 805 312 | 814 313 | 811 314 | 836 315 | 827 316 | 836 317 | 848 318 | 855 319 | 856 320 | 857 321 | 859 322 | 855 323 | 858 324 | 864 325 | 866 326 | 875 327 | 877 328 | 865 329 | 871 330 | 879 331 | 862 332 | 869 333 | 872 334 | 879 335 | 881 336 | 883 337 | 872 338 | 861 339 | 869 340 | 867 341 | 871 342 | 888 343 | 889 344 | 893 345 | 894 346 | 897 347 | 885 348 | 891 349 | 890 350 | 910 351 | 907 352 | 909 353 | 915 354 | 940 355 | 941 356 | 944 357 | 947 358 | 938 359 | 935 360 | 927 361 | 922 362 | 932 363 | 933 364 | 895 365 | 896 366 | 897 367 | 922 368 | 931 369 | 927 370 | 936 371 | 938 372 | 962 373 | 972 374 | 973 375 | 1010 376 | 1003 377 | 1004 378 | 1003 379 | 1004 380 | 1007 381 | 1000 382 | 1015 383 | 1017 384 | 1006 385 | 1008 386 | 1021 387 | 1019 388 | 1018 389 | 1003 390 | 1010 391 | 1011 392 | 1016 393 | 1017 394 | 1025 395 | 1008 396 | 1001 397 | 1007 398 | 1015 399 | 1001 400 | 1004 401 | 1010 402 | 993 403 | 994 404 | 992 405 | 994 406 | 997 407 | 990 408 | 991 409 | 1018 410 | 1033 411 | 1047 412 | 1038 413 | 1037 414 | 1043 415 | 1047 416 | 1056 417 | 1042 418 | 1048 419 | 1059 420 | 1063 421 | 1045 422 | 1053 423 | 1051 424 | 1071 425 | 1060 426 | 1069 427 | 1074 428 | 1076 429 | 1082 430 | 1085 431 | 1081 432 | 1084 433 | 1089 434 | 1091 435 | 1079 436 | 1101 437 | 1100 438 | 1109 439 | 1108 440 | 1109 441 | 1100 442 | 1098 443 | 1100 444 | 1098 445 | 1099 446 | 1095 447 | 1097 448 | 1119 449 | 1115 450 | 1116 451 | 1117 452 | 1121 453 | 1126 454 | 1167 455 | 1168 456 | 1178 457 | 1180 458 | 1169 459 | 1170 460 | 1168 461 | 1169 462 | 1176 463 | 1178 464 | 1167 465 | 1169 466 | 1163 467 | 1184 468 | 1174 469 | 1175 470 | 1202 471 | 1206 472 | 1212 473 | 1213 474 | 1222 475 | 1233 476 | 1234 477 | 1216 478 | 1218 479 | 1219 480 | 1223 481 | 1222 482 | 1205 483 | 1208 484 | 1206 485 | 1207 486 | 1208 487 | 1209 488 | 1222 489 | 1223 490 | 1219 491 | 1220 492 | 1223 493 | 1228 494 | 1260 495 | 1275 496 | 1278 497 | 1263 498 | 1281 499 | 1293 500 | 1292 501 | 1307 502 | 1299 503 | 1297 504 | 1298 505 | 1295 506 | 1297 507 | 1299 508 | 1300 509 | 1301 510 | 1299 511 | 1313 512 | 1314 513 | 1319 514 | 1316 515 | 1294 516 | 1299 517 | 1315 518 | 1316 519 | 1327 520 | 1331 521 | 1332 522 | 1333 523 | 1342 524 | 1340 525 | 1327 526 | 1332 527 | 1335 528 | 1333 529 | 1353 530 | 1357 531 | 1347 532 | 1350 533 | 1351 534 | 1352 535 | 1353 536 | 1360 537 | 1361 538 | 1372 539 | 1373 540 | 1389 541 | 1404 542 | 1409 543 | 1403 544 | 1407 545 | 1412 546 | 1409 547 | 1413 548 | 1414 549 | 1416 550 | 1422 551 | 1426 552 | 1418 553 | 1436 554 | 1441 555 | 1437 556 | 1431 557 | 1407 558 | 1437 559 | 1430 560 | 1447 561 | 1453 562 | 1456 563 | 1475 564 | 1484 565 | 1486 566 | 1507 567 | 1498 568 | 1500 569 | 1496 570 | 1513 571 | 1499 572 | 1505 573 | 1506 574 | 1500 575 | 1502 576 | 1504 577 | 1506 578 | 1513 579 | 1514 580 | 1516 581 | 1508 582 | 1514 583 | 1518 584 | 1514 585 | 1510 586 | 1501 587 | 1495 588 | 1512 589 | 1513 590 | 1510 591 | 1513 592 | 1521 593 | 1520 594 | 1527 595 | 1536 596 | 1525 597 | 1534 598 | 1535 599 | 1512 600 | 1514 601 | 1520 602 | 1521 603 | 1525 604 | 1526 605 | 1527 606 | 1546 607 | 1550 608 | 1560 609 | 1564 610 | 1572 611 | 1570 612 | 1576 613 | 1584 614 | 1586 615 | 1588 616 | 1592 617 | 1588 618 | 1602 619 | 1592 620 | 1615 621 | 1589 622 | 1592 623 | 1594 624 | 1591 625 | 1595 626 | 1601 627 | 1613 628 | 1618 629 | 1623 630 | 1630 631 | 1631 632 | 1645 633 | 1602 634 | 1606 635 | 1608 636 | 1609 637 | 1610 638 | 1604 639 | 1606 640 | 1605 641 | 1621 642 | 1630 643 | 1635 644 | 1646 645 | 1648 646 | 1646 647 | 1648 648 | 1657 649 | 1687 650 | 1676 651 | 1679 652 | 1680 653 | 1683 654 | 1681 655 | 1682 656 | 1681 657 | 1682 658 | 1680 659 | 1679 660 | 1680 661 | 1682 662 | 1695 663 | 1704 664 | 1711 665 | 1714 666 | 1720 667 | 1746 668 | 1750 669 | 1748 670 | 1753 671 | 1754 672 | 1763 673 | 1765 674 | 1783 675 | 1792 676 | 1793 677 | 1798 678 | 1801 679 | 1800 680 | 1803 681 | 1784 682 | 1785 683 | 1784 684 | 1787 685 | 1790 686 | 1784 687 | 1788 688 | 1783 689 | 1785 690 | 1787 691 | 1794 692 | 1795 693 | 1798 694 | 1799 695 | 1803 696 | 1805 697 | 1806 698 | 1786 699 | 1787 700 | 1816 701 | 1812 702 | 1813 703 | 1816 704 | 1818 705 | 1812 706 | 1838 707 | 1837 708 | 1839 709 | 1832 710 | 1834 711 | 1838 712 | 1840 713 | 1855 714 | 1856 715 | 1842 716 | 1841 717 | 1850 718 | 1852 719 | 1851 720 | 1853 721 | 1859 722 | 1853 723 | 1881 724 | 1882 725 | 1886 726 | 1899 727 | 1897 728 | 1910 729 | 1906 730 | 1907 731 | 1906 732 | 1901 733 | 1896 734 | 1897 735 | 1883 736 | 1889 737 | 1890 738 | 1896 739 | 1877 740 | 1888 741 | 1889 742 | 1895 743 | 1896 744 | 1893 745 | 1858 746 | 1855 747 | 1863 748 | 1871 749 | 1878 750 | 1879 751 | 1877 752 | 1878 753 | 1874 754 | 1906 755 | 1921 756 | 1927 757 | 1924 758 | 1925 759 | 1929 760 | 1928 761 | 1933 762 | 1923 763 | 1926 764 | 1904 765 | 1892 766 | 1889 767 | 1906 768 | 1908 769 | 1909 770 | 1924 771 | 1926 772 | 1948 773 | 1949 774 | 1951 775 | 1991 776 | 1990 777 | 1996 778 | 1997 779 | 2009 780 | 2007 781 | 2006 782 | 2012 783 | 2029 784 | 2036 785 | 2039 786 | 2040 787 | 2049 788 | 2051 789 | 2052 790 | 2065 791 | 2063 792 | 2065 793 | 2064 794 | 2065 795 | 2067 796 | 2072 797 | 2069 798 | 2051 799 | 2049 800 | 2046 801 | 2045 802 | 2047 803 | 2039 804 | 2037 805 | 2041 806 | 2044 807 | 2043 808 | 2033 809 | 2034 810 | 2024 811 | 2026 812 | 2023 813 | 2013 814 | 2014 815 | 2015 816 | 2017 817 | 2019 818 | 2018 819 | 2019 820 | 2018 821 | 2020 822 | 2021 823 | 2024 824 | 2029 825 | 2017 826 | 2048 827 | 2049 828 | 2027 829 | 2028 830 | 2023 831 | 2040 832 | 2033 833 | 2037 834 | 2056 835 | 2096 836 | 2097 837 | 2093 838 | 2110 839 | 2111 840 | 2110 841 | 2120 842 | 2122 843 | 2106 844 | 2122 845 | 2124 846 | 2118 847 | 2120 848 | 2128 849 | 2127 850 | 2134 851 | 2135 852 | 2149 853 | 2151 854 | 2178 855 | 2179 856 | 2180 857 | 2179 858 | 2188 859 | 2198 860 | 2196 861 | 2204 862 | 2214 863 | 2222 864 | 2223 865 | 2222 866 | 2221 867 | 2247 868 | 2249 869 | 2257 870 | 2267 871 | 2266 872 | 2265 873 | 2268 874 | 2261 875 | 2266 876 | 2268 877 | 2269 878 | 2275 879 | 2274 880 | 2275 881 | 2289 882 | 2283 883 | 2284 884 | 2276 885 | 2278 886 | 2274 887 | 2275 888 | 2279 889 | 2280 890 | 2264 891 | 2260 892 | 2270 893 | 2274 894 | 2282 895 | 2273 896 | 2274 897 | 2270 898 | 2269 899 | 2268 900 | 2274 901 | 2280 902 | 2300 903 | 2301 904 | 2303 905 | 2301 906 | 2306 907 | 2316 908 | 2337 909 | 2349 910 | 2363 911 | 2373 912 | 2377 913 | 2381 914 | 2380 915 | 2402 916 | 2408 917 | 2407 918 | 2406 919 | 2404 920 | 2405 921 | 2409 922 | 2411 923 | 2421 924 | 2420 925 | 2419 926 | 2422 927 | 2415 928 | 2418 929 | 2426 930 | 2396 931 | 2399 932 | 2398 933 | 2411 934 | 2413 935 | 2414 936 | 2393 937 | 2400 938 | 2393 939 | 2389 940 | 2400 941 | 2404 942 | 2405 943 | 2408 944 | 2405 945 | 2409 946 | 2411 947 | 2423 948 | 2427 949 | 2428 950 | 2429 951 | 2418 952 | 2419 953 | 2426 954 | 2428 955 | 2443 956 | 2451 957 | 2464 958 | 2465 959 | 2483 960 | 2476 961 | 2479 962 | 2480 963 | 2481 964 | 2482 965 | 2476 966 | 2464 967 | 2506 968 | 2499 969 | 2500 970 | 2490 971 | 2486 972 | 2480 973 | 2481 974 | 2482 975 | 2507 976 | 2515 977 | 2519 978 | 2526 979 | 2516 980 | 2523 981 | 2530 982 | 2536 983 | 2537 984 | 2538 985 | 2555 986 | 2564 987 | 2553 988 | 2565 989 | 2548 990 | 2537 991 | 2538 992 | 2533 993 | 2537 994 | 2550 995 | 2553 996 | 2541 997 | 2543 998 | 2546 999 | 2550 1000 | 2554 1001 | 2555 1002 | 2573 1003 | 2578 1004 | 2575 1005 | 2595 1006 | 2601 1007 | 2600 1008 | 2582 1009 | 2583 1010 | 2585 1011 | 2579 1012 | 2581 1013 | 2582 1014 | 2590 1015 | 2588 1016 | 2589 1017 | 2595 1018 | 2584 1019 | 2585 1020 | 2584 1021 | 2592 1022 | 2602 1023 | 2607 1024 | 2611 1025 | 2627 1026 | 2636 1027 | 2646 1028 | 2643 1029 | 2648 1030 | 2654 1031 | 2648 1032 | 2649 1033 | 2654 1034 | 2652 1035 | 2653 1036 | 2656 1037 | 2657 1038 | 2658 1039 | 2687 1040 | 2699 1041 | 2702 1042 | 2679 1043 | 2681 1044 | 2684 1045 | 2683 1046 | 2681 1047 | 2683 1048 | 2684 1049 | 2701 1050 | 2709 1051 | 2711 1052 | 2715 1053 | 2716 1054 | 2725 1055 | 2715 1056 | 2719 1057 | 2720 1058 | 2716 1059 | 2717 1060 | 2704 1061 | 2707 1062 | 2705 1063 | 2695 1064 | 2697 1065 | 2696 1066 | 2699 1067 | 2697 1068 | 2698 1069 | 2718 1070 | 2722 1071 | 2726 1072 | 2727 1073 | 2728 1074 | 2724 1075 | 2722 1076 | 2731 1077 | 2732 1078 | 2728 1079 | 2725 1080 | 2722 1081 | 2728 1082 | 2735 1083 | 2729 1084 | 2731 1085 | 2733 1086 | 2739 1087 | 2734 1088 | 2757 1089 | 2763 1090 | 2765 1091 | 2772 1092 | 2771 1093 | 2772 1094 | 2768 1095 | 2765 1096 | 2759 1097 | 2772 1098 | 2775 1099 | 2767 1100 | 2771 1101 | 2774 1102 | 2770 1103 | 2758 1104 | 2772 1105 | 2775 1106 | 2789 1107 | 2791 1108 | 2793 1109 | 2800 1110 | 2780 1111 | 2791 1112 | 2777 1113 | 2778 1114 | 2774 1115 | 2779 1116 | 2780 1117 | 2779 1118 | 2780 1119 | 2781 1120 | 2783 1121 | 2788 1122 | 2796 1123 | 2800 1124 | 2799 1125 | 2807 1126 | 2811 1127 | 2825 1128 | 2826 1129 | 2831 1130 | 2842 1131 | 2843 1132 | 2852 1133 | 2854 1134 | 2858 1135 | 2841 1136 | 2842 1137 | 2837 1138 | 2838 1139 | 2839 1140 | 2843 1141 | 2861 1142 | 2888 1143 | 2892 1144 | 2886 1145 | 2885 1146 | 2904 1147 | 2905 1148 | 2927 1149 | 2928 1150 | 2929 1151 | 2915 1152 | 2917 1153 | 2895 1154 | 2901 1155 | 2923 1156 | 2932 1157 | 2934 1158 | 2936 1159 | 2938 1160 | 2944 1161 | 2947 1162 | 2951 1163 | 2959 1164 | 2958 1165 | 2956 1166 | 2944 1167 | 2942 1168 | 2941 1169 | 2942 1170 | 2929 1171 | 2946 1172 | 2954 1173 | 2948 1174 | 2949 1175 | 2973 1176 | 2980 1177 | 2981 1178 | 2994 1179 | 2997 1180 | 3021 1181 | 3038 1182 | 3047 1183 | 3060 1184 | 3058 1185 | 3061 1186 | 3057 1187 | 3073 1188 | 3074 1189 | 3094 1190 | 3126 1191 | 3125 1192 | 3126 1193 | 3122 1194 | 3123 1195 | 3122 1196 | 3120 1197 | 3115 1198 | 3114 1199 | 3113 1200 | 3117 1201 | 3122 1202 | 3121 1203 | 3123 1204 | 3133 1205 | 3134 1206 | 3138 1207 | 3152 1208 | 3153 1209 | 3155 1210 | 3154 1211 | 3159 1212 | 3156 1213 | 3153 1214 | 3159 1215 | 3160 1216 | 3161 1217 | 3157 1218 | 3158 1219 | 3160 1220 | 3161 1221 | 3170 1222 | 3202 1223 | 3204 1224 | 3225 1225 | 3211 1226 | 3207 1227 | 3209 1228 | 3211 1229 | 3206 1230 | 3207 1231 | 3214 1232 | 3213 1233 | 3206 1234 | 3199 1235 | 3198 1236 | 3208 1237 | 3225 1238 | 3226 1239 | 3227 1240 | 3238 1241 | 3208 1242 | 3209 1243 | 3210 1244 | 3211 1245 | 3214 1246 | 3209 1247 | 3210 1248 | 3233 1249 | 3232 1250 | 3233 1251 | 3234 1252 | 3237 1253 | 3240 1254 | 3246 1255 | 3252 1256 | 3239 1257 | 3246 1258 | 3248 1259 | 3246 1260 | 3248 1261 | 3250 1262 | 3258 1263 | 3259 1264 | 3260 1265 | 3271 1266 | 3272 1267 | 3280 1268 | 3288 1269 | 3279 1270 | 3272 1271 | 3274 1272 | 3280 1273 | 3288 1274 | 3292 1275 | 3313 1276 | 3307 1277 | 3302 1278 | 3303 1279 | 3304 1280 | 3302 1281 | 3304 1282 | 3307 1283 | 3320 1284 | 3306 1285 | 3303 1286 | 3304 1287 | 3303 1288 | 3292 1289 | 3293 1290 | 3282 1291 | 3285 1292 | 3286 1293 | 3281 1294 | 3276 1295 | 3283 1296 | 3246 1297 | 3247 1298 | 3254 1299 | 3268 1300 | 3267 1301 | 3274 1302 | 3276 1303 | 3288 1304 | 3289 1305 | 3288 1306 | 3275 1307 | 3274 1308 | 3276 1309 | 3271 1310 | 3273 1311 | 3271 1312 | 3270 1313 | 3265 1314 | 3271 1315 | 3266 1316 | 3258 1317 | 3259 1318 | 3256 1319 | 3255 1320 | 3250 1321 | 3261 1322 | 3265 1323 | 3263 1324 | 3264 1325 | 3265 1326 | 3279 1327 | 3280 1328 | 3285 1329 | 3301 1330 | 3304 1331 | 3291 1332 | 3283 1333 | 3300 1334 | 3301 1335 | 3295 1336 | 3298 1337 | 3297 1338 | 3296 1339 | 3291 1340 | 3294 1341 | 3297 1342 | 3301 1343 | 3298 1344 | 3299 1345 | 3265 1346 | 3266 1347 | 3270 1348 | 3265 1349 | 3282 1350 | 3289 1351 | 3288 1352 | 3290 1353 | 3289 1354 | 3291 1355 | 3293 1356 | 3295 1357 | 3296 1358 | 3297 1359 | 3269 1360 | 3280 1361 | 3281 1362 | 3282 1363 | 3291 1364 | 3306 1365 | 3304 1366 | 3305 1367 | 3306 1368 | 3329 1369 | 3327 1370 | 3331 1371 | 3332 1372 | 3334 1373 | 3338 1374 | 3318 1375 | 3315 1376 | 3323 1377 | 3324 1378 | 3325 1379 | 3327 1380 | 3328 1381 | 3326 1382 | 3329 1383 | 3342 1384 | 3343 1385 | 3344 1386 | 3345 1387 | 3346 1388 | 3345 1389 | 3321 1390 | 3320 1391 | 3318 1392 | 3315 1393 | 3318 1394 | 3344 1395 | 3349 1396 | 3354 1397 | 3353 1398 | 3351 1399 | 3362 1400 | 3379 1401 | 3395 1402 | 3421 1403 | 3423 1404 | 3411 1405 | 3406 1406 | 3403 1407 | 3407 1408 | 3408 1409 | 3406 1410 | 3408 1411 | 3413 1412 | 3407 1413 | 3423 1414 | 3435 1415 | 3437 1416 | 3438 1417 | 3441 1418 | 3452 1419 | 3453 1420 | 3452 1421 | 3453 1422 | 3457 1423 | 3463 1424 | 3456 1425 | 3439 1426 | 3437 1427 | 3441 1428 | 3439 1429 | 3442 1430 | 3443 1431 | 3445 1432 | 3452 1433 | 3459 1434 | 3474 1435 | 3466 1436 | 3456 1437 | 3480 1438 | 3479 1439 | 3481 1440 | 3497 1441 | 3500 1442 | 3494 1443 | 3496 1444 | 3502 1445 | 3486 1446 | 3489 1447 | 3496 1448 | 3505 1449 | 3526 1450 | 3543 1451 | 3549 1452 | 3550 1453 | 3552 1454 | 3555 1455 | 3559 1456 | 3558 1457 | 3566 1458 | 3568 1459 | 3567 1460 | 3568 1461 | 3569 1462 | 3555 1463 | 3576 1464 | 3567 1465 | 3566 1466 | 3563 1467 | 3590 1468 | 3597 1469 | 3622 1470 | 3623 1471 | 3610 1472 | 3611 1473 | 3615 1474 | 3616 1475 | 3620 1476 | 3653 1477 | 3662 1478 | 3649 1479 | 3661 1480 | 3664 1481 | 3656 1482 | 3672 1483 | 3680 1484 | 3681 1485 | 3687 1486 | 3693 1487 | 3692 1488 | 3706 1489 | 3686 1490 | 3685 1491 | 3675 1492 | 3669 1493 | 3672 1494 | 3673 1495 | 3667 1496 | 3674 1497 | 3677 1498 | 3663 1499 | 3685 1500 | 3681 1501 | 3682 1502 | 3695 1503 | 3688 1504 | 3702 1505 | 3708 1506 | 3709 1507 | 3708 1508 | 3711 1509 | 3707 1510 | 3729 1511 | 3730 1512 | 3748 1513 | 3775 1514 | 3779 1515 | 3780 1516 | 3784 1517 | 3797 1518 | 3803 1519 | 3822 1520 | 3843 1521 | 3860 1522 | 3888 1523 | 3875 1524 | 3866 1525 | 3869 1526 | 3878 1527 | 3877 1528 | 3886 1529 | 3888 1530 | 3889 1531 | 3894 1532 | 3905 1533 | 3919 1534 | 3921 1535 | 3922 1536 | 3964 1537 | 3965 1538 | 3967 1539 | 3960 1540 | 3978 1541 | 3977 1542 | 3983 1543 | 3989 1544 | 3997 1545 | 3999 1546 | 4010 1547 | 3998 1548 | 3999 1549 | 4013 1550 | 4025 1551 | 4033 1552 | 4050 1553 | 4051 1554 | 4053 1555 | 4052 1556 | 4050 1557 | 4051 1558 | 4052 1559 | 4053 1560 | 4069 1561 | 4071 1562 | 4079 1563 | 4082 1564 | 4083 1565 | 4085 1566 | 4081 1567 | 4076 1568 | 4090 1569 | 4091 1570 | 4098 1571 | 4105 1572 | 4121 1573 | 4119 1574 | 4124 1575 | 4130 1576 | 4132 1577 | 4131 1578 | 4130 1579 | 4094 1580 | 4106 1581 | 4105 1582 | 4100 1583 | 4098 1584 | 4092 1585 | 4091 1586 | 4093 1587 | 4091 1588 | 4101 1589 | 4102 1590 | 4104 1591 | 4105 1592 | 4100 1593 | 4111 1594 | 4133 1595 | 4134 1596 | 4140 1597 | 4136 1598 | 4121 1599 | 4120 1600 | 4139 1601 | 4140 1602 | 4141 1603 | 4140 1604 | 4144 1605 | 4152 1606 | 4133 1607 | 4136 1608 | 4148 1609 | 4149 1610 | 4148 1611 | 4166 1612 | 4171 1613 | 4162 1614 | 4179 1615 | 4175 1616 | 4185 1617 | 4186 1618 | 4201 1619 | 4218 1620 | 4226 1621 | 4224 1622 | 4214 1623 | 4212 1624 | 4187 1625 | 4191 1626 | 4194 1627 | 4193 1628 | 4196 1629 | 4199 1630 | 4195 1631 | 4196 1632 | 4178 1633 | 4177 1634 | 4180 1635 | 4172 1636 | 4173 1637 | 4166 1638 | 4172 1639 | 4175 1640 | 4180 1641 | 4185 1642 | 4186 1643 | 4189 1644 | 4190 1645 | 4191 1646 | 4193 1647 | 4195 1648 | 4209 1649 | 4218 1650 | 4221 1651 | 4223 1652 | 4215 1653 | 4182 1654 | 4181 1655 | 4194 1656 | 4202 1657 | 4203 1658 | 4204 1659 | 4208 1660 | 4210 1661 | 4218 1662 | 4217 1663 | 4216 1664 | 4224 1665 | 4238 1666 | 4239 1667 | 4246 1668 | 4249 1669 | 4250 1670 | 4222 1671 | 4219 1672 | 4246 1673 | 4261 1674 | 4263 1675 | 4272 1676 | 4277 1677 | 4276 1678 | 4277 1679 | 4279 1680 | 4292 1681 | 4281 1682 | 4282 1683 | 4261 1684 | 4268 1685 | 4264 1686 | 4265 1687 | 4272 1688 | 4277 1689 | 4278 1690 | 4281 1691 | 4282 1692 | 4304 1693 | 4296 1694 | 4288 1695 | 4305 1696 | 4306 1697 | 4304 1698 | 4306 1699 | 4307 1700 | 4310 1701 | 4290 1702 | 4280 1703 | 4281 1704 | 4282 1705 | 4283 1706 | 4299 1707 | 4298 1708 | 4299 1709 | 4300 1710 | 4284 1711 | 4292 1712 | 4303 1713 | 4306 1714 | 4304 1715 | 4288 1716 | 4291 1717 | 4288 1718 | 4285 1719 | 4297 1720 | 4296 1721 | 4297 1722 | 4298 1723 | 4291 1724 | 4275 1725 | 4269 1726 | 4270 1727 | 4269 1728 | 4268 1729 | 4285 1730 | 4287 1731 | 4288 1732 | 4287 1733 | 4288 1734 | 4289 1735 | 4280 1736 | 4279 1737 | 4286 1738 | 4289 1739 | 4285 1740 | 4286 1741 | 4287 1742 | 4297 1743 | 4294 1744 | 4319 1745 | 4306 1746 | 4333 1747 | 4338 1748 | 4339 1749 | 4332 1750 | 4337 1751 | 4338 1752 | 4325 1753 | 4320 1754 | 4318 1755 | 4308 1756 | 4317 1757 | 4337 1758 | 4336 1759 | 4338 1760 | 4340 1761 | 4343 1762 | 4324 1763 | 4325 1764 | 4326 1765 | 4323 1766 | 4322 1767 | 4327 1768 | 4329 1769 | 4333 1770 | 4341 1771 | 4347 1772 | 4372 1773 | 4375 1774 | 4378 1775 | 4371 1776 | 4374 1777 | 4373 1778 | 4369 1779 | 4371 1780 | 4389 1781 | 4392 1782 | 4372 1783 | 4382 1784 | 4383 1785 | 4384 1786 | 4381 1787 | 4390 1788 | 4391 1789 | 4394 1790 | 4416 1791 | 4430 1792 | 4398 1793 | 4403 1794 | 4394 1795 | 4383 1796 | 4399 1797 | 4387 1798 | 4418 1799 | 4431 1800 | 4434 1801 | 4417 1802 | 4418 1803 | 4417 1804 | 4420 1805 | 4430 1806 | 4426 1807 | 4429 1808 | 4430 1809 | 4429 1810 | 4430 1811 | 4440 1812 | 4449 1813 | 4450 1814 | 4434 1815 | 4452 1816 | 4444 1817 | 4446 1818 | 4439 1819 | 4440 1820 | 4414 1821 | 4407 1822 | 4408 1823 | 4410 1824 | 4411 1825 | 4420 1826 | 4445 1827 | 4454 1828 | 4455 1829 | 4451 1830 | 4456 1831 | 4455 1832 | 4449 1833 | 4470 1834 | 4469 1835 | 4473 1836 | 4470 1837 | 4488 1838 | 4470 1839 | 4466 1840 | 4463 1841 | 4477 1842 | 4481 1843 | 4494 1844 | 4493 1845 | 4491 1846 | 4486 1847 | 4475 1848 | 4479 1849 | 4484 1850 | 4485 1851 | 4497 1852 | 4472 1853 | 4473 1854 | 4490 1855 | 4499 1856 | 4507 1857 | 4515 1858 | 4521 1859 | 4554 1860 | 4555 1861 | 4538 1862 | 4526 1863 | 4539 1864 | 4543 1865 | 4537 1866 | 4541 1867 | 4543 1868 | 4527 1869 | 4538 1870 | 4537 1871 | 4536 1872 | 4550 1873 | 4554 1874 | 4567 1875 | 4585 1876 | 4603 1877 | 4623 1878 | 4624 1879 | 4626 1880 | 4629 1881 | 4627 1882 | 4629 1883 | 4628 1884 | 4636 1885 | 4640 1886 | 4647 1887 | 4649 1888 | 4651 1889 | 4655 1890 | 4626 1891 | 4631 1892 | 4632 1893 | 4630 1894 | 4622 1895 | 4625 1896 | 4632 1897 | 4652 1898 | 4657 1899 | 4661 1900 | 4650 1901 | 4654 1902 | 4656 1903 | 4658 1904 | 4659 1905 | 4676 1906 | 4675 1907 | 4681 1908 | 4694 1909 | 4714 1910 | 4723 1911 | 4706 1912 | 4707 1913 | 4741 1914 | 4743 1915 | 4718 1916 | 4714 1917 | 4715 1918 | 4697 1919 | 4699 1920 | 4698 1921 | 4696 1922 | 4703 1923 | 4702 1924 | 4704 1925 | 4709 1926 | 4726 1927 | 4725 1928 | 4743 1929 | 4747 1930 | 4765 1931 | 4766 1932 | 4768 1933 | 4764 1934 | 4768 1935 | 4770 1936 | 4777 1937 | 4778 1938 | 4779 1939 | 4786 1940 | 4804 1941 | 4806 1942 | 4790 1943 | 4797 1944 | 4808 1945 | 4809 1946 | 4806 1947 | 4808 1948 | 4818 1949 | 4822 1950 | 4823 1951 | 4854 1952 | 4855 1953 | 4885 1954 | 4902 1955 | 4903 1956 | 4905 1957 | 4906 1958 | 4908 1959 | 4907 1960 | 4909 1961 | 4915 1962 | 4916 1963 | 4906 1964 | 4935 1965 | 4949 1966 | 4948 1967 | 4952 1968 | 4964 1969 | 4960 1970 | 4962 1971 | 4975 1972 | 4976 1973 | 4987 1974 | 4996 1975 | 4994 1976 | 4996 1977 | 4997 1978 | 5000 1979 | 5001 1980 | 4986 1981 | 4988 1982 | 4999 1983 | 4997 1984 | 4998 1985 | 4997 1986 | 5004 1987 | 5005 1988 | 5006 1989 | 5004 1990 | 5005 1991 | 5018 1992 | 5019 1993 | 5021 1994 | 5022 1995 | 5028 1996 | 5057 1997 | 5058 1998 | 5063 1999 | 5067 2000 | 5068 2001 | --------------------------------------------------------------------------------