From a48f5f6d11939da577a3ddecd32efc45af87d64c Mon Sep 17 00:00:00 2001 From: Trevor Merritt Date: Sat, 23 Aug 2025 11:50:36 -0400 Subject: [PATCH] Initial commit --- .gitignore | 1 + Cargo.lock | 77 ++++ Cargo.toml | 7 + data/2015_01_data.txt | 1 + data/2015_02_data.txt | 1000 +++++++++++++++++++++++++++++++++++++++++ data/2015_03_data.txt | 1 + data/2015_05_data.txt | 1000 +++++++++++++++++++++++++++++++++++++++++ data/2015_06_data.txt | 300 +++++++++++++ data/2016_01_data.txt | 1 + data/2024_01_data.txt | 1000 +++++++++++++++++++++++++++++++++++++++++ data/2024_02_data.txt | 1000 +++++++++++++++++++++++++++++++++++++++++ src/bin/2015_01a.rs | 42 ++ src/bin/2015_01b.rs | 32 ++ src/bin/2015_02a.rs | 82 ++++ src/bin/2015_02b.rs | 64 +++ src/bin/2015_03a.rs | 55 +++ src/bin/2015_03b.rs | 83 ++++ src/bin/2015_04a.rs | 59 +++ src/bin/2015_05a.rs | 89 ++++ src/bin/2015_05b.rs | 57 +++ src/bin/2015_06a.rs | 72 +++ src/bin/2015_06b.rs | 72 +++ src/bin/2016_01a.rs | 118 +++++ src/bin/2016_01b.rs | 127 ++++++ src/bin/2024_01a.rs | 81 ++++ src/bin/2024_01b.rs | 102 +++++ src/bin/2024_02a.rs | 103 +++++ src/lib.rs | 28 ++ 28 files changed, 5654 insertions(+) create mode 100644 .gitignore create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 data/2015_01_data.txt create mode 100644 data/2015_02_data.txt create mode 100644 data/2015_03_data.txt create mode 100644 data/2015_05_data.txt create mode 100644 data/2015_06_data.txt create mode 100644 data/2016_01_data.txt create mode 100644 data/2024_01_data.txt create mode 100644 data/2024_02_data.txt create mode 100644 src/bin/2015_01a.rs create mode 100644 src/bin/2015_01b.rs create mode 100644 src/bin/2015_02a.rs create mode 100644 src/bin/2015_02b.rs create mode 100644 src/bin/2015_03a.rs create mode 100644 src/bin/2015_03b.rs create mode 100644 src/bin/2015_04a.rs create mode 100644 src/bin/2015_05a.rs create mode 100644 src/bin/2015_05b.rs create mode 100644 src/bin/2015_06a.rs create mode 100644 src/bin/2015_06b.rs create mode 100644 src/bin/2016_01a.rs create mode 100644 src/bin/2016_01b.rs create mode 100644 src/bin/2024_01a.rs create mode 100644 src/bin/2024_01b.rs create mode 100644 src/bin/2024_02a.rs create mode 100644 src/lib.rs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..2d0ce69 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,77 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "aoc" +version = "0.1.0" +dependencies = [ + "md-5", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "cfg-if" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest", +] + +[[package]] +name = "typenum" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..13f5a84 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name="aoc" +version = "0.1.0" +edition = "2024" + +[dependencies] +md-5 = "0.10" diff --git a/data/2015_01_data.txt b/data/2015_01_data.txt new file mode 100644 index 0000000..73e014e --- /dev/null +++ b/data/2015_01_data.txt @@ -0,0 +1 @@ +(((())))()((((((((())()(()))(()((((()(()(((()((()((()(()()()()()))(((()(()((((((((((())(()()((())()(((())))()(()(()((()(()))(()()()()((()((()(((()()(((((((()()())()((((()()(((((()(())()(())((())()()))()(((((((())(()())(()(((())(()))((())))(()((()())))()())((((())))(()(((((()(())(((()()((()((()((((((((((())(()())))))()))())()()((((()()()()()()((((((())())(((()())()((()()(((()()()))(((((()))(((()(()()()(()(()(((())()))(()(((()((())()(()())())))((()()()(()()(((()))(((()((((()(((((()()(()())((()())())(()((((((()(()()))((((()))))())((())()()((()(()))))((((((((()))(()()(((())())(())()((()()()()((()((()((()()(((())))(()((())()((((((((()((()(()()(((())())())))(())())))()((((()))))))())))()()))()())((()())()((()()()))(()()(((()(())((((())())((((((((()()()()())))()()()((((()()))))))()((((()(((()))(()()())))((()()(((()))()()())())(((())((()()(())()()()(((())))))()())((()))()))((())()()())()())()()(()))())))())()))(())((()(())))(()(())(()))))(()(())())(()(())(()(()))))((()())()))()((((()()))))())))()()())((())()((()()()))()(((()(()))))(())()()))(((()())))))))))(((())))()))())()))))()()(((())))))))()(()()(()))((()))))((())))((()((())))())))()()(()))())()(()((()())(()(()()())())(()()))()))))(()())()()))()()()()))(()(()(()))))))()(()))()))()()(()((())(()(())))()(((())(())())))))()(()(()))))()))(()()()(())()(()(())))()))))()()(((((())))))())()())())())()())()))))()))))))))())()()()()()()())))()))((())()))())))()((())()))))()))())))))))())()()()))()()(()((((()(((((((()(())((()())((()()))()))))(())))()()()(())((())()())))(())))(())))(((()()))()(())(((()(()))((())))())()))((((()))())()))))))))()(())())))(()))()(()()))())()()(())())))())()()(()())))()((()())(()(())(())))))))))))))(()))))()))))))()()())(()(((((()(()())))())()))(()))()))(()()))()())(()))())()(())((()()))))))())))())()(((())))(()(()))()()))()(()))))))((()())(()))))))()())))()()))))))))((((((((()()()(()))))))()())))())))()()((())()))((())(())))())())))()()()((()((()(())))())()(())))))))))()())))()()()()()()))()))((())())(()(()))))))(()()))()))(())))()))))))))))))(()))))))))()))))()))()())()))()()))))))()))))((()))))(()))())()(())))(()())((((()())))()))))(()))()(()()(())))))())))))()))))))())))())))))())))())())))())(()))))(())()(())))())()))((()()))))))())))((())))))))())))(())))))()()())))))())))))()))))))()))()()()(()(((()())())())(()))())))))((()(())(()))))))))(())))()()()())())(()))))()()()))()))())())())()(())))()(((()((((())))))))()))))))))))))))))))))((())()())(()))))()()))))))(()()(())())))())))((())))((())))))))))))))()))))()(()))))))())))))()))(()()())(()())))))))))()))))))(())))))()()))()())(((())))()))(()))))))))(())())))())))())())())()()))((())()(())()())()))()())(())(()))))()())))(()(((()))))))()(()())()()()))()))))))))()()()(())()())()(((((()))()())())(()))))()()()(())))())))()((()())))(()))())()(()())())(()))()()))((()()))((()()()()())))(())()))(()(())))((()()))))))))())))))))())()()))))))))))))))))(())()(())(())()())())()))()(()))))())())))))()())()(()))()()(())))(())())))))(()))))))))))))))())())(())(())))(((()))()))))())((())(()))())))))))())))))())))()))()))))))))))))())()))))()))))((()))(())))()(())))(())()))()))())))())))))))()(()())())))()()())))(())))))(()))))))))))))(()))()))()))())))(((()()()(())((()())))()())(((()))(())()))((()()()())))())(())(()))))()(((((())))(()))())())))))))((((()()()))())())()(()(()())))))))))()())())))(())))()())(((()(())())()()))())())))))))((()())((()()(()))(()(())))()))()))(()))(()))()()(()(((())((((()))()(()))((())()(()(()())()(()))()())))))(()))()))())()())))())))(())))((())(()())))))()))(())(()))()())()(()()((()(()))))))()(())(()())(())()))(((())()))(()()(()()()))))(()(())))()))))())))))())(()()()()()()(((())))(()()))()((())(((((()()())))(()))(()))()()))(((())())()(((()()()()))))(()))(())())))()())(()()())())))))))()))))((())))()())(()))(()(()))())))))())(())))))()()())())()))()()(())))(()))(())((((((())(()))(()))())()))(()()(())))()))(()()))()))()(())))(())))((()(()))(())()()())())))(((()()())(())()))))))()(((()(((((()()(((())(())))())()((()))))((()())()(())(((())))(((()((()(()(()))(()()))())(()))(())(())))()))))))((((()))()((((()(()))()))()()))))()(()(()))()(()((()(((()(()()(((()))))()(((()(()(()(((()(()())())()()(()(()())())(()((((())(()))()))(((((()()())(())()((()()())))()()(((()()))()((((((((()(())))())((()))))(())))(()))))((()((((()()(())(((((()))(((((((((((((()())))((((()(((()((())())()))((()))()(()()((()()()()(()()(()(()(((())()(()((((((()((()()((())()((((()((()()(()()())((()()()((()((())()(()(((()((())((((())(()))((()(()))(()())()((((((((()(((((((((((()))(()(((()(()()()((((())((())()())()))(())((())(()))(((()((()(())))(()))))((()()))))((((()(()(()())(()(())((((((((()((((()((()(((((()))())()(()))(()()((()(())(((((()(())()(((((()()))))))()(((())()(()()((((())()((())((()(((())(((()))((()()((((()(())))))((()((((()((()((()(((())((()))(((((((()(((()((((((((())()))((((())(((((()((((((((()(((()((()(((()()(((()((((((()()(()((((((((()()(()(()(())((((()())()))))(((()))((((())((((()())((()(())()((()((((((()((((((()(())))()())(((())())())()(())()(()())((()()((((())((((((())(()(((((()((((())()((((()(()(())(()())(((())()((())((((()))()((((((())(()(((()(((()((((((()(((()))(()()())())((()((()())()((((())(((()(()(((((((((())(())))()((()()()()(())((()))(((((((()(((((((((()(()))))(()((((((((()((((()((()()((((((()()(((((((()(()(())()(())((()()()((()(((((()())()(((((()())()()((()(()())(()()()(((()()(((((()((((((()()((()(()()()((((((((((((()((((((((()()(((()())))()(((()()(())())((((()((((()((((()()()(())(())((()(()(((((((((((((((()(())(())))))()()))((()(((()(())((()(((()(()()((((()()(((()(((()(((((()()((()(()(((()))((((((()((((((((()((()((())(((((()(((())(())())((()()))((((())()()((()(((()(((((()()(((()))(((()(()(((((((((((((()))((((((((()(((()))))())((((((((((((())((())((()())(((())((())(()((((((((((()(((())((()()(()((())(((((((((((()))((((((((((((()(()())((()((()((()(()(((()((((((((()()(()((()(()(((()))((()))(((((((((((((()(())((((((())(((()(())(()(()(()((()()))((((()((((()((((())))())((((()((((()))((((((()((((((()((()(((())))((())(()))(()((()((((()((()(((()()))((((()()()(((((((())(((())(()))())((((()())(((()(((((((((((()(()(()((()(((((((((((((((()()((((()((((((((()(((()()((()((((()))(((()(())((((((()((((())()((((()((()))(())()(()(((()((())())((((((()(()(())())(((())(()(()())(((((()((()((())()())(())))(((()(())))))))(((()(((()))()((()(((()()((()())()()))())))(((()))(()(((()(((((((((()(()(((((()()(((()())()()))))()(((()))(((()(()(()(()(()))()(())()))(()(((())))(()))))))))))(())((()((())((()(())()(())((()()((((()()((()()))((())(((()((()(())(())))()(()(((((()((()))())()(((((()()(((()(()((((((())(()))(())()))((()(()()))(())())()))(((())))(()((()(((())(())())))((()()((((((((((((((()((()(()()(()(((()))())()()((()()()(())(()))(()())(((())((())()(())()()(()()(())))((()(((()))))(((()()(()()))())((()((())()))((((()()()())((())))(((()(())(((((()(((((()((()(()((((()()(((()()()(((()())(((()()((((())(()))(((()))(())())((()))(((()((()))(((()()((())((()(((((()((((()()())((()))()((((()((()(()()()( \ No newline at end of file diff --git a/data/2015_02_data.txt b/data/2015_02_data.txt new file mode 100644 index 0000000..7850b1d --- /dev/null +++ b/data/2015_02_data.txt @@ -0,0 +1,1000 @@ +29x13x26 +11x11x14 +27x2x5 +6x10x13 +15x19x10 +26x29x15 +8x23x6 +17x8x26 +20x28x3 +23x12x24 +11x17x3 +19x23x28 +25x2x25 +1x15x3 +25x14x4 +23x10x23 +29x19x7 +17x10x13 +26x30x4 +16x7x16 +7x5x27 +8x23x6 +2x20x2 +18x4x24 +30x2x26 +6x14x23 +10x23x9 +29x29x22 +1x21x14 +22x10x13 +10x12x10 +20x13x11 +12x2x14 +2x16x29 +27x18x26 +6x12x20 +18x17x8 +14x25x1 +30x15x22 +17x18x7 +28x23x24 +15x12x25 +14x7x20 +29x23x8 +24x5x22 +6x22x8 +1x15x26 +14x5x1 +24x28x28 +17x23x23 +4x15x7 +23x8x11 +6x15x1 +23x18x13 +17x1x26 +23x13x17 +2x18x8 +22x22x1 +10x22x6 +28x29x20 +22x21x25 +14x8x23 +12x30x14 +8x7x5 +3x30x15 +4x3x29 +25x18x3 +16x7x16 +4x3x8 +9x16x30 +20x28x3 +28x24x6 +4x18x2 +23x18x5 +22x4x30 +15x30x9 +7x12x12 +3x22x29 +12x1x9 +9x2x25 +17x11x10 +25x24x7 +7x27x26 +26x4x12 +29x2x26 +19x24x12 +23x23x3 +26x28x16 +18x4x16 +25x30x18 +29x19x19 +16x3x27 +29x25x29 +18x19x5 +14x21x30 +19x13x26 +19x10x15 +9x4x7 +18x6x6 +24x25x29 +9x12x27 +15x3x22 +30x17x21 +18x19x28 +9x11x12 +8x28x22 +11x3x4 +28x17x20 +24x18x15 +11x12x13 +6x19x24 +28x4x5 +28x22x23 +13x29x2 +9x16x15 +29x28x1 +10x18x30 +19x11x12 +26x28x25 +23x17x13 +25x1x21 +17x1x27 +17x27x28 +28x13x15 +14x13x25 +11x29x7 +22x29x5 +13x6x14 +23x18x13 +25x7x17 +18x9x20 +21x11x2 +28x11x13 +13x25x1 +19x29x25 +16x29x4 +10x21x10 +7x25x17 +5x9x3 +1x15x6 +8x27x29 +23x6x30 +22x22x29 +6x20x30 +26x25x29 +10x19x19 +20x30x9 +5x30x24 +17x10x27 +30x14x30 +8x17x4 +7x18x6 +3x5x4 +24x17x15 +14x20x17 +22x27x15 +18x14x15 +23x9x11 +21x16x29 +7x18x21 +9x3x29 +10x13x4 +2x30x4 +23x20x4 +8x22x21 +29x28x4 +13x16x25 +21x9x11 +7x26x26 +13x23x30 +19x7x10 +9x23x21 +21x9x17 +9x21x15 +20x29x22 +23x13x15 +19x25x2 +12x11x30 +20x21x6 +21x6x17 +24x26x9 +29x21x29 +29x26x16 +6x16x1 +2x12x6 +6x7x20 +7x2x22 +6x22x4 +13x11x27 +25x27x14 +11x8x6 +26x11x14 +30x3x29 +27x21x20 +15x16x26 +6x22x10 +11x9x25 +23x13x6 +13x9x3 +30x22x13 +29x23x14 +25x19x6 +7x29x11 +19x18x5 +29x25x13 +25x24x27 +1x9x12 +22x9x17 +14x12x28 +19x21x17 +13x25x17 +14x25x12 +4x14x30 +7x15x28 +3x6x25 +6x2x16 +15x19x11 +17x30x20 +20x23x7 +26x21x6 +26x29x24 +2x4x30 +4x22x18 +13x3x28 +27x6x21 +5x3x27 +12x7x11 +28x11x9 +12x9x2 +1x22x20 +15x13x28 +14x19x16 +28x20x3 +20x4x9 +26x7x26 +18x19x25 +7x1x13 +20x23x29 +27x26x8 +11x15x15 +10x21x23 +29x2x11 +21x28x20 +3x18x23 +26x17x17 +14x26x17 +20x7x17 +18x12x8 +4x8x8 +8x15x23 +24x29x5 +1x25x8 +1x28x17 +16x18x13 +29x24x22 +13x16x10 +14x7x16 +15x11x29 +12x15x19 +17x6x28 +4x3x9 +15x16x8 +29x27x11 +2x24x20 +4x21x3 +29x24x27 +18x22x22 +7x8x18 +20x7x8 +19x9x2 +20x17x2 +2x29x10 +19x25x1 +28x9x3 +29x27x20 +7x21x7 +10x4x22 +26x8x5 +26x14x1 +5x27x9 +2x18x3 +3x27x17 +30x17x23 +30x11x20 +4x6x7 +6x29x27 +30x16x20 +24x30x28 +19x20x26 +18x1x25 +26x12x12 +19x15x29 +16x21x24 +23x13x26 +25x16x10 +8x9x18 +24x14x1 +24x15x21 +19x9x14 +8x23x11 +22x2x16 +29x9x26 +3x16x25 +15x20x30 +3x11x12 +15x2x3 +13x7x4 +2x7x27 +9x26x11 +30x24x19 +28x17x21 +10x8x2 +11x15x26 +10x12x20 +24x24x27 +25x26x16 +13x4x20 +25x13x11 +12x22x3 +20x7x1 +12x18x6 +26x8x20 +14x2x7 +23x12x1 +26x24x24 +27x26x23 +26x17x5 +17x24x2 +26x5x6 +23x5x1 +5x18x30 +24x21x19 +5x28x11 +21x20x14 +25x4x22 +26x24x11 +7x5x8 +13x1x30 +5x1x6 +14x5x2 +8x11x7 +13x20x1 +17x30x14 +29x22x10 +12x26x3 +27x17x3 +26x27x4 +5x26x17 +22x11x19 +8x26x3 +24x19x22 +7x1x4 +6x27x30 +4x28x14 +16x14x18 +4x5x20 +19x25x4 +15x15x1 +10x14x14 +16x18x24 +21x27x15 +5x5x10 +1x7x13 +16x2x8 +13x15x11 +3x25x10 +20x29x8 +12x3x2 +10x13x12 +25x27x1 +11x30x19 +7x19x13 +27x6x18 +16x21x19 +21x29x5 +16x23x12 +29x19x15 +5x5x10 +27x15x1 +13x16x22 +29x19x5 +8x12x9 +3x18x5 +13x25x3 +5x9x21 +10x20x16 +9x9x11 +23x21x1 +22x2x15 +27x8x13 +23x7x3 +26x30x15 +29x15x16 +16x27x13 +2x18x9 +10x27x8 +20x9x25 +10x2x17 +16x13x13 +21x26x1 +27x26x24 +9x30x16 +19x17x28 +25x15x1 +10x26x6 +10x11x11 +5x26x25 +30x4x15 +9x8x23 +14x25x7 +8x28x8 +28x18x24 +4x4x25 +16x25x11 +17x27x8 +15x16x9 +24x13x21 +17x3x27 +27x5x26 +8x27x12 +29x2x8 +24x23x30 +1x30x21 +6x18x20 +13x14x12 +25x30x23 +24x6x24 +12x7x21 +11x6x8 +8x30x30 +26x3x12 +28x6x5 +18x7x1 +7x6x20 +14x16x18 +11x22x15 +4x20x10 +19x24x19 +8x24x11 +4x9x10 +6x6x22 +10x9x29 +1x5x28 +19x25x29 +20x30x3 +15x13x13 +9x9x24 +20x14x29 +26x24x13 +2x25x8 +10x26x2 +12x19x12 +18x6x20 +4x5x14 +26x27x10 +16x26x20 +3x21x15 +2x26x18 +14x11x17 +26x26x25 +10x1x11 +17x19x19 +27x28x26 +9x2x10 +19x30x15 +23x30x14 +15x3x20 +2x14x22 +21x18x8 +22x4x29 +19x6x29 +9x26x29 +16x10x9 +22x12x22 +13x28x14 +25x14x28 +28x3x30 +10x17x1 +10x27x22 +10x23x19 +14x25x9 +11x24x8 +30x25x10 +22x13x28 +2x7x6 +11x20x8 +9x22x14 +19x16x9 +11x24x4 +11x17x2 +6x4x10 +26x10x10 +12x14x5 +27x10x3 +15x3x6 +11x7x19 +22x10x12 +21x26x10 +13x20x3 +27x8x8 +1x24x23 +24x9x22 +23x17x23 +3x28x19 +2x20x28 +23x17x24 +26x1x4 +4x1x12 +5x6x16 +13x22x13 +25x21x21 +20x21x12 +9x24x25 +17x16x12 +12x28x9 +18x16x27 +29x12x2 +30x12x15 +24x11x10 +4x9x22 +4x24x5 +19x11x5 +6x25x6 +1x20x17 +22x8x21 +11x26x4 +16x19x3 +8x12x8 +13x2x18 +10x5x11 +8x12x17 +21x2x5 +26x17x26 +23x18x17 +28x11x14 +1x4x27 +29x5x28 +5x9x10 +5x7x25 +20x15x27 +15x11x17 +12x14x1 +29x14x4 +18x14x18 +14x25x24 +26x14x18 +13x8x11 +30x1x23 +3x4x12 +12x24x9 +8x6x16 +14x15x30 +12x30x8 +22x11x18 +16x30x28 +17x18x4 +13x14x23 +2x28x8 +3x28x30 +29x30x8 +4x6x26 +6x30x17 +11x30x30 +19x4x3 +12x15x20 +22x28x4 +26x30x2 +6x12x7 +1x10x5 +25x29x7 +17x9x18 +16x21x29 +21x14x7 +15x16x11 +26x6x15 +8x24x7 +2x20x4 +2x9x3 +19x8x13 +18x7x22 +27x14x17 +2x13x8 +18x15x26 +15x27x27 +18x11x15 +1x29x20 +21x12x11 +20x2x15 +28x23x9 +1x1x17 +7x23x9 +30x9x27 +9x16x18 +15x24x28 +30x11x18 +29x26x10 +9x5x25 +2x1x19 +14x3x14 +6x3x6 +30x15x20 +20x17x27 +28x10x9 +14x24x28 +17x11x6 +12x3x6 +8x8x15 +23x14x21 +11x21x7 +5x13x30 +4x29x25 +30x28x24 +18x4x9 +3x15x6 +13x9x19 +30x14x7 +7x9x9 +17x11x26 +24x26x13 +16x21x16 +27x17x25 +2x21x11 +9x11x27 +3x3x7 +13x8x14 +20x20x26 +13x29x22 +30x11x1 +7x10x19 +27x5x9 +23x17x15 +21x6x13 +24x15x16 +18x4x14 +18x16x6 +22x11x18 +14x2x5 +15x3x7 +10x20x29 +16x1x10 +30x23x1 +10x15x11 +17x14x5 +22x8x13 +7x11x28 +26x17x3 +2x23x2 +28x13x19 +18x12x28 +22x23x16 +14x12x1 +20x8x19 +17x19x13 +29x2x12 +2x26x27 +29x16x4 +13x8x18 +16x15x30 +23x16x2 +28x8x27 +21x8x23 +13x20x26 +19x6x17 +17x30x15 +7x4x30 +2x13x30 +18x7x19 +4x13x27 +8x6x5 +18x20x25 +2x3x30 +23x27x13 +22x30x4 +23x25x25 +23x16x19 +25x3x1 +5x6x15 +11x29x12 +25x24x7 +16x7x20 +20x3x2 +12x27x15 +16x10x12 +1x3x14 +22x1x26 +2x24x18 +11x29x16 +15x2x9 +10x1x24 +21x8x11 +30x11x23 +6x30x21 +13x27x29 +14x6x5 +18x29x19 +12x4x28 +29x3x14 +10x30x28 +5x7x15 +14x1x10 +9x25x14 +7x24x18 +28x17x21 +18x13x25 +26x15x1 +21x1x19 +12x16x21 +4x6x13 +7x15x26 +17x19x5 +12x28x2 +1x20x19 +27x7x5 +17x26x8 +12x15x19 +5x23x10 +8x2x8 +16x13x12 +14x27x1 +26x29x3 +24x16x14 +14x13x13 +7x22x23 +2x9x30 +4x27x8 +26x27x15 +23x1x6 +25x29x18 +5x18x1 +20x8x20 +5x10x25 +30x25x15 +7x22x25 +28x26x17 +29x4x1 +21x11x27 +20x9x8 +25x22x12 +2x11x11 +23x2x16 +23x27x20 +2x13x28 +27x2x24 +11x1x17 +12x4x27 +16x20x22 +30x12x10 +5x15x4 +5x2x27 +12x4x25 +1x16x4 +27x4x4 +21x16x3 +27x26x3 +24x6x6 +24x12x12 +20x20x25 +8x29x2 +21x4x5 +2x4x8 +4x13x19 +3x20x10 +12x15x16 +6x5x4 +12x16x20 +22x19x17 +8x17x22 +25x16x15 +7x1x19 +10x1x7 +23x23x5 +28x6x12 +2x25x12 +10x27x12 +24x27x19 +14x14x20 +4x1x5 +16x27x29 +20x20x24 +28x24x30 +6x15x15 +9x15x30 +23x26x3 +17x24x21 +22x25x25 +18x29x10 +20x25x1 +24x11x16 +20x7x21 +20x7x9 +7x26x2 +5x18x1 +16x26x28 +4x10x18 +27x30x21 +26x9x9 +8x16x14 +6x27x8 +28x9x20 +13x13x4 +9x18x16 +18x15x18 +22x19x14 +14x10x17 +25x29x11 +1x18x19 +8x11x26 +18x6x14 +30x24x13 +27x1x27 +15x9x3 +2x29x17 +2x26x21 +22x9x9 +20x20x20 +22x28x2 +26x5x16 +11x3x14 +21x16x16 +18x26x7 +18x30x6 +7x11x12 +15x10x2 +27x2x16 +27x30x24 +28x14x24 +7x4x8 +6x28x15 +13x19x1 +22x26x30 +7x30x24 +2x17x21 +19x26x2 +19x24x15 +14x23x2 +21x27x15 +30x15x14 +21x29x5 +23x30x2 +4x1x2 +15x5x13 +21x2x30 +20x7x16 +1x21x25 +2x25x1 +12x29x5 +28x13x16 +26x3x12 +29x20x23 +28x12x20 +4x30x8 +16x15x16 +6x16x29 +2x28x13 +24x25x2 +26x15x22 +17x20x11 +18x12x7 +19x1x18 +8x27x13 +22x16x8 +19x26x17 +13x11x10 +22x12x3 +13x12x14 +29x17x9 +6x14x10 +14x20x10 +8x26x9 +25x13x22 +3x30x25 +14x28x1 +30x29x12 +3x17x15 +3x24x14 +28x24x22 +16x6x1 +20x25x14 +17x17x13 +6x19x27 +10x15x20 +8x23x20 +7x29x21 +18x9x25 +10x5x22 +2x27x27 +16x18x30 +15x5x12 +26x29x29 +28x11x10 +9x29x28 +24x15x23 +26x9x10 +5x1x25 +22x27x16 +7x29x3 +1x3x5 +8x7x29 +19x21x11 +28x13x30 +17x16x20 +5x10x25 +9x14x15 +15x14x23 +16x4x17 +21x8x2 +9x9x8 +22x22x4 +10x2x27 +12x19x10 +15x29x4 +22x14x7 +29x18x5 +1x7x27 +24x1x15 +23x23x26 +12x17x23 +26x10x24 +8x22x2 +8x1x10 +22x19x12 +2x23x13 +11x27x25 +26x15x27 +27x7x21 +18x9x6 +22x21x22 +7x12x26 +23x21x13 +14x3x8 +5x9x28 +29x29x15 +27x25x23 +12x2x24 +8x2x20 +29x19x4 +12x24x29 +2x27x28 +14x20x9 +28x6x25 +18x29x8 +19x11x30 +15x11x23 +18x7x7 +14x20x14 +26x18x22 +27x25x13 +12x10x30 +30x2x7 +28x10x1 +18x10x30 +22x11x5 +22x16x3 +25x15x9 +5x10x24 +4x28x8 +19x24x18 +3x4x25 +14x4x30 +11x26x3 +12x12x12 +26x7x24 +3x2x14 +1x27x7 +2x2x13 +3x26x26 +12x4x11 +12x17x20 +4x19x30 +5x18x10 +17x6x18 +19x30x20 +11x2x17 +30x13x19 +22x23x7 +17x28x2 +5x17x30 +7x11x4 +21x26x18 +15x28x4 +5x6x27 +12x6x16 +9x17x12 +27x20x5 +14x5x20 +27x14x6 +2x14x21 +4x28x30 +24x5x1 +19x29x29 +11x23x1 +8x16x21 +3x17x19 +10x13x5 +20x21x16 +23x3x6 +27x26x11 +3x2x22 +14x3x5 +10x9x8 \ No newline at end of file diff --git a/data/2015_03_data.txt b/data/2015_03_data.txt new file mode 100644 index 0000000..03504fc --- /dev/null +++ b/data/2015_03_data.txt @@ -0,0 +1 @@ +^><^>>>^<^v<<^<><^<^v>^vv<>v>>^^^v<<<^>^<^v<^>^v><<<^>><>v>v^<<^>^<<^^^>v>>v^^>^>vv>>^>>v^>^v>^<^^v>^>^^v^^>v^^v><^><^<<>v^<^<^vv^>>>v^v^>^<>^v<^^vv^>^<>^^<vv<>^>v<^>^v>v^>^v<>^><>>v^v<><>v^v>>>>v^^>^><^^<^>^v^v<>v<<<^<v^^^<^^^>v<^v>>>>>v<^^^^>v<^<>>>>>>v^vvvv^^^v<^v^>v><^>^v<<>>vv^>v>v^^>vv^<^vvv<>><>><><^^^^<^^^<^v>>v>^v^^^>v^^^v>>^v^^<^>>^>^<>>^^<>>^vv>v^<^>>>><><^^v<><<<<^^<>>^<>vv^<^>v^^><^v>^^>v<>^v^<>^vv^>vvv>v>^>^>>^>><>>>^^^^v^<>v^^>^<>v<^^v><^v><>^^^^^v^v>>^^v><<><^^^^><^>v>><<<^v>v^^>^v^<^^v>v<^<<>>^v<<>v<^v^>v^>^v<<v>v>>v>v^^v>^v^>>>><>^>v>^v^>>>>v^<<<>vvv>><^^>^<><^^<^v^v^<^^>^<^v^<<<^^v^v>>><>^^>vv<<^v^<<<<^^>>>v>v<<<>^^>>>v>^>v>vv<<>^<^>^^<^>^v^<>v^><^^^>vv>><^v<^<<<><<^^<><>v>^>^<>>^^v>vv^<^^v>><^vv^<<<>vv^v<^<>v^^>><>^<^v<<<^<<^>>>^^<^^v>v^vvvv>v<>><^>^<<<v^^^v<>v>^^<v>>v>>v^>^<>v><>>>v^>^v<^<><<^>^^^>^><>^><^<>vv<>>v^v>^>^>^<^><>v<><>>>^^^<^v>>^<>>>vv^>vvvv>>><^>v<>^^^>v>>v^v^>^^<<^>^>>v<<><>v^^>v^><<^v^>^^<v><<<^v^<>^<>^>>^<^^<>^v<>v^>>><>^><>>vv>v^<^^^>v>^^>^v<><>>><>><^<>>v>v^^>^^<^^>^>>v>vv^^v<^<^v>><<^>^v>^^^<<>v^<^^v<<<>^^vv<^>vv>^>^<><<>vv<^>v^vv>^^^v><<^vv>^v<>vv^^<^<>^^v^<^vvv>v^^<>^^>^^>^<><<^v>^><^^vvvv<><>^v<>^><>v>><>vv^<<><<>><>v<^>^v>>^^v><<<>>^<^v^^^<^<><><^><<<<^^<>><><>>v><<vvvv^^vv><<^v^vvv><>v><>v<<<^><^^>v^>^^^v^v>><<>^v<>v^v<<<<^^^v^v<<>>>v>>vv>^^<><^v<>>v^>>>>>^>v^v^<^v^v^vvv>vvv^<vv>>v^^vv<^v>>>>vv<>v<>^^vv^v^>>vvv<<v>v>^><<<^>v^>^v^^^><<><<<^^<^^<>^^v<^v>^v<^>^>><>^v^v<<^>^>v><^>^vv^^^v^v^>^<<>>>>>v^<>^>v^vv^><<>>^^<>v^>^vvv^>v^v><>^><<>v>v<^<^><^^vv<<><>>v>>v>>^v<<>^vv<>^vv>v>v>^>^>>><><<>v^<<^v^^<<<>>vv<^<<>v<^^^<<^v^>^v>^^^v^v>>>v>v^v>^>^vv<^^<^<<v^<><<^vvv^^><>vv^v>v>^><<^^^^vvv^><^v<^>^<>>^>>vv^<>>^v>^>v>^<^<^^^<>>>>>>v>^<>^^v^><>><^v^^><>v^v<^<<<<^>^^>vv>><^v^vvv>v^^><^^<^<>>^^v^vv<>v<^<<v>v<>^v^><>v<^v>><<^<^v^>><^<^><>v>>^vv<^v>^>v<^>>^>>v^>^v<^v^v><<><>^><<<><>^<>^^^^v>^>^vvvvv>v>>v><<<^><<^v><^v>>>>^v<^v<<>>^>^<v>><<^>^>^v><><>^><v^><<^v^<^^><^^v^<<^v^^>>^v^<^>v^^<<^^^<><>^>v^v>v^>^v^vv>^^>>>>^^<^>>>^^v<^^v><<<>^>^^>^>^v<<<<>>^<<>>>v>^^<^v<>v<>v^>v^><^<^^>^^vv><>v>^<<<^><^^<^<^^v<^>v^v^^^><^>v^v>>^^v^>>>>><<>^>v>v<>>>v>^^^^>>v^<<^>>><^v^<<>>v><>^v^^><<>>^>^>vv<^<>^vvv^vv^v>^^<<<<<>^v^>^<>v^^<>v^v^<>vv^<^vv>>><<>v^^^>^>^^>>>vvv>^>v>v>>>^>vv^><>^><>v>^^^><><<<>>v^v<^<>^^<>^^<<><>^v<><>>>^vv<^<<^<^v>v<<<<<^^v<^v<><^>v>^v>>^v^><^^^^v<><><>vv^<>vv<^v<^^><^^v^v^<^^<<>v<>v^v<^>vvv><<^v>>v><>>>v<^>>v>^<>><>^v<^^>^<^v<^<<^^v<>>^>^>^v^^v^v>v>v<>v^>v^^>^^>><<>><<^^>><^v<<><<>>>>>>^^^^^<<>^<<^><<^^vvv<<>vv><<>v>v^v>>>>>^<>><^^^><<<<>>v<^>>>^^vvv>v<>>>>v>>^v^vvv<<>vvv<<^^^<>vv^^v<<>^^^>>^<^v^<^^>v^>>^<<^v<v^>>^>v^><^><>^>>>vv>><^^^>vv<<^^vv><^<>^>^^<^<>>^vv^>>^v><>v^>>><<<^^<^>^>v<^>^<^^<>>><^^<>^v^<<>vvv>v^v<<^^^><<^vv^v>v>v<<^v^<<<>^><>v>^vv^v<>vv^>^^<^>^>v^^v><>>^v<^<><><^vv<><<>v^^>^^<><<>^<^<<<>v>><^<<>^>^v^v<^>>^v<^>v<<>^^^<^v>>>^vvvv<vvvv>v<>v^<><>vvv<>^<<>^>>>>v^<^<><^v>v^>>v><>^><^<<>^>^v^>^v>^<>v^<^^>v>^>>>v^v>>>^<>^<>>>>>v>>vv^v<><<<><><<>>vv<^^v<<>v^v<^v<>>^v>>vvv^^v>>v>^>^>v><^>^^<<>^v<^<<<<^>v<^>>v^<^v>^v<<>^>^vvv<^^vv>^vv>vv<>>v>v>v^<<<<<^^v^>v>^<<>v^<<>>^<^>^^<>>>>^<^v<>v^^>^<^^v<^><>>>^v^vv<^v<^><><>><^^>^<^v^<^<>v<<<^v>v^^^<>v^^v^>><>^^<<^^v^<>^<^vv>>><^v>vv<^v<<>v>v^v>^v<^<>v^vvv>^vv<<<<^>>^^>><^v><<^>v^^<<<<<>^v<<^^>v<<<<^>^>^>>^>>>v^<>^^v>>>^vvv<^v<>>>vv>^^><^v>vv^>>v>v^<>^^>^<<^>^^^>>^vv>^^>vvvv<>>^^^^>>>v>v^^>vv>vv^<<>^><^><<>>^>^><^v^>v^<>^>v^^v^>^^>v<<<<^<<^>>v>v^^^<<>>^^v>v<<<<^^^v>^vv^>><>^v<>>>v>vvv^v^^v^>>vv>^>><>^v><^v^><^^>vv>^<^<^>>v>><><>^>^>v>vv>vv>^^>v>v^>^>^v>^^v>^<^v<>>vvv^^>^>vvv^^v<^<^>vv^^<^^^>v>vv<v<^>^v^<^>v<^>^<>vv^><>>^>>^<^><<>^<^>v>v><>>>^<<^><<^v<>>vv<^>>v>v>>>>^^>v<^v^>><<^<>>v><^><<^>^<<>>^^<><^^v>^^>vv>^v>^^v^<^<<>>v^^^<^><^<<><><<>^v>vvv^vvv^^>>^<^><>^<<<<^^<>>>v^<<^^v>><><v>^vv>vv^><>^><<><^^>^>^<><>><^^<><>^>><^v<<<<>>^v>^^vv^v^<><<vv>>v>>^v^<>>vv^<^>^<<>v<<<^vv<^vv^vv<^v^^^v>>v<^^<^^vvv<^^v<>>>^>v^>^^><>vv>v>v<<<^^v<^vv^v>^^^>>>^^<>^^<^vvv>><><<><^><<>^>^^vv>vv^^<^^<<><><v><<>v>vvv<^^^^<^>>><<<^^^<^>vv^^v>>v<vvv^^v^^<^v<^<>^<^v>>^><><>v>>>^^>>v^>><>v<><>>><>>>>><<^vvv<<><><<>^><><<^^v><<^>v>^>^v>v>>^^<><^>vv<^<^v>v<><^<<^><>^^^^^v>><>^>^vvv>v^vv^v^>v><>v^><>v>^^^^><^v^^^>^^><<^^>v>v<^v^^vv^<<<<^>v>v^v><>^><><>^v^<>^v>^v>v^<><^>>v<<^><^vv^<><^<>><>><<^^^^>v<^<^vv<><^vv><<^<v^>>^v>^>v^^v>vvv<v<>^>>vv^>>><>^v^^<^>v<<^<^^v^^v^<vv^><^v<^>>>vv^^^^v>^><^^^<><<^^>v<><><><>vv^><<^>^><^v<^<^v^v<<<<<<><vv>v<^><<><><<>>v>><^>^v>^v^<>v^^^><^^<<<^vv^vv>^v^vvv^^>v^><^<^<^<>^vv^^^>vv^v>>><<<^<>>v>v<^^<>>><><^v^^<<><<<>^<^^v^>v><^<^>^>>^<>^v><>>^vv^>^^<<<^v<>>^v<>vvv<<^^<<>>>>^^<><>^><>^vv^v<^>^v<>v^vv<><^vvv<><<^>>^^><><>^<>^>v^^v^><>>v>><^v>^v<<<>vvv^<^^v^<>^>>v<>^^><>>^><^^vv>><<>><^><>>^vv>vv^v^^v<<^^v^^vv<<^<<><>^<><^<^<>>^vvv>>^<^vv>^vv^>v>^<><^><^<>v^v^^<^<>^^v>>><^v<>v^v<<^>v><>^^<v^>>v>^<>^>^>^<^>v><<><><><<<>^>><^>>>^v<<<^<<>^><<^>>>>>v<^>v>>v^^>v^^><>v^v^vvvvv>>><<>^<v>^>^vv^^<^>>v>vv^v<^<>^v^<^<<><<<^vvv^>^^<<>>>vv<<^<><^v<^<><<^^>vv^v>v^^^>>>>^>vv<v>>^^v^^><>v<<^><^>^>v^v>><^v^>v<<^<^<^<^<>>v^^>><<<>vv<^^>^vv<<<^^v^^>v<<><^<>^^>^v<>v>><^^^vv^>^><>v^^>^v>^<<^v>^>>>>><^^^<>v>v^^<^v^>>v^<^>v^v>>>>^>>vv<>^<^v>v>v^v>^<>^>v<<>^<>>^<>>^<>v^><<>^v>>^^^^<<^v><>^<^>^^v><^^<^^v>v<<^>^>><<^^^vvv<<^vv<^^>v^^vv^<^^<<^^>>^^<v^>>v^^>v<^>^>vv>><v><^<^vv>^^v>^>v<<^vv><^^^^^^><<^>>>^v<>^^v<<<>><<<>^<<v^>^^^<^>^^^v<<>v^><<^^<<^v<<>^v>>vv>><<^v^^>v^v>^^v<><^^^<^^>v>^<>vvv^v^^^>v^^v<^>^^>>^v<><^><^<<^vv^<><<>v^vv^<<<^^>v<<>>>v<>v<><<^v>^^v>^^>v>^>^>v<>><>^>^>^vvvv<^^^^^v>v>><>^>^><>^^>v^^<<><^><<<<>v>^^>^v<<<>vvv>>v<^v>>v>v^<<<>^>^>^<>v<^^vv><^v<<^vv<^<<^^vv^^>vv<^>v>^^<^>v<<^^<^>^^^v^^>>v^vv^<^v>^<>^<^>>^<^v<>v><^^<><>^>v<^<^vv>><^v>^<>^^>^<><<>^<>><<>vvv^<<^^>>v<^>>vv>^v^^^v<>v<>><>^vv^>vv^ \ No newline at end of file diff --git a/data/2015_05_data.txt b/data/2015_05_data.txt new file mode 100644 index 0000000..c74027b --- /dev/null +++ b/data/2015_05_data.txt @@ -0,0 +1,1000 @@ +uxcplgxnkwbdwhrp +suerykeptdsutidb +dmrtgdkaimrrwmej +ztxhjwllrckhakut +gdnzurjbbwmgayrg +gjdzbtrcxwprtery +fbuqqaatackrvemm +pcjhsshoveaodyko +lrpprussbesniilv +mmsebhtqqjiqrusd +vumllmrrdjgktmnb +ptsqjcfbmgwdywgi +mmppavyjgcfebgpl +zexyxksqrqyonhui +npulalteaztqqnrl +mscqpccetkktaknl +ydssjjlfejdxrztr +jdygsbqimbxljuue +ortsthjkmlonvgci +jfjhsbxeorhgmstc +vdrqdpojfuubjbbg +xxxddetvrlpzsfpq +zpjxvrmaorjpwegy +laxrlkntrukjcswz +pbqoungonelthcke +niexeyzvrtrlgfzw +zuetendekblknqng +lyazavyoweyuvfye +tegbldtkagfwlerf +xckozymymezzarpy +ehydpjavmncegzfn +jlnespnckgwmkkry +bfyetscttekoodio +bnokwopzvsozsbmj +qpqjhzdbuhrxsipy +vveroinquypehnnk +ykjtxscefztrmnen +vxlbxagsmsuuchod +punnnfyyufkpqilx +zibnnszmrmtissww +cxoaaphylmlyljjz +zpcmkcftuuesvsqw +wcqeqynmbbarahtz +kspontxsclmbkequ +jeomqzucrjxtypwl +ixynwoxupzybroij +ionndmdwpofvjnnq +tycxecjvaxyovrvu +uxdapggxzmbwrity +csskdqivjcdsnhpe +otflgdbzevmzkxzx +verykrivwbrmocta +ccbdeemfnmtputjw +suyuuthfhlysdmhr +aigzoaozaginuxcm +ycxfnrjnrcubbmzs +fgbqhrypnrpiizyy +taoxrnwdhsehywze +echfzdbnphlwjlew +jhmomnrbfaawicda +fywndkvhbzxxaihx +aftuyacfkdzzzpem +yytzxsvwztlcljvb +iblbjiotoabgnvld +kvpwzvwrsmvtdxcx +ardgckwkftcefunk +oqtivsqhcgrcmbbd +wkaieqxdoajyvaso +rkemicdsrtxsydvl +sobljmgiahyqbirc +pbhvtrxajxisuivj +ggqywcbfckburdrr +gmegczjawxtsywwq +kgjhlwyonwhojyvq +bpqlmxtarjthtjpn +pxfnnuyacdxyfclr +isdbibbtrqdfuopn +vucsgcviofwtdjcg +ywehopujowckggkg +mzogxlhldvxytsgl +mllyabngqmzfcubp +uwvmejelibobdbug +brebtoppnwawcmxa +fcftkhghbnznafie +sqiizvgijmddvxxz +qzvvjaonnxszeuar +abekxzbqttczywvy +bkldqqioyhrgzgjs +lilslxsibyunueff +ktxxltqgfrnscxnx +iwdqtlipxoubonrg +twncehkxkhouoctj +bdwlmbahtqtkduxz +smbzkuoikcyiulxq +bjmsdkqcmnidxjsr +icbrswapzdlzdanh +eyszxnhbjziiplgn +pdxhrkcbhzqditwb +nfulnpvtzimbzsze +glayzfymwffmlwhk +bejxesxdnwdlpeup +ukssntwuqvhmsgwj +hoccqxlxuuoomwyc +rapztrdfxrosxcig +cxowzhgmzerttdfq +yzhcurqhdxhmolak +kqgulndpxbwxesxi +yjkgcvtytkitvxiu +xnhfqhnnaceaqyue +qkuqreghngfndifr +xesxgeaucmhswnex +occbvembjeuthryi +dmefxmxqjncirdwj +ystmvxklmcdlsvin +pplykqlxmkdrmydq +cbbjkpbdvjhkxnuc +embhffzsciklnxrz +asrsxtvsdnuhcnco +xcbcrtcnzqedktpi +mglwujflcnixbkvn +mnurwhkzynhahbjp +cekjbablkjehixtj +kbkcmjhhipcjcwru +usifwcsfknoviasj +rsfgocseyeflqhku +prgcyqrickecxlhm +asbawplieizkavmq +sylnsirtrxgrcono +nzspjfovbtfkloya +qfxmsprfytvaxgtr +yckpentqodgzngnv +ycsfscegcexcnbwq +kbmltycafudieyuh +tpahmvkftilypxuf +qivqozjrmguypuxu +gdhbfradjuidunbk +vxqevjncsqqnhmkl +rpricegggcfeihst +xucvzpprwtdpzifq +egyjcyyrrdnyhxoo +kfbrzmbtrrwyeofp +qpjdsocrtwzpjdkd +reboldkprsgmmbit +vwkrzqvvhqkensuy +ydvmssepskzzvfdp +vqbigplejygdijuu +mzpgnahrhxgjriqm +uiejixjadpfsxqcv +tosatnvnfjkqiaha +yipuojpxfqnltclx +pcxwvgcghfpptjlf +shrudjvvapohziaj +jdckfjdtjsszdzhj +hgisfhcbdgvxuilk +gytnfjmrfujnmnpp +ohflkgffnxmpwrrs +jzxajbkwwjknasjh +xrcxfollmejrislv +djjlwykouhyfukob +rittommltkbtsequ +lpbvkxdcnlikwcxm +vkcrjmcifhwgfpdj +dkhjqwtggdrmcslq +swnohthfvjvoasvt +yrzoksmcnsagatii +duommjnueqmdxftp +inlvzlppdlgfmvmx +xibilzssabuqihtq +inkmwnvrkootrged +ldfianvyugqtemax +gbvwtiexcuvtngti +temjkvgnwxrhdidc +askbbywyyykerghp +onezejkuwmrqdkfr +kybekxtgartuurbq +ubzjotlasrewbbkl +stueymlsovqgmwkh +lhduseycrewwponi +yohdmucunrgemqcu +onnfbxcuhbuifbyc +odrjkigbrsojlqbt +imqkqqlkgmttpxtx +sxmlkspqoluidnxw +akaauujpxhnccleb +xvgpghhdtpgvefnk +jdxeqxzsbqtvgvcq +mdusenpygmerxnni +agihtqvgkmgcbtaw +dovxcywlyvspixad +uulgazeyvgtxqkfz +ndhmvrwuflhktzyo +hcaqkmrbvozaanvm +tvfozbqavqxdqwqv +rlkpycdzopitfbsv +dmyjtmjbtnvnedhs +fmwmqeigbzrxjvdu +twgookcelrjmczqi +grxosmxvzgymjdtz +zsstljhzugqybueo +jpeapxlytnycekbd +iasykpefrwxrlvxl +azohkkqybcnsddus +aoaekngakjsgsonx +awsqaoswqejanotc +sgdxmketnjmjxxcp +ylnyuloaukdrhwuy +ewoqjmakifbefdib +ytjfubnexoxuevbp +ewlreawvddptezdd +vmkonztwnfgssdog +ahbpuqygcwmudyxn +kmahpxfjximorkrh +otjbexwssgpnpccn +aewskyipyztvskkl +urqmlaiqyfqpizje +nrfrbedthzymfgfa +vndwwrjrwzoltfgi +iiewevdzbortcwwe +qiblninjkrkhzxgi +xmvaxqruyzesifuu +yewuzizdaucycsko +hmasezegrhycbucy +dwpjrmkhsmnecill +hnffpbodtxprlhss +avmrgrwahpsvzuhm +nksvvaswujiukzxk +zzzapwhtffilxphu +vwegwyjkbzsrtnol +qurpszehmkfqwaok +iknoqtovqowthpno +brlmpjviuiagymek +efxebhputzeulthq +mzkquarxlhlvvost +xsigcagzqbhwwgps +qufztljyzjxgahdp +dlfkavnhobssfxvx +hgdpcgqxjegnhjlr +fboomzcvvqudjfbi +wnjuuiivaxynqhrd +nhcgzmpujgwisguw +wjeiacxuymuhykgk +qmeebvxijcgdlzpf +nmmnxsehhgsgoich +ejluaraxythbqfkl +mdbsbwnaypvlatcj +nnfshfibmvfqrbka +dvckdmihzamgqpxr +foztgqrjbwyxvewk +okpryqcbvorcxhoh +fpiwsndulvtthctx +zrbiovlmzdmibsiq +setwafbnnzcftutg +nyvqghxhgkxfobdm +enpvqadzarauhajl +twblhpvkazpdmhmr +lbhlllsgswvhdesh +tdfwkgxnqjxcvsuo +lnvyjjbwycjbvrrb +jsxqdvmzaydbwekg +xirbcbvwlcptuvoa +hwnukxenilatlfsk +khwopjqkxprgopmd +sljzdoviweameskw +stkrdmxmpaijximn +fdilorryzhmeqwkc +mfchaaialgvoozra +gjxhoxeqgkbknmze +beowovcoqnginrno +mkgmsgwkwhizunxo +phnhfusyoylvjdou +csehdlcmwepcpzmq +pgojomirzntgzohj +fkffgyfsvwqhmboz +mrvduasiytbzfwdn +epzrmsifpmfaewng +ooqxnoyqrlozbbyf +ahcxfmgtedywrbnx +ibqktvqmgnirqjot +xarssauvofdiaefn +xradvurskwbfzrnw +nxklmulddqcmewad +twichytatzoggchg +qmgvroqwrjgcycyv +yvezgulgrtgvyjjm +jgmcklzjdmznmuqk +bytajdwwconasjzt +apjttucpycyghqhu +flfejjzihodwtyup +gmrtrwyewucyqotv +nlohdrlymbkoenyl +wxcmqwbrwgtmkyfe +njtzlceyevmisxfn +htbbidsfbbshmzlt +gxhjeypjwghnrbsf +cifcwnbtazronikv +ezvjijcjcyszwdjy +srffeyrvyetbecmc +xpjefrtatrlkbkzl +yhncvfqjcyhsxhbb +pqhcufzlcezhihpr +qtdsfvxfqmsnzisp +dfonzdicxxhzxkrx +mqqqzhxkyfpofzty +dodjadoqyxsuazxt +jjwkrlquazzjbvlm +ttosfloajukoytfb +llateudmzxrzbqph +criqihrysgesmpsx +npszvlittbcxxknj +qmzojrvraitrktil +cfyoozzpwxwkwoto +daxohtcgvtktggfw +vthkpkoxmiuotjaj +pkfkyobvzjeecnui +ojcjiqrfltbhcdze +scbivhpvjkjbauun +ysowvwtzmqpjfwyp +laeplxlunwkfeaou +jufhcikovykwjhsa +xrucychehzksoitr +pyaulaltjkktlfkq +oypfrblfdhwvqxcv +zybrgxixvhchgzcf +puoagefcmlxelvlp +xjnhfdrsbhszfsso +ocgvzryoydaoracw +bxpnqllmptkpeena +pziyeihxlxbbgdio +bvtrhtlbfzmglsfc +ggpuvtseebylsrfk +pukenexjqecnivfj +jswabfbzpnhhdbpn +enojrtwqpfziyqsv +rjtmxudgcudefuiz +iqmjxynvtvdacffc +uheywxlsusklitvl +kwhxduejafdpmqdc +rspgblenbqlmcltn +rczhurnrqqgjutox +dqhytibjzxkdblzl +hpbieadydiycvfys +pucztfoqvenxiuym +nqpfzgpblwijiprf +ltgseeblgajbvltk +mwxukbsnapewhfrc +dvxluiflicdtnxix +pexfbpgnqiqymxcq +dakudfjjwtpxuzxy +letlceyzlgmnrewu +ojktahbsdifdfhmd +anezoybbghjudbih +sawxtlvzysaqkbbf +ttnkctcevpjiwqua +edrwrdvbaoqraejd +wnbfilvuienjxlcr +wqhzwvyybyxhhtsm +jxbgvyaqczwdlxfo +wbypqfmbwrsvfmdv +izdxjyfpidehbets +vbxbggqseurknjor +egpmpoxickhvwdlz +ivfrzklvpwoemxsy +xkziseheibmrpdww +xnrmtoihaudozksa +efemdmbxdsaymlrw +yjdjeckmsrckaagx +vlftqxxcburxnohv +fwyquwgajaxebduj +dwpmqvcxqwwnfkkr +isduxxjfsluuvwga +avdtdppodpntojgf +vrcoekdnutbnlgqk +kbhboxjmgomizxkl +cgsfpjrmewexgzfy +usdtnhjxbvtnafvp +bjoddgxbuxzhnsqd +hoyqdzofddedevsb +rwiwbvqfjajotaoj +iabomphsuyfptoos +bubeonwbukprpvhy +xurgunofmluhisxm +puyojzdvhktawkua +dbvqhztzdsncrxkb +oaeclqzyshuuryvm +nmgwfssnflxvcupr +vjkiwbpunkahtsrw +romyflhrarxchmyo +yecssfmetezchwjc +qwtocacqdslhozkd +mesexvfbtypblmam +mtjucgtjesjppdtt +pvodhqqoeecjsvwi +vvlcwignechiqvxj +wiqmzmmjgjajwgov +kwneobiiaixhclev +lkdeglzrrxuomsyt +oqovuwcpwbghurva +lfsdcxsasmuarwwg +awkbafhswnfbhvck +sztxlnmyvqsiwljg +hozxgyxbcxjzedvs +oifkqgfqmflxvyzn +mfvnehsajlofepib +delgbyfhsyhmyrfa +uenimmwriihxoydv +vjqutpilsztquutn +kfebsaixycrodhvl +coifyqfwzlovrpaj +xiyvdxtkqhcqfsqr +hoidcbzsauirpkyt +fiumhfaazfkbaglq +fzwdormfbtkdjgfm +faxqrortjdeihjfv +ljhaszjklhkjvrfi +pzrxsffkuockoqyl +immbtokjmwyrktzn +lzgjhyiywwnuxpfx +vhkocmwzkfwjuzog +ghntjkszahmdzfbl +gbcthxesvqbmzggy +oyttamhpquflojkh +nbscpfjwzylkfbtv +wnumxzqbltvxtbzs +jfhobjxionolnouc +nrtxxmvqjhasigvm +hweodfomsnlgaxnj +lfgehftptlfyvvaj +ccoueqkocrdgwlvy +euhgvirhsaotuhgf +pdlsanvgitjvedhd +seokvlbhrfhswanv +pntdqaturewqczti +jkktayepxcifyurj +dhzzbiaisozqhown +wehtwakcmqwczpbu +zwvozvspqmuckkcd +efucjlrwxuhmjubr +lzodaxuyntrnxwvp +qdezfvpyowfpmtwd +mizijorwrkanesva +txmitbiqoiryxhpz +xhsqgobpouwnlvps +muixgprsknlqaele +disgutskxwplodra +bmztllsugzsqefrm +ymwznyowpaaefkhm +ebfifzloswvoagqh +pkldomvvklefcicw +ziqzbbfunmcgrbtq +iuekfpbkraiwqkic +jflgjidirjapcuqo +achsfbroyrnqnecg +udbhouhlgjjzapzr +arerrohyhhkmwhyo +txyjzkqexgvzdtow +ogzrjwibvzoucrpg +rfdftaesxdnghwhd +axdhwmpuxelmpabo +gtktemowbsvognac +wkfuclilhqjzxztk +qbwjouutzegaxhrz +opfziwqqbwhzzqhj +pvcvcsupfwsmeacs +xsbohvbguzsgpawn +sczoefukwywxriwj +oqkhcqfdeaifbqoc +vtsrholxbjkhwoln +yuvapljnwbssfbhi +dxdfwccqvyzeszyl +gdbmjtonbiugitmb +qunirtqbubxalmxr +zzxsirhdaippnopr +fibtndkqjfechbmq +gqgqyjvqmfiwiyio +ihwsfkwhtzuydlzw +eygyuffeyrbbhlit +zdlsaweqomzrhdyy +ptbgfzuvxiuuxyds +llxlfdquvovzuqva +wfrltggyztqtyljv +kwipfevnbralidbm +gbhqfbrvuseellbx +obkbuualrzrakknv +hlradjrwyjgfqugu +vtqlxbyiaiorzdsp +tedcbqoxsmbfjeyy +cxdppfvklbdayghy +gjnofexywmdtgeft +ldzeimbbjmgpgeax +egrwsmshbvbawvja +vadfrjvcrdlonrkg +mojorplakzfmzvtp +jyurlsoxhubferpo +ijwqogivvzpbegkm +cnmetoionfxlutzg +lawigelyhegqtyil +mqosapvnduocctcd +eqncubmywvxgpfld +vigfretuzppxkrfy +ncwynsziydoflllq +cbllqinsipfknabg +ndtbvdivzlnafziq +iqrrzgzntjquzlrs +damkuheynobqvusp +jxctymifsqilyoxa +ylritbpusymysmrf +paoqcuihyooaghfu +obhpkdaibwixeepl +igrmhawvctyfjfhd +ybekishyztlahopt +vkbniafnlfqhhsrq +kltdigxmbhazrywf +ufhcoyvvxqzeixpr +klcxdcoglwmeynjt +funpjuvfbzcgdhgs +akgyvyfzcpmepiuc +zhlkgvhmjhwrfmua +ibsowtbnrsnxexuz +vpufbqilksypwlrn +ngrintxhusvdkfib +ziuwswlbrxcxqslw +sucledgxruugrnic +zwnsfsyotmlpinew +oaekskxfcwwuzkor +qjmqwaktpzhwfldu +tmgfgqgpxaryktxo +qfaizepgauqxvffk +addkqofusrstpamf +shdnwnnderkemcts +gwfygbsugzptvena +fpziernelahopdsj +bkkrqbsjvyjtqfax +gxrljlqwxghbgjox +ipfwnqaskupkmevm +nnyoyhnqyfydqpno +lgzltbrrzeqqtydq +fgzxqurhtdfucheb +jvpthtudlsoivdwj +bmlhymalgvehvxys +fhklibetnvghlgnp +hfcyhptxzvblvlst +donanindroexgrha +oqawfmslbgjqimzx +jzgehjfjukizosep +bhlgamcjqijpvipb +jrcrdjrvsyxzidsk +ouwfwwjqezkofqck +wrvsbnkhyzayialf +knhivfqjxrxnafdl +hbxbgqsqwzijlngf +qlffukpfmnxpfiyq +evhxlouocemdkwgk +baxhdrmhaukpmatw +nwlyytsvreqaminp +ljsjjzmlsilvxgal +onunatwxfzwlmgpk +njgolfwndqnwdqde +ngdgcjzxupkzzbqi +ieawycvvmvftbikq +ccyvnexuvczvtrit +enndfwjpwjyasjvv +tcihprzwzftaioqu +bkztdkbrxfvfeddu +qkvhtltdrmryzdco +rurtxgibkeaibofs +mjxypgscrqiglzbp +unpkojewduprmymd +csqtkhjxpbzbnqog +mednhjgbwzlhmufi +sfrwfazygygzirwd +ijqeupbrhhpqxota +cmhpncanwudyysyh +wwcxbwzrplfzrwxd +jriomldifuobjpmq +radonyagpulnnyee +ryqjwxsspbbhnptd +yeoqpnsdhludlmzf +qsqlkeetyalenueh +qnnedenwsjdrcrzt +lejkuhsllxbhfcrx +anddbvllrrqefvke +wdtljquijaksvdsv +adslgvfuqqdkzvbc +whbccefjpcnjwhaq +kqrfuankaibohqsg +fyxisfwihvylgnfd +rwqdrddghyqudcif +syhzowthaaiiouaf +zjmrtgrnohxmtidu +deecwkfvjffxrzge +dztmvolqxkhdscxe +cdghcrgavygojhqn +pepqmdbjhnbugqeu +pnumdjpnddbxhieg +jzfhxeyahiagizfw +hdkwugrhcniueyor +gmgudeqlbmqynflu +toidiotdmfkxbzvm +pyymuoevoezlfkjb +etrbwuafvteqynlr +usvytbytsecnmqtd +dfmlizboawrhmvim +vrbtuxvzzefedlvs +vslcwudvasvxbnje +xdxyvoxaubtwjoif +mduhzhascirittdf +cqoqdhdxgvvvxamk +dshnfwhqjbhuznqr +zimthfxbdmkulkjg +luylgfmmwbptyzpj +iujpcgogshhotqrc +caqcyzqcumfljvsp +sprtitjlbfpygxya +fnconnrtnigkpykt +irmqaqzjexdtnaph +bbqrtoblmltvwome +ozjkzjfgnkhafbye +hwljjxpxziqbojlw +zahvyqyoqnqjlieb +dptshrgpbgusyqsc +uzlbnrwetkbkjnlm +yccaifzmvbvwxlcc +wilnbebdshcrrnuu +evxnoebteifbffuq +khbajekbyldddzfo +kjivdcafcyvnkojr +wtskbixasmakxxnv +uzmivodqzqupqkwx +rxexcbwhiywwwwnu +rowcapqaxjzcxwqi +fkeytjyipaxwcbqn +pyfbntonlrunkgvq +qiijveatlnplaifi +ltnhlialynlafknw +urrhfpxmpjwotvdn +xklumhfyehnqssys +civrvydypynjdoap +fvbmxnfogscbbnyd +oznavyflpzzucuvg +iyshrpypfbirahqo +qmzbfgelvpxvqecy +xkkxaufomsjbofmk +irlouftdmpitwvlq +csjoptbdorqxhnjg +bkryeshfsaqpdztm +guxbdqzfafsjoadl +tgrltexgrzatzwxf +cwsgsijqdanubxad +xafnexgturwrzyrg +apcrsqdbsbaxocxr +pspgxnzcevmvvejk +szephmeegvegugdt +ndjsoloeacasxjap +bdnfksliscnirjfu +ehglacmzpcgglpux +jwweijomqfcupvzw +yesblmmkqhbazmdu +sjsmalypmuslzgac +fkiqatyttlnuhdho +tlhnyuzdocvfdihq +ngehtjmycevnybga +obxodzcdgtrycgry +stkyrvdfbwovawmk +bdkhqcfrqaxhxloo +gpvumnuoiozipnrk +jbhanddinpqhxeol +hwkzkmbmsrvunzit +rfuomegkxbyamjpw +yzbljuksletipzwm +eafedkagwitzqigl +prenqvsbotqckgwy +spedpbwzphdrfxfz +cmsuqwemhwixkxet +xgdyeqbqfldvaccq +eooxgsrfsbdaolja +kyhqylxooewrhkho +mswieugqpoefmspt +uszoqundysdyeqlc +hkmjdggxefdyykbq +dtuhjnlaliodtlvh +oalbueqbhpxoxvvx +oowxtxsoqdwhzbya +lclajfsrpmtwvzkm +fxmjufpqtpyazeqo +ozlmreegxhfwwwmf +mqzrajxtxbaemrho +nfglecsyqduhakjr +nkxqtmasjjkpkqbp +jjfonbqimybvzeus +vjqkhkhjlmvpwkud +wxxhnvfhetsamzjr +pladhajujzttgmsw +dbycgxeymodsdlhm +qxszeuaahuoxjvwu +adultomodzrljxve +dmhgrbhvvpxyzwdn +slohrlwxerpahtyp +mngbocwyqrsrrxdb +facyrtflgowfvfui +hyvazpjucgghmmxh +twtrvjtncmewcxit +uejkrpvilgccfpfr +psqvolfagjfvqkum +nvzolslmiyavugpp +lpjfutvtwbddtqiu +fkjnfcdorlugmcha +eaplrvdckbcqqvhq +xrcydhkockycburw +iswmarpwcazimqxn +kicnnkjdppitjwrl +vwywaekzxtmeqrsu +dxlgesstmqaxtjta +pmeljgpkykcbujbb +vhpknqzhgnkyeosz +jprqitpjbxkqqzmz +fiprxgsqdfymyzdl +dzvfwvhfjqqsifga +aeakhfalplltmgui +frqrchzvenhozzsu +hsvikeyewfhsdbmy +puedjjhvxayiwgvg +zmsonnclfovjoewb +bnirelcaetdyaumi +szvudroxhcitatvf +sccfweuyadvrjpys +yiouqrnjzsdwyhwa +xyjhkqbnfmjjdefz +fjwgemkfvettucvg +aapqpwapzyjnusnr +dytxpkvgmapdamtc +hgocpfoxlheqpumw +twzuiewwxwadkegg +qdbosnhyqmyollqy +fclbrlkowkzzitod +sgxnrrpwhtkjdjth +xckvsnkvnvupmirv +nioicfeudrjzgoas +lcemtyohztpurwtf +oyjxhhbswvzekiqn +idkblbyjrohxybob +rthvloudwmktwlwh +oyzhmirzrnoytaty +ysdfhuyenpktwtks +wxfisawdtbpsmwli +vgmypwlezbmzeduk +rpepcfpelvhzzxzj +zxbovsmixfvmamnj +cpkabmaahbnlrhiz +jvomcbqeoqrmynjj +iqdeisnegnkrkdws +ilhemlrtxdsdnirr +fjimtscrwbfuwmpo +lmfiylebtzwtztmx +ddouhysvomrkcpgu +xtjwvzdhgnwwauwi +cntzuwcumbsebwyy +hieqvdlvnxkygeda +hushfszxskjdrjxi +xvdfzqblccfoxvyq +nldnrtieteunyxnb +vszpidfocenlhzqb +ofcuvtwhortxesoq +bwniqemqwxlejcfq +wkqiwdjnytjnomps +rbadoommlmrictte +nsmxhpothlulxivt +bvzbfcvenskqxejr +sdqeczmzpqqtqabq +bjveyzniaaliatkw +zxsqlntyjajjxytk +jkoxlerbtidsuepg +ewtlibdkeqwgxnqt +lmrshemwxrdwzrgc +nekcdyxmftlymfir +edaqvmulzkskzsfy +znmvqaupykjmyebx +ximtebuxwhqpzubd +rrlstppkknqyxlho +uyibwcitxixjfwcr +chrvoierkimesqmm +dltxmwhheldvxwqe +xfuthxjuuizanfjy +vtiwavmxwonpkpug +phchnujfnxewglht +owvmetdjcynohxtw +cbtujdrumixxatry +iirzildsfxipfipe +sqxcscqyofohotcy +sbubnekndkvovuqg +jzhsqqxqdrtibtcd +mscwasyvxkhlvwbn +bpafxtagbuxivbwz +uhvueesygaxrqffw +trrxlibhtmzuwkkl +yktkmkokmfslgkml +gfzzzdptaktytnqg +pgqmaiwzhplnbyhg +qjiptlkwfshunsfb +lewvlpescsyunxck +tywsfatykshogjas +qtrnwjjgxdektjgi +arypcritpwijczkn +jwxvngigbhfpiubf +upsjdctitlbqlnhf +lvpjlrpnmdjiscrq +jvzchdrsnkgpgsti +wuoesbwunpseyqzu +xuqspvoshgxmrnrb +icdawnmfnpnmyzof +hwcwtibgpvctznuo +bzdjrniddyamfloq +hffkxtzuazageruv +deixfxjvzbitalnc +zihsohukiqrgsnvw +nwoondfnlgowavkg +qnuulsywgnoillgn +koozejhfjyzuhviy +oetcoipohymhpump +cizwpfczfoodwuly +jghlinczhtaxifau +svjejifbidnvvdvy +rxmbsnaqhzcnbfcl +vveubmiecvdtrket +sbihpvrcnzjtgfep +iqbuljuxkwrlebvw +ptrhvxrpezqvmmvv +duwzugnhktpiybjw +lijafjnujfeflkva +coylvegferuuyfop +fowsjrgammrqkkof +pgmcruaioccmbrbz +osejwflxagwqtjoi +otqflckqgxzvtper +slwyntdcrncktoka +hzcdzsppcfkrblqg +jksdmmvtzkqaompg +galwwwgugetdohkg +zbghtjvuikmfjuef +dmqwcamjtlcofqib +zbczldlfdzemxeys +mdlqoklybhppdkwe +tuyajhkexrrrvnlb +ylfolaubymxmkowo +nnsyrfnoyrxswzxn +zkhunhhhigbsslfk +spbokzdfkbmflanz +zmzxvrwdhiegfely +imywhfczvmgahxwl +fnvabvxeiqvsarqq +yschramprctnputs +ubyjrgdzsvxzvouj +qnvdhpptympctfer +smipxcntyhjpowug +ouhjibgcmotegljy +zpflubaijjqqsptz +fgysnxrnfnxprdmf +pbpznrexzxomzfvj +thhzjresjpmnwtdv +sbmokolkhvbfqmua +sxxpdohxlezmqhhx +pevvsyqgoirixtqh +wdxrornmhqsbfznb +zjqziqbctxkshqcn +nbqcwpzfwfaahylk +bxbvkonpcxprxqjf +xplbpqcnwzwqxheb +prsakggmnjibrpoy +xoguxbpnrvyqarjl +ilrgryrmgwjvpzjy +efwrmokaoigjtrij +yhcncebopycjzuli +gwcmzbzaissohjgn +lggmemwbbjuijtcf +fkqedbfrluvkrwwl +jcbppekecevkwpuk +onvolrckkxeyzfjt +zzousprgrmllxboy +cajthmamvxuesujl +rmiozfsikufkntpg +lvekypkwjbpddkcv +dwaqzfnzcnabersa +pcdsskjopcqwhyis +uabepbrrnxfbpyvx +yxlgdomczciiunrk +ccerskfzctqxvrkz +edvmkntljlncwhax +xtcbwecdwygrvowo +axqgqjqkqwrgcqot +tyjrynolpzqwnjgj +thrtmlegdjsuofga +mpgoeqkzzqqugait +emuslxgoefdjyivl +klehpcehdznpssfb +xfgvugyrdxolixkc +acenyrbdwxywmwst +yqgperajsfsamgan +dbjxlnumrmhipquw +hsnhirmswcenewxm +qehqkbhmgucjjpwo +gprjdglsbtsfzqcw +wvqkyrkoratfmvfi +myhzlerupqbduqsl +couyazesiuhwwhht +scxzehubxhkfejrr +gqlitwfriqkmzqdd +pxtbmqelssoagxko +dzhklewjqzmrfzsw +yxgeypduywntnbji +kwzbgzhkzbgedlfh +vukmuyfstgmscuab +vcmaybfvdgwnasgt +qmybkqqdhjigzmum +cbnuicuncvczyalu +qdgpsdpdlgjasjqr +kdzxqqheurupejjo +mcatrxfchbqnxelm +badunwkeggdkcgco +ntaeanvcylpoqmxi +ghnyfytpzgvuokjn +ozepydixmjijdmts +qefcfwzdhwmcyfvp +ycyktmpaqgaxqsxt +edpizkxnsxeeebfl +uwciveajsxxwoqyr +rbvjkljpxtglqjsh +nbplrskduutrptfk +vewrbadvkseuloec +upaotnjxquomoflx +qfwxkinrousqywdd +mqzxvvskslbxvyjt +oxicszyiqifoyugx +bkitxwzjpabvhraj +ydrbyjecggynjpir +hezyteaublxxpamq +hxkuektnoovsehnd +cwtbbavnhlpiknza +qrwvkhbyasgfxwol +qryjbohkprfazczc +wjksnogpxracrbud +znmsxbhliqxhvesr +gkippedrjzmnnwkp +pklylwsnsyyxwcwg +osdpwbxoegwaiemr +kpslrrrljgtjiqka +vuqkloqucpyzfxgk +bvtdsisgvkuzghyl +qlcayluuyvlhdfyy +kbimqwnzanlygaya +nvoeanlcfhczijed +kqvcijcuobtdwvou +pmhdpcmxnprixitl +yueilssewzabzmij +zqxhafrvjyeyznyg +mhdounmxkvnnsekx +hnacyglnzicxjakg +iaxfdqibnrcjdlyl +iypoelspioegrwix +uiqouxzmlnjxnbqt +kslgjfmofraorvjo +bgvotsdqcdlpkynk +huwcgxhvrrbvmmth +vpqyfnkqqjacpffw +hpjgdfovgmrzvrcl +vbntbhbvdeszihzj +nrbyyuviwyildzuw +wckeoadqzsdnsbox +xgsobwuseofxsxox +anvhsxdshndembsd +iygmhbegrwqbqerg +ylrsnwtmdsrgsvlh +zvvejnrarsavahvc +yncxhmmdtxxeafby +kekgiglblctktnes +uoqgymsrlrwdruzc +saaoymtmnykusicw +bqvcworpqimwglcp +zbpgtheydoyzipjv +pkykzslwsjbhcvcj +jhwxxneyuuidrzvl +pafeyajcrlehmant +klszcvtmcdeyfsmj +ledsltggvrbvlefn +hubpbvxknepammep +gthxhaapfpgtilal +jtfhbozlometwztj +jrhshycyenurbpwb +fyaxbawrsievljqv +lgfcgbenlqxqcxsd +dhedabbwbdbpfmxp +mxzgwhaqobyvckcm +qboxojoykxvwexav +jcpzfjnmvguwjnum +ohpsxnspfwxkkuqe +nyekrqjlizztwjqp +thuynotacpxjzroj +wymbolrlwosnbxqx +iyaqihnqvewxdtjm +hdvdbtvfpdrejenu +gtjscincktlwwkkf +wtebigbaythklkbd \ No newline at end of file diff --git a/data/2015_06_data.txt b/data/2015_06_data.txt new file mode 100644 index 0000000..657e45d --- /dev/null +++ b/data/2015_06_data.txt @@ -0,0 +1,300 @@ +turn off 660,55 through 986,197 +turn off 341,304 through 638,850 +turn off 199,133 through 461,193 +toggle 322,558 through 977,958 +toggle 537,781 through 687,941 +turn on 226,196 through 599,390 +turn on 240,129 through 703,297 +turn on 317,329 through 451,798 +turn on 957,736 through 977,890 +turn on 263,530 through 559,664 +turn on 158,270 through 243,802 +toggle 223,39 through 454,511 +toggle 544,218 through 979,872 +turn on 313,306 through 363,621 +toggle 173,401 through 496,407 +toggle 333,60 through 748,159 +turn off 87,577 through 484,608 +turn on 809,648 through 826,999 +toggle 352,432 through 628,550 +turn off 197,408 through 579,569 +turn off 1,629 through 802,633 +turn off 61,44 through 567,111 +toggle 880,25 through 903,973 +turn on 347,123 through 864,746 +toggle 728,877 through 996,975 +turn on 121,895 through 349,906 +turn on 888,547 through 931,628 +toggle 398,782 through 834,882 +turn on 966,850 through 989,953 +turn off 891,543 through 914,991 +toggle 908,77 through 916,117 +turn on 576,900 through 943,934 +turn off 580,170 through 963,206 +turn on 184,638 through 192,944 +toggle 940,147 through 978,730 +turn off 854,56 through 965,591 +toggle 717,172 through 947,995 +toggle 426,987 through 705,998 +turn on 987,157 through 992,278 +toggle 995,774 through 997,784 +turn off 796,96 through 845,182 +turn off 451,87 through 711,655 +turn off 380,93 through 968,676 +turn on 263,468 through 343,534 +turn on 917,936 through 928,959 +toggle 478,7 through 573,148 +turn off 428,339 through 603,624 +turn off 400,880 through 914,953 +toggle 679,428 through 752,779 +turn off 697,981 through 709,986 +toggle 482,566 through 505,725 +turn off 956,368 through 993,516 +toggle 735,823 through 783,883 +turn off 48,487 through 892,496 +turn off 116,680 through 564,819 +turn on 633,865 through 729,930 +turn off 314,618 through 571,922 +toggle 138,166 through 936,266 +turn on 444,732 through 664,960 +turn off 109,337 through 972,497 +turn off 51,432 through 77,996 +turn off 259,297 through 366,744 +toggle 801,130 through 917,544 +toggle 767,982 through 847,996 +turn on 216,507 through 863,885 +turn off 61,441 through 465,731 +turn on 849,970 through 944,987 +toggle 845,76 through 852,951 +toggle 732,615 through 851,936 +toggle 251,128 through 454,778 +turn on 324,429 through 352,539 +toggle 52,450 through 932,863 +turn off 449,379 through 789,490 +turn on 317,319 through 936,449 +toggle 887,670 through 957,838 +toggle 671,613 through 856,664 +turn off 186,648 through 985,991 +turn off 471,689 through 731,717 +toggle 91,331 through 750,758 +toggle 201,73 through 956,524 +toggle 82,614 through 520,686 +toggle 84,287 through 467,734 +turn off 132,367 through 208,838 +toggle 558,684 through 663,920 +turn on 237,952 through 265,997 +turn on 694,713 through 714,754 +turn on 632,523 through 862,827 +turn on 918,780 through 948,916 +turn on 349,586 through 663,976 +toggle 231,29 through 257,589 +toggle 886,428 through 902,993 +turn on 106,353 through 236,374 +turn on 734,577 through 759,684 +turn off 347,843 through 696,912 +turn on 286,699 through 964,883 +turn on 605,875 through 960,987 +turn off 328,286 through 869,461 +turn off 472,569 through 980,848 +toggle 673,573 through 702,884 +turn off 398,284 through 738,332 +turn on 158,50 through 284,411 +turn off 390,284 through 585,663 +turn on 156,579 through 646,581 +turn on 875,493 through 989,980 +toggle 486,391 through 924,539 +turn on 236,722 through 272,964 +toggle 228,282 through 470,581 +toggle 584,389 through 750,761 +turn off 899,516 through 900,925 +turn on 105,229 through 822,846 +turn off 253,77 through 371,877 +turn on 826,987 through 906,992 +turn off 13,152 through 615,931 +turn on 835,320 through 942,399 +turn on 463,504 through 536,720 +toggle 746,942 through 786,998 +turn off 867,333 through 965,403 +turn on 591,477 through 743,692 +turn off 403,437 through 508,908 +turn on 26,723 through 368,814 +turn on 409,485 through 799,809 +turn on 115,630 through 704,705 +turn off 228,183 through 317,220 +toggle 300,649 through 382,842 +turn off 495,365 through 745,562 +turn on 698,346 through 744,873 +turn on 822,932 through 951,934 +toggle 805,30 through 925,421 +toggle 441,152 through 653,274 +toggle 160,81 through 257,587 +turn off 350,781 through 532,917 +toggle 40,583 through 348,636 +turn on 280,306 through 483,395 +toggle 392,936 through 880,955 +toggle 496,591 through 851,934 +turn off 780,887 through 946,994 +turn off 205,735 through 281,863 +toggle 100,876 through 937,915 +turn on 392,393 through 702,878 +turn on 956,374 through 976,636 +toggle 478,262 through 894,775 +turn off 279,65 through 451,677 +turn on 397,541 through 809,847 +turn on 444,291 through 451,586 +toggle 721,408 through 861,598 +turn on 275,365 through 609,382 +turn on 736,24 through 839,72 +turn off 86,492 through 582,712 +turn on 676,676 through 709,703 +turn off 105,710 through 374,817 +toggle 328,748 through 845,757 +toggle 335,79 through 394,326 +toggle 193,157 through 633,885 +turn on 227,48 through 769,743 +toggle 148,333 through 614,568 +toggle 22,30 through 436,263 +toggle 547,447 through 688,969 +toggle 576,621 through 987,740 +turn on 711,334 through 799,515 +turn on 541,448 through 654,951 +toggle 792,199 through 798,990 +turn on 89,956 through 609,960 +toggle 724,433 through 929,630 +toggle 144,895 through 201,916 +toggle 226,730 through 632,871 +turn off 760,819 through 828,974 +toggle 887,180 through 940,310 +toggle 222,327 through 805,590 +turn off 630,824 through 885,963 +turn on 940,740 through 954,946 +turn on 193,373 through 779,515 +toggle 304,955 through 469,975 +turn off 405,480 through 546,960 +turn on 662,123 through 690,669 +turn off 615,238 through 750,714 +turn on 423,220 through 930,353 +turn on 329,769 through 358,970 +toggle 590,151 through 704,722 +turn off 884,539 through 894,671 +toggle 449,241 through 984,549 +toggle 449,260 through 496,464 +turn off 306,448 through 602,924 +turn on 286,805 through 555,901 +toggle 722,177 through 922,298 +toggle 491,554 through 723,753 +turn on 80,849 through 174,996 +turn off 296,561 through 530,856 +toggle 653,10 through 972,284 +toggle 529,236 through 672,614 +toggle 791,598 through 989,695 +turn on 19,45 through 575,757 +toggle 111,55 through 880,871 +turn off 197,897 through 943,982 +turn on 912,336 through 977,605 +toggle 101,221 through 537,450 +turn on 101,104 through 969,447 +toggle 71,527 through 587,717 +toggle 336,445 through 593,889 +toggle 214,179 through 575,699 +turn on 86,313 through 96,674 +toggle 566,427 through 906,888 +turn off 641,597 through 850,845 +turn on 606,524 through 883,704 +turn on 835,775 through 867,887 +toggle 547,301 through 897,515 +toggle 289,930 through 413,979 +turn on 361,122 through 457,226 +turn on 162,187 through 374,746 +turn on 348,461 through 454,675 +turn off 966,532 through 985,537 +turn on 172,354 through 630,606 +turn off 501,880 through 680,993 +turn off 8,70 through 566,592 +toggle 433,73 through 690,651 +toggle 840,798 through 902,971 +toggle 822,204 through 893,760 +turn off 453,496 through 649,795 +turn off 969,549 through 990,942 +turn off 789,28 through 930,267 +toggle 880,98 through 932,434 +toggle 568,674 through 669,753 +turn on 686,228 through 903,271 +turn on 263,995 through 478,999 +toggle 534,675 through 687,955 +turn off 342,434 through 592,986 +toggle 404,768 through 677,867 +toggle 126,723 through 978,987 +toggle 749,675 through 978,959 +turn off 445,330 through 446,885 +turn off 463,205 through 924,815 +turn off 417,430 through 915,472 +turn on 544,990 through 912,999 +turn off 201,255 through 834,789 +turn off 261,142 through 537,862 +turn off 562,934 through 832,984 +turn off 459,978 through 691,980 +turn off 73,911 through 971,972 +turn on 560,448 through 723,810 +turn on 204,630 through 217,854 +turn off 91,259 through 611,607 +turn on 877,32 through 978,815 +turn off 950,438 through 974,746 +toggle 426,30 through 609,917 +toggle 696,37 through 859,201 +toggle 242,417 through 682,572 +turn off 388,401 through 979,528 +turn off 79,345 through 848,685 +turn off 98,91 through 800,434 +toggle 650,700 through 972,843 +turn off 530,450 through 538,926 +turn on 428,559 through 962,909 +turn on 78,138 through 92,940 +toggle 194,117 through 867,157 +toggle 785,355 through 860,617 +turn off 379,441 through 935,708 +turn off 605,133 through 644,911 +toggle 10,963 through 484,975 +turn off 359,988 through 525,991 +turn off 509,138 through 787,411 +toggle 556,467 through 562,773 +turn on 119,486 through 246,900 +turn on 445,561 through 794,673 +turn off 598,681 through 978,921 +turn off 974,230 through 995,641 +turn off 760,75 through 800,275 +toggle 441,215 through 528,680 +turn off 701,636 through 928,877 +turn on 165,753 through 202,780 +toggle 501,412 through 998,516 +toggle 161,105 through 657,395 +turn on 113,340 through 472,972 +toggle 384,994 through 663,999 +turn on 969,994 through 983,997 +turn on 519,600 through 750,615 +turn off 363,899 through 948,935 +turn on 271,845 through 454,882 +turn off 376,528 through 779,640 +toggle 767,98 through 854,853 +toggle 107,322 through 378,688 +turn off 235,899 through 818,932 +turn on 445,611 through 532,705 +toggle 629,387 through 814,577 +toggle 112,414 through 387,421 +toggle 319,184 through 382,203 +turn on 627,796 through 973,940 +toggle 602,45 through 763,151 +turn off 441,375 through 974,545 +toggle 871,952 through 989,998 +turn on 717,272 through 850,817 +toggle 475,711 through 921,882 +toggle 66,191 through 757,481 +turn off 50,197 through 733,656 +toggle 83,575 through 915,728 +turn on 777,812 through 837,912 +turn on 20,984 through 571,994 +turn off 446,432 through 458,648 +turn on 715,871 through 722,890 +toggle 424,675 through 740,862 +toggle 580,592 through 671,900 +toggle 296,687 through 906,775 \ No newline at end of file diff --git a/data/2016_01_data.txt b/data/2016_01_data.txt new file mode 100644 index 0000000..84209e8 --- /dev/null +++ b/data/2016_01_data.txt @@ -0,0 +1 @@ +L3, R1, L4, L1, L2, R4, L3, L3, R2, R3, L5, R1, R3, L4, L1, L2, R2, R1, L4, L4, R2, L5, R3, R2, R1, L1, L2, R2, R2, L1, L1, R2, R1, L3, L5, R4, L3, R3, R3, L5, L190, L4, R4, R51, L4, R5, R5, R2, L1, L3, R1, R4, L3, R1, R3, L5, L4, R2, R5, R2, L1, L5, L1, L1, R78, L3, R2, L3, R5, L2, R2, R4, L1, L4, R1, R185, R3, L4, L1, L1, L3, R4, L4, L1, R5, L5, L1, R5, L1, R2, L5, L2, R4, R3, L2, R3, R1, L3, L5, L4, R3, L2, L4, L5, L4, R1, L1, R5, L2, R4, R2, R3, L1, L1, L4, L3, R4, L3, L5, R2, L5, L1, L1, R2, R3, L5, L3, L2, L1, L4, R4, R4, L2, R3, R1, L2, R1, L2, L2, R3, R3, L1, R4, L5, L3, R4, R4, R1, L2, L5, L3, R1, R4, L2, R5, R4, R2, L5, L3, R4, R1, L1, R5, L3, R1, R5, L2, R1, L5, L2, R2, L2, L3, R3, R3, R1 \ No newline at end of file diff --git a/data/2024_01_data.txt b/data/2024_01_data.txt new file mode 100644 index 0000000..401abd4 --- /dev/null +++ b/data/2024_01_data.txt @@ -0,0 +1,1000 @@ +46669 36559 +54117 62675 +25659 15179 +18867 82784 +94354 78485 +28985 76228 +42358 34206 +59950 58682 +97799 24655 +52935 64167 +59303 53728 +85106 71005 +50792 91433 +13407 14222 +67886 61779 +16895 63137 +30061 23324 +52760 28081 +58542 49063 +90229 61487 +13000 11872 +75051 16072 +95703 59610 +71514 95236 +38533 15786 +96889 17973 +50570 62950 +22045 76693 +57193 91433 +14748 85022 +10514 38767 +29334 47840 +88964 45642 +48941 39483 +70592 24655 +93664 22449 +96355 69515 +81294 74800 +48811 85577 +45071 85562 +92092 82630 +84197 76933 +97582 13139 +87792 86408 +54977 27338 +99783 29891 +69620 61216 +13987 77826 +99852 96463 +91433 60831 +78088 46665 +72987 42777 +42868 69997 +68892 46927 +34108 66123 +43478 18458 +19787 42868 +94776 47041 +79484 42868 +51651 87993 +24205 29529 +44859 90283 +20200 73827 +87459 73406 +56046 83755 +91769 22449 +67206 27695 +12181 17936 +60868 83249 +38752 22334 +99845 94472 +41505 61216 +60128 24655 +29568 78485 +22811 63720 +58897 73583 +72379 79339 +37663 41578 +79732 61216 +73155 46563 +81753 43279 +51621 51888 +93416 86408 +47921 59610 +80800 23324 +96164 73406 +11851 98656 +23151 90283 +38856 89669 +68276 82552 +98955 32695 +54728 30695 +29338 75446 +62950 59047 +65523 19589 +37775 59752 +44035 55601 +88679 53778 +51799 86633 +88184 62950 +91162 78485 +93338 54646 +88930 17554 +86160 77826 +11460 56897 +25918 45594 +72148 91433 +92158 37114 +93731 49360 +87043 44224 +33307 76228 +28611 70786 +13314 61216 +65566 40058 +20245 63137 +37773 33408 +78163 30754 +63537 76662 +64165 11339 +80838 23324 +51282 29108 +25277 59610 +59407 75468 +67162 32283 +29618 22449 +38169 77435 +74644 65347 +15925 76228 +64235 87695 +14313 31523 +65574 70278 +94576 46927 +28941 76693 +56933 75648 +90283 20996 +15912 76693 +37371 11483 +42928 61216 +20043 15456 +79060 50351 +95841 86342 +90503 22449 +34098 55194 +59349 27339 +52463 49245 +44382 59610 +86377 39994 +77346 51349 +32396 82630 +89974 40626 +56849 67629 +62875 86860 +56067 34945 +92962 49059 +62901 46892 +25886 77783 +21697 96304 +38147 17270 +14550 90283 +13342 70663 +70611 68152 +20481 21488 +28904 58215 +26634 39518 +52203 30752 +66212 78485 +90182 98936 +20740 15786 +66065 65617 +61202 45164 +26862 99261 +58796 40132 +78079 70988 +81851 93597 +71297 91433 +92854 65509 +80295 27424 +63299 44867 +15813 58215 +16650 76933 +53617 23324 +26984 16067 +18903 22496 +45338 10448 +78888 63137 +45642 41937 +33541 24655 +48364 44977 +45753 86408 +38974 87966 +74367 95952 +30987 24768 +69198 61027 +79165 23324 +36565 49245 +93880 23324 +58577 22449 +88572 11153 +23891 35210 +57919 56916 +68618 29125 +69689 24742 +63792 67434 +42378 91433 +30886 85562 +68874 73316 +47080 76228 +17364 50012 +26523 95236 +91160 12505 +82072 63137 +85218 88792 +21179 45280 +83540 22449 +62790 75446 +99201 76966 +24655 91601 +15468 59236 +69939 40216 +26652 51063 +72139 22449 +38765 15786 +37220 73406 +46720 15786 +23324 12724 +28463 22865 +74495 12866 +81338 47719 +48576 67579 +57908 85562 +96483 75446 +12243 46927 +18922 30274 +96066 50932 +32506 57089 +63137 18017 +80079 34565 +78238 57507 +29990 85562 +63341 77826 +53097 89535 +77250 67346 +18752 22230 +84225 91433 +23056 22728 +72203 44957 +12182 95236 +54287 57853 +78417 76693 +79546 61111 +97938 90283 +28464 91433 +43864 61216 +25327 45949 +76917 18588 +88304 61216 +16599 91970 +90372 38723 +78721 47963 +61712 73406 +40506 20355 +80458 13289 +50334 49245 +10066 99664 +33077 90921 +27603 87695 +51307 62936 +18791 49524 +90086 98799 +61487 76228 +80381 77826 +30353 75446 +46686 63367 +67471 50064 +22404 67635 +73240 47665 +38824 85562 +52873 78957 +89294 79544 +55505 36605 +21363 73406 +54456 90283 +26147 51518 +51044 98236 +27948 22449 +28048 76228 +52852 87695 +33020 76933 +66414 51084 +29109 75446 +10430 72012 +53057 63137 +99531 27252 +77723 76933 +87307 24655 +81886 50012 +97967 90283 +24057 64661 +23205 63137 +18662 76693 +89627 25871 +70743 50012 +27182 88872 +75446 50012 +88535 38500 +83093 69995 +67214 88991 +79553 33819 +61690 50012 +76228 98865 +50955 95236 +93037 19499 +24196 49526 +59691 67094 +35278 90283 +61597 23324 +56941 37523 +20120 97355 +87535 87032 +41203 63891 +16392 87787 +72594 75446 +95236 76693 +59675 65584 +68845 90283 +78485 33285 +44280 62583 +98434 19636 +86408 22449 +49172 15344 +33704 41932 +57434 72228 +72242 16591 +55017 75193 +57538 97837 +66108 35681 +22194 32467 +74204 41085 +75528 56270 +55070 13932 +12362 69548 +80880 46460 +92437 86408 +62756 37768 +61713 33991 +65166 15786 +66265 57948 +59605 81427 +95292 61216 +53322 61216 +92343 77826 +57881 43673 +25694 79166 +50803 62933 +12557 76228 +30235 63137 +60145 59610 +69385 54371 +67591 95236 +75778 57891 +32402 72023 +85763 79371 +77826 58215 +54653 52717 +43427 73406 +87693 78923 +42560 99999 +56662 98907 +34358 15149 +72062 87084 +87457 25270 +79098 46927 +96786 63137 +12893 90634 +72153 22959 +79455 13986 +94850 28046 +73433 11290 +18596 58215 +82630 78485 +33604 14849 +15222 74035 +61085 23906 +36243 10054 +61417 39396 +97586 61216 +38303 13532 +46927 78485 +97158 28915 +47223 24655 +71928 16050 +48850 10274 +63968 59834 +74998 51096 +12237 16089 +15340 68204 +28588 86420 +27774 27427 +87417 76693 +68167 20436 +82772 87695 +16746 41792 +49969 76228 +68165 28891 +87687 73914 +31995 73403 +51948 57812 +92704 73961 +44851 23324 +81688 48766 +92752 24655 +87448 42868 +14258 13555 +97152 95236 +16893 58215 +49941 72107 +92908 95236 +30101 75629 +83485 19453 +70442 95236 +90285 24655 +55498 23539 +38791 77826 +51701 84708 +30330 59334 +59586 61909 +69360 16800 +96194 66338 +26813 94571 +16730 60469 +20452 61216 +88869 62950 +36471 85562 +48094 11994 +53210 58215 +25883 55787 +67454 16997 +28364 91433 +29596 18200 +39653 42554 +78247 98641 +68869 10213 +37243 61575 +78248 91234 +86264 24655 +42101 22449 +81992 77493 +65269 73406 +79512 88490 +23050 68216 +71745 32372 +12275 22311 +72704 57374 +40391 37266 +93996 81448 +60235 71232 +23986 45642 +31562 61893 +76700 68049 +95646 70208 +19567 23324 +91012 93539 +29318 15559 +25010 11836 +35563 51368 +54704 76228 +49819 40935 +33230 61216 +79086 14268 +51170 18475 +66485 81497 +18849 62950 +64392 24655 +95125 54268 +57789 27894 +59448 86408 +47257 86384 +15786 91433 +61948 42868 +86728 58933 +99498 59808 +52830 35210 +70990 70735 +67116 15019 +63821 73107 +27729 77826 +61964 32077 +36375 88334 +25299 59610 +86368 55921 +86423 71213 +73061 88241 +98588 25835 +13938 21656 +99826 95236 +37553 68730 +64667 62007 +93565 82405 +42768 29866 +42731 76693 +20204 30794 +71882 28231 +93933 73406 +32525 84373 +89842 64081 +31297 45009 +27264 75446 +93838 64694 +60747 78485 +13328 22449 +40592 95236 +91398 20009 +11574 90283 +96548 35894 +34268 49890 +86325 39672 +63884 15842 +30812 23567 +69993 24655 +22994 85977 +36141 24655 +17881 23324 +87053 12341 +85897 11252 +64282 31676 +83859 82810 +37811 70856 +30617 65639 +12124 82075 +25279 61216 +50876 76933 +93773 75446 +11066 73504 +75494 22449 +10852 22449 +75214 75446 +17183 55952 +40332 91433 +29117 20899 +30888 45919 +73512 32221 +78708 26250 +13367 76228 +92813 97383 +51110 47725 +25552 95236 +31096 38747 +83451 76754 +22497 49245 +42453 76693 +91372 53487 +91733 61487 +71459 79153 +45515 95236 +25529 81102 +21597 73394 +43122 82630 +63641 64171 +77303 61216 +37944 58215 +11386 77826 +77018 79070 +82992 96114 +51119 77798 +73221 23324 +18732 34798 +42279 46927 +89508 73730 +27791 80194 +28523 95308 +27555 12881 +29648 54618 +13577 98443 +56947 76693 +36475 87505 +38270 71142 +84688 28274 +19271 76693 +23825 22945 +95718 51459 +91764 51788 +27386 42182 +18677 55015 +67612 76693 +11810 44178 +87498 75376 +74359 45642 +35714 56252 +86955 70950 +28543 86408 +21253 57179 +81283 73406 +54208 83349 +87550 37110 +88194 76693 +68969 49473 +94869 80272 +18066 64411 +31310 15786 +57043 78434 +55440 89060 +88510 61216 +69221 64444 +45336 23324 +39240 51320 +86973 61853 +78101 71772 +24917 38491 +30454 84950 +95917 89580 +96914 78485 +77197 50552 +67382 31174 +73864 88832 +68112 77826 +34762 15786 +53167 36945 +58539 32505 +67660 41818 +89709 35248 +87156 49245 +98670 84396 +12340 44671 +51671 87514 +47948 18060 +69823 76228 +35233 73406 +52807 24655 +94057 26388 +63741 59610 +82004 66606 +93513 60231 +75084 35371 +10372 88851 +89866 46927 +24553 79589 +20556 15786 +46412 22449 +78846 24491 +98088 76693 +31170 92173 +94801 52961 +51058 13445 +70594 50037 +35346 50338 +78257 23324 +73406 21744 +68359 46927 +41213 55805 +45250 42131 +43279 18812 +69199 15786 +53725 76497 +69398 37768 +11742 73406 +65219 58877 +31780 38597 +46113 90283 +30112 76693 +37748 60472 +12596 58428 +22346 98357 +43346 53539 +89142 78485 +14544 38869 +31577 55185 +55937 87695 +41189 35667 +25078 73406 +59330 94542 +84733 16627 +82488 73406 +82948 58215 +16789 91433 +53671 27376 +70549 50516 +97581 54013 +91708 61216 +64783 37768 +89911 46097 +74663 76228 +70646 60061 +23944 31181 +30697 93934 +27561 95236 +52655 68084 +90627 38964 +27641 35708 +14184 91433 +42968 17857 +72204 30261 +77368 35970 +17048 89985 +20782 18407 +64749 78485 +41007 26752 +11880 97776 +44202 24368 +97301 23407 +61077 74465 +38804 77826 +13897 48877 +14508 37578 +61383 53091 +16885 29289 +37225 52081 +64685 35992 +31682 95236 +63631 10368 +45781 24466 +24092 65388 +31728 76228 +45777 22113 +51779 60657 +33859 29358 +53484 78827 +61319 49899 +36093 48789 +40584 77905 +56381 54295 +22662 38614 +24641 22449 +88324 59610 +78924 95236 +74820 61487 +77398 60846 +99595 63137 +65832 49245 +89471 11285 +90188 76593 +97763 71720 +98824 77826 +14418 20513 +39862 73406 +55906 78485 +86059 29127 +20742 97241 +88269 91433 +17962 86920 +32602 49245 +95412 59994 +83267 70431 +36825 24655 +89562 43279 +16860 72596 +53577 96790 +46665 76574 +71813 67270 +35210 15445 +33400 76693 +96069 65213 +46322 39179 +95285 91433 +95767 86269 +15236 76933 +27778 49357 +16170 30140 +57870 63137 +80794 63137 +84281 57089 +91022 26553 +55848 49245 +13825 49245 +91230 87028 +54860 73406 +66596 53306 +61216 64519 +50012 76693 +36465 83257 +87188 75446 +73588 21801 +94757 20402 +28170 60768 +24891 38174 +91787 76693 +63785 43279 +14566 90752 +55392 90283 +39790 67787 +40079 80845 +33827 34045 +79864 78485 +82775 43279 +67159 10612 +53001 37768 +52173 58727 +28322 76933 +84518 33044 +76693 27243 +49225 44682 +22449 75446 +80658 49373 +43255 22449 +59058 73490 +44951 49402 +71201 28356 +55944 42868 +33202 83266 +86699 66983 +88453 85814 +77034 58838 +85850 76228 +41409 88724 +36649 11112 +88428 93089 +59610 66639 +48137 90283 +86400 90487 +28104 46927 +43317 59610 +85510 67445 +99532 78485 +70359 15786 +42034 88131 +80957 68660 +43032 95236 +33582 40382 +58215 94486 +19221 36076 +91307 77826 +64821 76693 +89517 63137 +53579 18009 +82987 91433 +94727 51659 +19906 91433 +80106 43532 +28240 71843 +29670 23324 +39700 87695 +47283 78485 +39801 76933 +25980 96028 +21945 71497 +78407 78485 +85640 45318 +51978 50012 +11601 76575 +83651 31125 +95958 95956 +77749 23336 +13537 84975 +88065 52971 +38210 98657 +40101 36035 +32397 75288 +96618 16256 +42989 19324 +72932 43609 +18771 34539 +58557 86408 +92319 79573 +38295 94964 +10485 63913 +31358 76228 +38846 75446 +72221 22449 +66323 76933 +57089 60456 +88674 50047 +75813 15508 +22055 60704 +69047 96120 +73862 15909 +83222 67849 +76393 80920 +76522 69689 +71666 76228 +63583 12283 +19328 28164 +39355 77826 +85096 76933 +42056 31488 +92747 13579 +84937 47182 +17024 82132 +56871 90283 +97790 46927 +22993 68190 +68482 55096 +79976 85107 +90940 52882 +65919 63137 +62007 49245 +13415 59610 +26893 24655 +44653 95236 +33612 99036 +46478 42868 +70970 80135 +60481 95236 +15301 59360 +17212 37414 +80899 75446 +67495 21742 +18319 14479 +34445 58215 +39486 42282 +36028 44519 +92208 46483 +88362 90245 +53764 48959 +85604 74027 +96035 95893 +29561 30742 +74152 61216 +49507 46274 +87695 76693 +18100 15786 +21313 73406 +62234 12938 +25025 49466 +60890 74332 +11565 33629 +84299 76228 +34861 90283 +21353 73528 +99978 66897 +46529 22449 +13104 25219 +68752 88910 +26478 76933 +87668 43279 +49777 25060 +86763 75446 +73023 45052 +72004 51554 +88141 23926 +33130 82630 +82472 22449 +64754 80502 +57842 62007 +93088 72374 +45727 93735 +53996 19768 +49245 46046 +85299 19540 +56446 63137 +92445 82605 +67790 75139 +16758 26579 +66664 89655 +32710 80610 +75707 49245 +65814 95623 +58220 87669 +16612 76228 +24698 16590 +23184 73406 +91238 15786 +11843 91433 +86625 85562 +41307 77826 +26670 69594 +64855 63137 +63544 83733 +56574 24108 +79163 67158 +99311 95420 +17640 85562 +66865 91397 +31429 37768 +85562 49245 +93263 76716 +81248 45189 +91852 47062 +58324 52943 +63446 36264 +96407 87488 +46436 57089 +12385 26581 +91195 25257 +88835 32326 +21315 77826 +24216 97211 +37075 50012 +46375 49245 +68824 88237 +24882 44857 +60941 75157 +61864 64400 +41858 97465 +83877 61487 +26722 85343 +52455 55804 +22568 74046 +93290 83623 +76933 73008 +61124 76228 +32025 67436 +26293 77826 +46658 78485 +12043 52527 +47464 24655 +56275 41945 +57840 33284 +60040 82705 +10256 95591 +49049 90283 +37768 43279 \ No newline at end of file diff --git a/data/2024_02_data.txt b/data/2024_02_data.txt new file mode 100644 index 0000000..60920ee --- /dev/null +++ b/data/2024_02_data.txt @@ -0,0 +1,1000 @@ +16 18 20 22 23 22 +9 10 12 13 13 +64 67 69 70 74 +55 57 59 61 62 65 68 75 +8 11 9 11 14 +78 81 78 80 81 83 85 83 +67 69 66 67 67 +60 61 62 60 64 +63 65 68 70 72 75 72 79 +44 47 47 49 50 53 55 +80 81 81 84 81 +85 88 88 90 92 94 94 +66 69 72 74 76 76 78 82 +65 66 69 72 73 73 79 +78 80 84 86 87 89 91 +26 27 29 33 30 +53 54 56 60 62 62 +85 87 88 91 95 99 +63 64 68 70 75 +11 12 13 16 17 24 27 29 +82 85 86 92 94 92 +16 17 22 23 25 25 +56 58 61 64 69 71 72 76 +30 32 35 37 39 45 46 53 +48 46 47 49 51 54 56 +33 31 33 35 32 +75 72 73 74 74 +54 52 53 55 56 57 61 +92 91 92 93 99 +14 12 15 13 16 +59 56 58 60 61 58 55 +60 57 59 61 62 63 61 61 +88 87 90 87 90 94 +47 45 43 44 51 +59 56 57 58 58 60 61 +14 13 13 14 16 17 15 +60 59 62 62 62 +65 63 63 66 67 71 +3 2 5 5 6 12 +38 37 41 44 45 47 49 50 +83 82 86 87 86 +61 59 61 62 64 65 69 69 +61 60 61 62 66 68 69 73 +24 22 25 27 28 32 38 +83 81 83 84 86 93 95 97 +56 53 55 56 57 58 64 62 +8 7 10 17 17 +23 22 24 31 34 38 +7 4 9 12 19 +5 5 7 8 9 12 +53 53 55 57 58 60 59 +73 73 74 75 77 79 80 80 +14 14 17 19 23 +45 45 48 51 54 57 59 64 +86 86 85 88 89 +35 35 37 35 33 +36 36 38 36 36 +65 65 68 71 73 70 74 +66 66 68 69 68 71 78 +10 10 11 14 15 15 18 +86 86 88 90 90 88 +37 37 40 42 42 44 44 +50 50 50 53 55 59 +41 41 44 44 45 48 50 57 +19 19 22 23 24 28 31 33 +30 30 31 35 36 39 38 +50 50 54 57 59 59 +71 71 75 78 79 83 +34 34 38 41 42 45 51 +2 2 9 11 13 +34 34 35 38 41 48 45 +63 63 66 73 76 78 81 81 +64 64 66 72 75 79 +26 26 32 34 39 +17 21 23 24 26 27 29 +54 58 61 63 66 64 +49 53 54 55 56 59 59 +58 62 64 67 71 +35 39 42 44 45 47 52 +69 73 70 73 75 78 81 82 +39 43 46 45 47 49 51 49 +43 47 48 45 46 46 +54 58 59 60 57 61 +32 36 37 36 42 +4 8 11 12 14 14 17 20 +57 61 62 62 63 64 61 +85 89 92 92 92 +40 44 44 45 48 52 +57 61 63 65 68 71 71 78 +27 31 33 37 39 42 45 47 +11 15 19 21 22 19 +69 73 77 79 80 82 83 83 +2 6 10 11 13 14 18 +36 40 44 47 53 +16 20 26 27 29 32 34 +39 43 45 46 51 54 55 52 +71 75 76 77 82 84 87 87 +13 17 20 23 28 32 +55 59 62 65 70 71 77 +26 31 32 34 37 39 +84 89 91 94 95 94 +69 76 79 81 81 +63 70 71 73 77 +10 17 19 20 26 +67 72 74 76 75 77 78 +48 55 56 59 61 58 56 +32 38 36 37 38 39 42 42 +42 48 47 48 49 50 53 57 +74 79 77 79 80 83 85 90 +53 59 61 61 62 +6 12 12 14 16 19 17 +38 43 46 46 48 51 51 +6 13 16 19 19 22 23 27 +63 69 70 72 72 79 +37 42 46 49 51 +61 66 70 71 72 71 +47 54 55 59 61 61 +1 8 10 11 14 18 22 +14 21 24 27 31 37 +55 61 67 70 73 74 +42 49 51 57 60 57 +12 18 19 22 25 32 34 34 +5 10 17 20 21 25 +28 33 34 37 40 46 48 55 +70 67 66 65 63 61 60 63 +58 56 53 50 47 47 +98 96 93 92 91 88 84 +21 18 15 12 11 9 8 1 +93 92 91 89 90 88 +68 67 66 64 67 64 67 +88 85 83 86 84 84 +86 83 81 78 79 78 75 71 +88 87 85 88 82 +19 17 15 15 14 12 11 9 +79 77 75 73 72 72 69 71 +84 82 80 80 79 76 76 +30 29 26 23 23 21 17 +77 76 76 75 74 71 65 +37 35 31 28 25 +34 33 31 27 28 +94 91 88 87 86 82 80 80 +80 79 76 75 71 67 +73 70 68 66 62 56 +88 87 81 79 76 74 +51 50 43 41 42 +24 23 21 19 14 12 12 +92 89 87 81 80 76 +61 58 57 52 51 49 48 43 +16 17 15 12 10 9 8 +46 49 46 45 46 +59 60 58 56 54 53 51 51 +46 47 44 43 42 38 +74 76 73 70 67 66 60 +79 80 77 75 78 75 72 70 +63 65 63 65 66 +55 58 56 53 54 52 49 49 +12 14 13 15 11 +87 90 87 88 87 82 +36 39 39 38 36 +14 15 12 9 9 10 +38 39 38 37 34 34 33 33 +61 63 61 61 57 +45 46 46 43 41 36 +55 56 53 52 48 46 +26 28 25 21 24 +11 14 11 7 7 +61 63 62 58 54 +65 66 65 63 62 59 55 48 +26 29 28 23 22 21 +28 31 30 29 22 21 23 +47 48 47 40 40 +50 51 48 45 44 38 34 +39 41 40 35 32 29 28 22 +25 25 22 21 19 16 15 +69 69 68 66 63 61 58 59 +90 90 87 84 81 80 80 +31 31 28 25 21 +93 93 90 87 86 85 82 77 +15 15 12 10 7 9 6 4 +94 94 92 94 93 91 89 92 +21 21 18 21 21 +44 44 46 44 43 42 41 37 +27 27 28 25 18 +71 71 70 70 69 68 65 +60 60 60 59 57 60 +76 76 75 75 72 72 +36 36 33 33 29 +59 59 56 54 52 52 45 +47 47 46 44 40 37 36 33 +98 98 95 93 89 91 +42 42 38 37 35 34 32 32 +61 61 60 58 54 50 +91 91 87 85 80 +92 92 87 85 84 81 80 +78 78 77 76 71 70 68 70 +81 81 74 73 70 67 67 +66 66 63 60 57 55 49 45 +70 70 68 62 55 +56 52 49 48 47 45 +30 26 25 22 19 22 +91 87 86 84 83 83 +38 34 31 28 25 23 22 18 +57 53 51 48 41 +28 24 25 24 23 20 +99 95 92 89 88 87 88 90 +44 40 37 34 36 34 34 +26 22 24 22 19 15 +41 37 36 39 33 +85 81 81 78 77 +26 22 20 20 18 20 +88 84 84 82 79 79 +85 81 80 78 78 76 72 +73 69 68 68 61 +71 67 64 60 57 +80 76 72 71 73 +32 28 24 22 22 +18 14 11 7 5 1 +21 17 14 11 7 1 +48 44 37 35 33 31 +29 25 22 19 13 15 +63 59 56 53 46 46 +72 68 65 64 61 54 50 +31 27 26 23 16 10 +40 35 34 33 31 29 +16 11 8 6 4 7 +95 88 86 84 81 80 77 77 +91 86 83 81 77 +67 60 58 57 51 +24 18 17 16 17 14 +30 24 25 24 21 23 +15 8 5 3 5 5 +29 24 21 19 16 15 16 12 +23 18 16 15 18 16 11 +67 62 62 61 58 55 54 +56 51 48 48 46 45 42 44 +18 12 9 9 7 6 5 5 +61 55 54 52 52 48 +94 87 87 86 84 83 81 76 +87 81 80 76 75 72 71 +94 87 84 80 78 79 +22 16 13 10 6 5 3 3 +71 64 63 62 59 55 51 +28 23 20 16 15 14 8 +99 93 91 85 83 +58 51 45 43 40 41 +63 57 54 48 48 +48 42 39 32 28 +41 36 30 28 26 24 17 +76 79 76 72 71 70 +54 58 59 63 65 68 69 66 +63 62 60 57 54 50 48 50 +78 73 71 68 63 59 +39 44 46 49 52 56 58 59 +32 32 30 29 27 25 22 17 +49 43 41 41 41 +11 11 14 17 15 14 +71 69 67 62 60 59 60 +51 47 46 48 48 +11 11 11 10 8 8 +30 26 26 23 22 20 19 19 +80 81 87 89 94 +9 12 9 7 3 3 +43 40 37 34 32 30 27 20 +62 62 60 61 57 +7 6 8 8 9 12 15 16 +11 4 2 4 1 1 +66 66 69 73 77 +22 22 19 19 22 +90 84 83 82 78 77 74 69 +15 14 12 13 17 +8 11 11 9 7 1 +37 30 27 23 22 +84 87 89 93 95 97 +39 35 32 30 28 22 21 18 +79 84 89 92 93 96 +43 42 41 35 33 30 30 +49 45 43 40 38 38 +44 46 44 41 38 36 35 35 +17 17 19 20 21 21 21 +61 65 65 67 67 +42 38 36 33 30 25 26 +93 90 88 87 86 88 +98 99 97 99 98 97 94 +79 76 70 69 66 64 +81 83 79 78 77 70 +82 81 81 80 82 +47 47 47 50 53 57 +43 36 34 31 28 28 +27 27 28 31 32 38 +98 93 92 88 85 82 78 +92 94 92 89 88 85 83 76 +29 25 21 20 22 +17 19 20 23 24 28 29 29 +66 59 59 56 59 +7 6 8 10 13 17 21 +60 54 56 54 50 +91 88 87 89 96 +17 17 23 24 26 29 29 +5 9 10 13 16 16 20 +68 64 58 56 53 49 +37 34 36 39 42 44 50 54 +86 82 79 79 78 +67 67 66 66 65 62 61 57 +66 65 64 58 55 50 +17 21 27 28 29 30 32 33 +63 63 61 62 60 54 +83 88 89 91 95 +32 28 27 25 23 21 21 22 +54 51 53 56 59 60 57 57 +77 80 86 89 90 +27 23 20 17 14 12 9 5 +53 57 58 61 68 75 +27 27 24 21 19 18 17 16 +53 57 61 63 66 68 71 75 +6 10 11 15 15 +23 24 21 19 20 17 14 16 +66 72 75 81 84 81 +45 41 40 36 35 34 31 +85 88 85 83 83 82 84 +36 40 42 43 43 45 46 51 +87 87 85 84 82 83 +89 89 87 88 88 +89 89 89 90 93 +46 43 46 45 46 48 50 53 +83 83 84 90 94 +68 62 60 58 53 52 49 52 +25 25 21 20 18 16 19 +21 17 17 14 12 7 +15 12 11 9 6 3 3 +72 72 75 76 77 80 79 +27 26 24 20 16 +93 95 92 91 90 89 +57 58 57 56 54 49 47 +31 30 29 26 25 22 25 21 +45 45 42 42 40 35 +35 33 35 37 39 39 +12 13 17 18 23 +79 83 84 85 88 89 92 96 +13 9 7 10 6 +77 75 73 71 71 70 68 64 +7 6 8 11 15 14 +60 56 52 49 46 42 +31 38 37 38 40 43 44 44 +44 49 49 51 54 60 +46 46 42 41 39 35 +40 41 43 47 48 50 52 56 +18 18 17 15 10 9 5 +69 72 72 70 69 +48 52 53 55 56 54 61 +58 65 68 68 68 +63 66 65 58 57 54 50 +35 34 31 24 20 +53 56 57 62 62 +52 53 54 56 59 61 65 63 +48 43 41 40 33 +22 20 22 23 25 28 29 35 +8 12 11 12 12 +79 76 73 72 70 69 65 +73 73 72 68 68 +49 53 56 56 57 58 59 62 +23 18 16 12 13 +31 34 37 38 38 40 40 +79 81 80 77 79 75 +66 64 65 70 73 79 +14 11 13 19 21 +61 56 51 49 48 48 +26 27 32 35 36 39 40 39 +95 91 90 86 85 85 +76 77 75 74 70 73 +88 90 89 88 86 88 +57 56 54 50 44 +62 62 61 55 54 53 +42 38 37 32 29 26 19 +19 24 28 29 30 33 40 +73 69 68 66 63 62 +63 70 73 76 78 78 82 +74 69 65 63 61 59 59 +73 79 76 78 81 82 85 88 +91 90 89 91 90 88 87 84 +36 36 35 37 39 43 +88 88 91 95 95 +76 76 82 83 85 88 +73 77 84 85 87 84 +9 7 9 7 10 13 12 +75 79 79 80 83 85 86 85 +53 54 57 58 59 61 65 +47 51 54 55 62 +84 86 84 82 78 75 71 +60 64 70 71 74 77 77 +85 85 89 90 91 +75 78 76 70 69 68 69 +4 5 3 4 7 10 11 17 +46 46 39 36 37 +48 55 58 59 62 63 63 +60 62 63 64 65 +45 48 51 53 55 58 +64 66 67 68 69 +36 35 32 29 27 25 24 +28 27 25 23 21 18 15 14 +47 49 52 54 57 +91 90 88 86 85 82 +86 87 90 91 94 95 98 +79 78 75 74 73 71 +35 36 38 40 42 44 45 +21 22 24 27 30 33 34 +47 49 50 51 53 54 55 +59 58 56 54 52 +21 22 24 26 27 +71 72 75 77 80 +55 56 57 60 62 65 68 70 +29 30 33 36 37 39 40 43 +81 84 85 87 90 92 +78 75 72 69 68 66 +20 19 18 16 14 11 9 6 +52 49 48 46 45 +54 56 57 58 59 +41 44 45 47 50 +72 70 67 64 62 61 60 +53 56 59 62 63 65 +37 38 39 40 41 44 47 50 +90 89 86 83 82 80 +72 74 75 76 77 +60 59 57 55 53 50 48 +22 20 18 15 12 10 9 +13 11 9 7 4 2 +39 37 35 33 32 30 27 +82 84 87 88 90 92 94 +58 56 55 54 51 49 48 +66 67 70 72 74 +84 81 78 75 74 73 +84 82 80 78 77 74 72 70 +59 57 56 53 51 +61 59 56 53 50 47 46 +61 58 56 54 52 51 48 +45 47 50 51 54 55 +5 8 9 10 13 15 16 19 +51 53 56 58 61 +68 66 63 60 57 +63 65 67 69 71 72 73 75 +31 34 36 39 40 41 43 +20 17 15 12 11 +24 25 28 31 34 37 38 +33 36 39 42 43 46 47 +47 48 51 54 55 +45 48 50 51 52 +37 35 33 30 28 26 24 21 +17 14 13 11 10 7 4 +37 39 40 43 46 47 48 49 +87 88 89 91 92 94 97 +17 18 19 22 24 27 +51 54 57 59 61 64 65 67 +80 78 77 74 73 72 70 +38 40 42 44 46 48 49 50 +80 77 74 71 70 67 64 63 +77 74 73 71 68 66 +88 91 92 94 96 97 99 +72 71 70 67 64 61 +31 29 26 23 22 19 +38 36 33 31 29 28 27 26 +94 91 89 88 85 83 80 78 +98 95 92 89 86 84 +17 16 14 13 12 9 8 +33 34 35 37 39 +90 88 87 86 84 83 81 79 +94 92 89 88 87 85 84 81 +1 2 5 7 9 +8 9 10 13 15 18 20 +83 81 78 77 74 72 71 +75 77 78 79 80 83 86 87 +35 34 32 31 29 27 25 22 +16 13 12 11 8 7 6 3 +1 2 3 5 6 9 11 13 +71 72 73 74 76 77 78 +10 7 5 4 1 +87 90 92 93 94 +54 51 50 47 46 43 41 40 +90 91 93 94 96 99 +66 63 61 58 55 54 53 +36 35 33 31 28 25 22 +32 34 37 39 41 44 45 46 +43 42 41 40 38 35 32 30 +46 43 40 37 34 32 29 27 +76 78 81 84 85 88 91 +40 42 45 46 49 51 54 57 +83 80 78 75 73 70 67 64 +85 82 79 76 74 73 71 70 +75 72 69 66 65 64 61 58 +56 53 50 49 48 45 43 40 +52 50 49 46 44 41 38 35 +50 47 44 42 40 +69 68 66 64 61 60 57 55 +6 8 10 12 14 +88 90 92 95 97 98 99 +70 68 65 64 62 +59 60 63 65 67 69 72 +44 43 41 39 38 +78 81 83 85 88 +11 10 7 4 2 +43 46 48 50 52 54 +12 14 15 16 17 18 19 21 +17 20 21 24 26 27 29 30 +73 70 67 64 62 59 +21 19 17 15 14 11 9 +29 30 33 34 36 37 +53 50 48 46 44 43 +24 21 20 17 16 +62 59 56 53 50 47 +26 23 20 17 15 13 10 +71 74 76 79 81 84 85 +36 38 41 42 43 +28 27 25 23 22 20 19 +61 62 64 66 69 +48 46 45 44 43 41 39 +97 94 91 90 87 85 83 81 +22 21 18 16 14 +87 84 81 79 77 76 75 73 +87 88 91 93 95 96 +29 31 34 35 37 38 39 40 +7 10 12 15 17 20 21 +54 57 60 63 64 65 66 69 +48 51 53 56 57 +42 40 38 35 32 29 26 +38 40 43 46 47 49 +9 11 12 15 18 +38 35 34 31 30 +87 85 83 82 81 +93 92 90 88 87 84 81 78 +65 68 71 74 75 +67 70 73 74 75 +50 51 53 54 56 +69 71 72 73 74 75 78 +29 26 24 23 21 19 17 14 +47 48 49 52 53 55 +18 20 22 23 24 25 +81 79 76 73 70 68 +37 34 31 28 26 +45 43 42 39 38 36 33 32 +71 74 77 80 82 +3 5 7 9 12 +55 58 59 62 63 65 66 68 +2 5 8 9 12 15 18 +28 27 25 23 22 20 17 +77 78 80 82 83 85 +82 84 85 88 89 91 94 +34 36 37 38 39 41 +65 62 61 59 56 54 53 +24 26 29 31 32 35 37 40 +22 24 27 28 31 33 35 +78 79 82 84 87 88 90 +25 22 21 19 18 +62 63 64 66 67 70 +66 69 70 71 74 76 79 +82 85 86 89 91 93 95 +77 74 72 71 70 +62 64 66 68 70 72 +80 78 75 72 69 +28 31 33 35 37 38 40 +72 74 77 80 83 +67 68 71 74 75 77 78 80 +19 18 17 14 11 +55 53 51 50 49 47 +83 82 79 78 77 74 73 70 +91 89 87 85 82 79 +30 33 34 35 37 38 39 +73 72 69 68 67 66 +15 13 12 9 6 4 2 +15 13 12 10 7 4 1 +54 51 49 46 44 43 41 38 +69 66 63 60 57 56 55 +40 39 36 34 31 29 26 +58 55 54 52 51 48 +19 17 15 14 13 +31 30 29 28 27 24 23 21 +37 40 43 44 47 49 51 53 +45 47 48 50 53 55 56 58 +80 82 83 86 88 +39 40 42 43 44 +48 50 53 56 58 +71 74 75 77 79 +44 42 41 40 38 36 34 33 +7 9 11 14 17 20 +14 16 18 19 20 +66 63 60 58 55 54 +83 80 78 75 73 71 +18 20 23 24 25 27 28 +22 20 19 16 15 12 11 +36 39 41 42 43 +31 33 34 37 39 42 43 +34 31 29 26 23 20 17 15 +72 71 68 66 65 +48 46 45 42 41 +79 82 85 87 89 90 91 93 +38 37 35 33 31 +9 10 13 16 18 20 22 +94 91 90 88 86 +99 96 95 93 91 88 85 +25 23 21 18 15 +84 81 80 79 77 75 +33 31 29 27 26 24 23 +8 11 13 15 18 21 +37 39 41 43 45 +28 25 24 22 21 18 17 +65 63 60 59 58 56 54 51 +3 6 9 11 13 15 16 +63 65 68 69 70 71 +20 17 14 12 9 7 +11 12 13 16 19 22 24 +39 36 35 33 31 28 +15 17 19 22 23 25 26 28 +67 64 62 61 59 56 55 +38 35 33 32 29 +74 72 69 66 64 62 +26 25 22 21 20 19 +41 39 38 36 33 31 28 +51 49 48 46 45 +55 52 49 47 44 43 41 39 +54 55 56 57 60 61 63 +65 66 69 71 72 74 75 +43 40 37 36 34 31 30 +99 97 96 94 92 90 87 85 +28 31 32 35 38 39 41 44 +35 33 32 30 29 28 +65 63 61 59 58 56 54 +28 30 33 34 36 37 39 +11 14 15 17 18 +16 13 12 10 9 6 4 1 +82 85 86 89 92 93 +20 22 23 25 28 31 32 34 +3 5 6 7 8 9 11 +41 44 46 47 48 +52 49 47 46 43 +24 21 19 16 15 14 12 9 +30 29 26 23 22 20 18 15 +74 77 80 82 83 86 88 +38 39 42 43 44 +96 95 92 89 87 86 85 82 +81 79 77 74 71 +41 42 45 48 51 52 55 +42 39 37 35 34 +67 68 69 70 71 73 75 +78 81 84 87 90 91 +39 41 44 47 48 50 +81 83 84 85 88 +78 77 74 71 69 68 65 +18 21 22 25 28 30 32 35 +77 79 80 81 82 85 86 87 +79 76 73 70 68 +31 32 34 37 40 +61 59 56 55 54 51 +84 87 89 92 93 96 +39 38 36 34 32 30 +75 74 71 69 68 67 65 62 +39 40 42 45 48 +34 33 30 27 26 24 22 +37 35 34 31 28 25 +64 61 58 56 55 53 52 49 +85 82 81 80 79 78 +24 22 21 19 17 +48 47 46 44 41 +43 42 41 40 38 37 34 32 +93 92 89 87 84 82 81 79 +15 14 12 10 9 +28 25 24 21 20 17 15 +10 11 12 15 16 18 19 21 +32 33 34 36 37 40 43 +52 51 48 45 43 +64 66 69 72 75 78 81 +16 14 12 11 10 7 4 1 +36 35 33 32 31 +57 56 53 50 49 47 +19 17 16 15 12 10 8 6 +16 14 11 8 5 +72 69 68 65 64 62 60 +27 24 23 22 20 17 16 15 +59 57 54 51 50 47 +95 94 93 90 87 86 83 81 +51 49 48 45 44 +17 20 21 24 27 +17 18 20 23 26 29 30 +82 85 87 89 90 +47 46 43 41 40 +32 29 28 27 26 +46 49 51 53 56 +22 21 20 18 15 +97 94 92 90 88 85 82 +48 51 52 55 58 59 60 +19 21 24 26 28 31 34 +38 37 35 32 29 28 +83 82 81 79 77 75 +47 50 52 54 55 56 58 61 +6 9 10 13 15 +74 75 77 79 81 82 +61 59 58 55 52 +14 15 16 17 20 23 +24 21 19 17 15 13 12 +46 45 42 40 38 37 35 32 +37 39 41 43 46 49 52 +64 62 59 58 56 54 +92 91 88 86 83 82 +94 93 91 89 88 +59 58 56 54 53 51 +41 42 45 46 47 50 53 56 +28 30 33 36 39 40 +65 62 60 57 54 52 49 +72 73 76 79 82 +26 27 28 30 32 33 36 +86 85 82 81 80 +70 71 74 75 78 +93 94 96 98 99 +68 71 74 75 78 79 +38 41 44 47 48 50 52 55 +38 36 34 33 30 +18 20 22 24 25 28 29 +53 56 59 62 64 65 +28 27 24 22 21 18 17 +35 32 29 26 23 22 21 20 +35 37 38 40 43 +17 16 14 12 11 +32 31 30 28 25 +94 93 90 89 88 +83 80 79 76 73 72 71 70 +24 22 20 19 16 15 13 +55 52 51 49 46 +42 40 39 37 34 32 31 30 +16 14 11 8 6 4 1 +30 31 34 35 38 40 42 45 +11 8 7 6 5 +44 47 48 49 51 +42 39 37 34 31 30 29 +63 65 67 70 71 74 76 79 +82 81 78 75 73 +34 32 30 27 26 24 23 +72 75 77 79 82 83 84 +53 51 49 47 44 43 42 39 +87 88 89 90 91 92 +79 77 74 72 70 67 65 +57 56 55 52 49 47 45 +97 94 91 89 88 86 85 82 +22 21 19 18 15 13 10 +57 56 55 54 52 +14 12 9 6 4 3 2 +45 48 51 54 55 56 58 59 +51 52 55 58 59 60 62 +77 79 82 84 87 89 90 +58 61 64 65 66 69 70 73 +84 87 88 89 90 91 94 97 +1 3 6 8 11 14 +34 36 39 42 45 47 49 +15 16 17 20 22 25 28 +34 35 38 39 40 41 43 +22 25 26 27 28 30 33 35 +73 70 69 68 65 63 60 57 +26 23 21 19 16 14 12 +63 60 57 54 53 +70 69 67 64 63 61 +86 84 83 81 78 76 75 +97 94 93 91 90 87 86 +34 33 32 29 28 25 22 19 +93 92 91 88 85 84 82 +15 12 11 10 8 +94 91 89 87 85 82 79 +4 7 9 10 11 12 15 16 +46 44 42 41 40 39 +64 66 69 72 75 78 79 +47 46 43 40 39 +52 55 58 60 61 64 67 +55 56 57 59 62 64 +80 77 76 74 72 69 67 66 +37 38 40 42 45 48 +79 82 83 85 88 90 91 +64 61 58 55 52 51 48 +79 76 74 73 71 70 67 66 +78 79 82 84 85 +73 70 69 67 66 63 +48 46 43 40 37 35 +38 37 36 34 31 +75 72 71 68 67 64 +39 42 45 48 49 50 +87 84 83 82 79 +15 13 11 10 8 7 4 +62 61 60 59 58 56 53 50 +79 76 75 73 72 69 +26 24 23 22 19 +94 91 88 86 84 +35 33 30 29 28 +26 23 20 19 16 13 11 +31 30 27 25 22 20 17 +44 42 39 37 34 33 32 +23 22 19 16 15 14 +91 89 88 87 84 83 81 80 +75 76 77 79 82 84 85 86 +12 14 16 18 21 +66 64 61 58 56 53 +33 36 37 39 40 41 +33 30 29 27 24 +57 54 53 52 51 +35 36 39 41 42 44 46 49 +77 74 73 72 70 68 66 63 +29 32 33 34 36 +60 59 58 57 55 52 +7 8 10 12 13 14 17 19 +27 28 29 30 31 33 34 +77 80 81 83 85 88 90 +5 7 9 10 11 12 15 +57 55 54 51 48 46 45 44 +41 39 38 36 34 33 31 +71 69 66 64 62 61 58 56 +21 20 19 18 17 15 12 9 +76 77 80 82 84 87 +88 89 90 93 95 96 98 99 +38 40 41 43 44 +70 69 68 67 66 64 63 62 +75 74 71 69 68 66 64 63 +25 24 21 18 17 14 +84 83 82 80 77 +96 95 93 90 88 +18 20 22 25 26 29 31 +77 79 82 85 88 89 +49 51 52 53 54 57 +28 29 30 32 33 34 37 +28 29 31 33 34 36 38 +58 60 63 65 67 +33 36 37 38 39 41 42 43 +74 73 72 70 69 67 65 63 +37 35 33 32 30 27 24 22 +10 13 14 17 18 20 22 +69 72 73 75 77 80 +90 91 92 93 95 97 +14 13 12 10 7 5 4 +5 6 8 11 13 +77 79 81 83 85 88 90 +8 7 5 2 1 +78 75 73 70 68 65 +58 60 63 66 68 69 70 72 +56 53 52 50 47 +50 51 54 56 58 60 +32 29 27 26 24 22 20 18 +4 7 8 11 13 16 +23 26 28 29 31 33 +66 65 64 61 59 +65 63 62 61 58 55 52 +29 30 32 34 36 39 41 +44 42 41 40 39 38 36 +62 63 64 67 70 73 74 +85 82 81 80 77 76 75 +2 3 4 5 6 8 10 +28 30 32 33 34 36 39 42 +34 36 39 42 45 48 +14 12 11 9 6 +25 28 31 34 37 39 42 +43 41 38 35 32 30 28 +59 62 65 68 71 73 +49 52 55 56 58 59 +78 77 76 75 74 71 70 68 +84 87 90 93 95 97 +74 76 77 79 80 81 84 86 +40 39 36 35 32 31 29 26 +11 12 14 16 17 20 23 +8 11 13 15 17 18 21 +41 44 47 50 51 +83 82 79 77 76 75 74 +45 46 48 51 53 +34 32 29 28 27 +80 78 76 75 73 +63 62 61 59 57 55 53 52 +29 27 25 22 19 17 15 13 +82 80 77 76 75 +57 58 61 64 66 67 68 +13 10 7 6 5 3 2 +46 43 42 39 38 +40 42 44 46 49 52 55 +56 57 59 62 64 +13 12 11 9 7 4 +22 23 26 28 29 32 34 36 +43 41 38 37 35 33 31 28 +56 53 52 51 50 49 46 43 +53 55 58 61 62 63 65 +29 26 24 22 20 +20 21 22 25 26 28 31 32 +15 16 19 20 23 25 26 +33 36 37 40 42 +87 88 89 92 94 95 97 +92 89 87 84 83 +5 6 9 11 12 13 +47 44 43 41 39 38 36 33 +43 46 49 51 53 +41 42 45 46 49 52 53 +34 33 30 28 25 22 20 +15 16 17 19 21 22 +35 38 41 43 45 46 47 49 +62 65 68 69 70 73 74 76 +12 10 9 8 5 +84 85 88 90 91 94 +65 64 63 62 61 60 58 55 +31 32 34 36 37 40 +15 17 19 20 23 25 27 28 +66 67 69 72 75 77 80 83 +79 80 82 84 87 +27 25 24 23 20 17 14 +24 26 27 29 30 32 +58 59 62 64 65 67 70 73 +38 41 44 46 47 49 51 53 +82 79 76 75 73 72 70 68 +61 63 65 67 68 71 +35 38 40 42 44 +89 87 86 83 81 80 77 76 +79 80 82 84 85 86 +78 79 82 83 86 87 90 +27 25 23 21 19 16 +33 36 38 41 42 +61 63 64 66 68 71 +41 42 44 47 48 49 51 +56 55 52 50 49 48 45 43 +19 20 23 26 29 30 32 +67 70 71 74 75 77 80 82 +2 4 6 9 11 +21 22 23 26 28 31 33 35 +59 58 55 53 50 49 48 +71 69 66 63 60 +59 62 64 65 66 69 +74 72 69 68 67 +52 54 55 58 60 63 64 +14 16 17 20 23 24 +48 45 43 41 39 +65 67 70 71 73 76 +67 68 70 72 75 78 80 +89 87 84 82 80 +79 82 83 86 88 89 91 93 +35 36 37 39 42 45 46 +9 10 13 14 16 18 21 22 +78 81 82 84 87 +25 24 21 20 18 +48 45 42 41 40 38 35 33 +99 97 94 92 89 87 84 82 +70 68 66 65 63 60 57 +80 77 75 73 72 71 70 +10 12 14 17 18 19 +36 37 39 42 44 +63 64 66 67 69 72 75 +53 52 50 49 47 44 41 39 +44 47 49 52 55 57 60 +83 84 87 90 93 +18 16 14 11 10 7 6 3 +69 67 64 61 58 56 53 52 +92 93 94 97 99 +81 78 76 74 72 70 69 +53 51 49 47 45 44 43 +79 80 82 84 85 86 88 +80 78 75 73 70 67 +50 47 44 41 39 37 +66 63 60 57 55 53 52 +96 93 92 89 86 84 83 82 +77 79 80 83 86 +20 18 17 15 12 11 +27 30 31 34 37 +61 58 57 56 54 51 +34 36 39 42 44 47 50 +33 30 29 26 24 22 21 +19 16 14 11 10 9 6 5 +31 32 35 38 39 42 45 +49 50 51 54 56 59 +24 26 27 30 31 32 34 +51 50 48 45 42 +51 52 55 57 60 63 +39 36 34 31 28 +38 37 34 31 30 27 +59 60 61 62 65 66 68 +24 25 27 29 30 32 35 +10 11 12 13 14 15 +85 88 90 93 94 95 +55 53 50 49 48 45 +50 47 45 43 41 38 +21 20 19 18 17 15 14 +34 31 28 27 24 21 +82 84 87 89 92 95 97 +46 44 43 40 39 37 35 33 +30 32 34 36 37 39 42 +15 12 9 6 3 +20 21 23 26 27 28 +66 67 69 70 71 72 74 +2 3 6 8 10 +42 40 39 37 34 31 +21 20 18 16 13 +87 85 84 81 78 +51 50 49 47 45 42 40 +61 59 58 56 54 52 50 47 +97 96 93 92 90 +87 84 81 78 76 +19 21 23 24 27 29 32 34 +76 79 82 84 87 88 89 92 +81 79 78 76 75 74 71 70 +23 26 29 32 33 35 38 +82 80 79 76 73 70 67 66 +52 55 56 59 61 64 +68 71 74 76 78 +66 65 63 60 58 55 53 50 +68 70 71 73 75 78 80 +61 58 57 54 52 49 47 46 +31 33 34 37 38 +87 85 83 82 79 \ No newline at end of file diff --git a/src/bin/2015_01a.rs b/src/bin/2015_01a.rs new file mode 100644 index 0000000..bf29753 --- /dev/null +++ b/src/bin/2015_01a.rs @@ -0,0 +1,42 @@ +// Santa was hoping for a white Christmas, but his weather machine's "snow" function is powered by +// stars, and he's fresh out! To save Christmas, he needs you to collect fifty stars by December +// 25th. +// +// Santa is trying to deliver presents in a large apartment building, but he can't find the right +// floor - the directions he got are a little confusing. He starts on the ground floor (floor 0) +// and then follows the instructions one character at a time. +// +// An opening parenthesis, (, means he should go up one floor, and a closing parenthesis, ), means +// he should go down one floor. +// +// The apartment building is very tall, and the basement is very deep; he will never find the top +// or bottom floors. +// +// For example: +// +// (()) and ()() both result in floor 0. +// ((( and (()(()( both result in floor 3. +// ))((((( also results in floor 3. +// ()) and ))( both result in floor -1 (the first basement level). +// ))) and )())()) both result in floor -3. +// To what floor do the instructions take Santa? +// + +use aoc::read_data; + +fn main() { + let instructions = read_data("2015_01_data.txt"); + + let mut current_floor = 0; + for next_direction in instructions.chars() { + match next_direction { + ')' => current_floor -= 1, + '(' => current_floor += 1, + _ => { + panic!("Invalid Direction. Santa got lost."); + } + } + } + println!("Ending on floor {}", current_floor); +} +// 232 \ No newline at end of file diff --git a/src/bin/2015_01b.rs b/src/bin/2015_01b.rs new file mode 100644 index 0000000..4116f18 --- /dev/null +++ b/src/bin/2015_01b.rs @@ -0,0 +1,32 @@ +// Now, given the same instructions, find the position of the first character that causes him to enter the basement (floor -1). The first character in the instructions has position 1, the second character has position 2, and so on. +// +// For example: +// +// ) causes him to enter the basement at character position 1. +// ()()) causes him to enter the basement at character position 5. +// What is the position of the character that causes Santa to first enter the basement? +// + +use aoc::read_data; + +fn main() { + let instructions = read_data("2015_01_data.txt"); + + let mut has_hit_basement = false; + + let mut current_floor = 0; + for (index, next_direction) in instructions.chars().enumerate() { + match next_direction { + ')' => current_floor -= 1, + '(' => current_floor += 1, + _ => { + panic!("Invalid Direction. Santa got lost."); + } + } + if !has_hit_basement && current_floor == -1 { + has_hit_basement = true; + println!("Hit the basement on step {}", index + 1); + } + } +} +// 1783 \ No newline at end of file diff --git a/src/bin/2015_02a.rs b/src/bin/2015_02a.rs new file mode 100644 index 0000000..7aaf7c4 --- /dev/null +++ b/src/bin/2015_02a.rs @@ -0,0 +1,82 @@ +// The elves are running low on wrapping paper, and so they need to submit an order for more. They +// have a list of the dimensions (length l, width w, and height h) of each present, and only want +// to order exactly as much as they need. +// +// Fortunately, every present is a box (a perfect right rectangular prism), which makes calculating +// the required wrapping paper for each gift a little easier: find the surface area of the box, +// which is 2*l*w + 2*w*h + 2*h*l. The elves also need a little extra paper for each present: the +// area of the smallest side. +// +// For example: +// +// A present with dimensions 2x3x4 requires 2*6 + 2*12 + 2*8 = 52 square feet of wrapping paper +// plus 6 square feet of slack, for a total of 58 square feet. +// A present with dimensions 1x1x10 requires 2*1 + 2*10 + 2*10 = 42 square feet of wrapping paper +// plus 1 square foot of slack, for a total of 43 square feet. +// All numbers in the elves' list are in feet. How many total square feet of wrapping paper should +// they order? +// + +use aoc::read_data; + +fn smallest_of_vec(to_check: &Vec) -> u32 { + let mut working = to_check[0]; + for current in to_check { + if current < &working { + working = *current + } + } + working +} + +fn sum_of_vec(to_add: &Vec) -> u32 { + let mut working = 0; + for current in to_add { + working += current + } + working +} + +fn calculate_wrapping_needed(length: u32, width: u32, height: u32) -> u32 { + let sides = vec![ + 2 * length * width, + 2 * width * height, + 2 * height * length + ]; + + // everything is *2 for size so we need half of it for our calc + let min_side = smallest_of_vec(&sides) / 2; + sum_of_vec(&sides) + min_side +} + +fn split_str(input: &str) -> Option<(u32, u32, u32)> { + let parts: Vec<&str> = input.split('x').collect(); + if parts.len() == 3 { + if let (Ok(a), Ok(b), Ok(c)) = ( + parts[0].parse::(), + parts[1].parse::(), + parts[2].parse::(), + ) { + return Some((a, b, c)); + } + } + None +} + +fn main() { + println!("Need {} for 2x3x4", calculate_wrapping_needed(2,3,4)); + println!("Need {} for 1x1x10", calculate_wrapping_needed(1,1,10)); + + let binding = read_data("2015_02_data.txt"); + let sizes = binding.lines(); + let mut working = 0; + + for size in sizes { + let (l, w, h) = split_str(size).unwrap(); + let needed = calculate_wrapping_needed(l, w, h); + // println!("Need {} for {}", needed, size); + working += needed; + } + println!("You need {}.", working); +} +// 1586300. \ No newline at end of file diff --git a/src/bin/2015_02b.rs b/src/bin/2015_02b.rs new file mode 100644 index 0000000..2b6349f --- /dev/null +++ b/src/bin/2015_02b.rs @@ -0,0 +1,64 @@ +// The elves are also running low on ribbon. Ribbon is all the same width, so they only have to +// worry about the length they need to order, which they would again like to be exact. +// +// The ribbon required to wrap a present is the shortest distance around its sides, or the smallest +// perimeter of any one face. Each present also requires a bow made out of ribbon as well; the feet +// of ribbon required for the perfect bow is equal to the cubic feet of volume of the present. +// Don't ask how they tie the bow, though; they'll never tell. +// +// For example: +// +// A present with dimensions 2x3x4 requires 2+2+3+3 = 10 feet of ribbon to wrap the present +// plus 2*3*4 = 24 feet of ribbon for the bow, for a total of 34 feet. +// A present with dimensions 1x1x10 requires 1+1+1+1 = 4 feet of ribbon to wrap the present +// plus 1*1*10 = 10 feet of ribbon for the bow, for a total of 14 feet. +// How many total feet of ribbon should they order? +// + +use aoc::read_data; + +fn bow_ribbon_length(l: u32, w: u32, h: u32) -> u32 { + l * w * h +} + +fn ribbon_for_sides(l: u32, w: u32, h: u32) -> u32 { + let to_remove = l.max(w).max(h) * 2; + let working = 2 * l + 2 * w + 2 * h; + working - to_remove +} + +fn ribbon_for_package(l: u32, w: u32, h: u32) -> u32 { + ribbon_for_sides(l, w, h) + bow_ribbon_length(l, w, h) +} + +fn split_str(input: &str) -> Option<(u32, u32, u32)> { + let parts: Vec<&str> = input.split('x').collect(); + if parts.len() == 3 { + if let (Ok(a), Ok(b), Ok(c)) = ( + parts[0].parse::(), + parts[1].parse::(), + parts[2].parse::(), + ) { + return Some((a, b, c)); + } + } + None +} + +fn main() { + println!("Box sized {} requires {}", "2x3x4", ribbon_for_package(2,3,4)); + println!("Box sized {} requires {}", "1x1x10", ribbon_for_package(1,1,10)); + + let sizes = read_data("2015_02_data.txt").lines(); + let mut total_ribbon = 0; + + for size in sizes { + let (l, w, h) = split_str(size).unwrap(); + let needed = ribbon_for_package(l, w, h); + println!("Need {} for {}", needed, size); + total_ribbon += needed + } + + println!("Need a total of {}", total_ribbon); +} +// 3737498 \ No newline at end of file diff --git a/src/bin/2015_03a.rs b/src/bin/2015_03a.rs new file mode 100644 index 0000000..c3aa365 --- /dev/null +++ b/src/bin/2015_03a.rs @@ -0,0 +1,55 @@ +// Santa is delivering presents to an infinite two-dimensional grid of houses. +// +// He begins by delivering a present to the house at his starting location, and then an elf at the +// North Pole calls him via radio and tells him where to move next. Moves are always exactly one +// house to the north (^), south (v), east (>), or west (<). After each move, he delivers another +// present to the house at his new location. +// +// However, the elf back at the north pole has had a little too much eggnog, and so his directions +// are a little off, and Santa ends up visiting some houses more than once. How many houses receive +// at least one present? +// +// For example: +// +// > delivers presents to 2 houses: one at the starting location, and one to the east. +// ^>v< delivers presents to 4 houses in a square, including twice to the house at his +// starting/ending location. +// ^v^v^v^v^v delivers a bunch of presents to some very lucky children at only 2 houses. + +use std::collections::HashMap; +use aoc::read_data; + +fn main() { + let mut visits: HashMap = HashMap::from([("0x0".to_string(), 1)]); + let (mut current_x, mut current_y) = (0,0); + + let instructions = read_data("2015_03_data.txt"); + for current_instruction in instructions.chars() { + match current_instruction { + '^' => { + println!("Move North 1"); + current_y += 1; + }, + 'v' => { + println!("Move South 1"); + current_y -= 1; + }, + '<' => { + println!("Move West 1"); + current_x -= 1; + }, + '>' => { + println!("Move East 1"); + current_x += 1; + }, + _ => { unreachable!("Invalid instruction -> {}", ¤t_instruction); } + } + let current_address = format!("{}x{}", current_x, current_y); + *visits.entry(current_address).and_modify(|x| *x += 1).or_insert(1); + } + + println!("Found {} houses got presents.", visits.keys().count()); + + println!("Taxation is theft."); +} +// 2081 \ No newline at end of file diff --git a/src/bin/2015_03b.rs b/src/bin/2015_03b.rs new file mode 100644 index 0000000..f9bb9ae --- /dev/null +++ b/src/bin/2015_03b.rs @@ -0,0 +1,83 @@ +// The next year, to speed up the process, Santa creates a robot version of himself, Robo-Santa, +// to deliver presents with him. +// +// Santa and Robo-Santa start at the same location (delivering two presents to the same starting +// house), then take turns moving based on instructions from the elf, who is eggnoggedly reading +// from the same script as the previous year. +// +// This year, how many houses receive at least one present? +// +// For example: +// +// ^v delivers presents to 3 houses, because Santa goes north, and then Robo-Santa goes south. +// ^>v< now delivers presents to 3 houses, and Santa and Robo-Santa end up back where they started. +// ^v^v^v^v^v now delivers presents to 11 houses, with Santa going one direction and Robo-Santa +// going the other. + +use std::collections::HashMap; +use aoc::read_data; + +fn num_houses(directions: &str) -> u32 { + let (mut santa_x, mut santa_y, mut robo_x, mut robo_y) = (0,0,0,0); + let mut visits = HashMap::from([("0x0".to_string(), 1)]); + let mut santas_turn = true; + + for current_instruction in directions.chars() { + match current_instruction { + '^' => { + if santas_turn { + santa_y += 1; + } else { + robo_y += 1; + } + }, + 'v' => { + if santas_turn { + santa_y -= 1; + } else { + robo_y -= 1; + } + }, + '<' => { + if santas_turn { + santa_x -= 1; + } else { + robo_x -= 1; + } + }, + '>' => { + if santas_turn { + santa_x += 1; + } else { + robo_x += 1; + } + } + _ => { unreachable!("Invalid Instruction"); } + } + let current_address = if santas_turn { + format!("{}x{}", santa_x, santa_y) + } else { + format!("{}x{}", robo_x, robo_y) + }; + println!("V:{} S:{}x{} R:{}x{} V#:{}", current_address, santa_x, santa_y, robo_x, robo_y, visits.keys().count()); + *visits.entry(current_address).and_modify(|x| *x += 1).or_insert(1); + santas_turn = !santas_turn; + } + + visits.keys().count() as u32 +} + +fn main() { + let directions = read_data("2015_03_data.txt"); + let params = vec![ + ("^v", 3), + ("^>v<", 3), + ("^v^v^v^v^v", 11), + (directions.as_str(), 0) + ]; + + for (input, expected) in params { + println!("{:<20} resolves to {} houses.", input, num_houses(input)); + } +} +// 2341 diff --git a/src/bin/2015_04a.rs b/src/bin/2015_04a.rs new file mode 100644 index 0000000..916e5eb --- /dev/null +++ b/src/bin/2015_04a.rs @@ -0,0 +1,59 @@ +// Santa needs help mining some AdventCoins (very similar to bitcoins) to use as gifts for all the +// economically forward-thinking little girls and boys. +// +// To do this, he needs to find MD5 hashes which, in hexadecimal, start with at least five zeroes. +// The input to the MD5 hash is some secret key (your puzzle input, given below) followed by a +// number in decimal. To mine AdventCoins, you must find Santa the lowest positive number (no +// leading zeroes: 1, 2, 3, ...) that produces such a hash. +// +// For example: +// +// If your secret key is abcdef, the answer is 609043, because the MD5 hash of abcdef609043 starts +// with five zeroes (000001dbbfa...), and it is the lowest such number to do so. +// If your secret key is pqrstuv, the lowest number it combines with to make an MD5 hash starting +// with five zeroes is 1048970; that is, the MD5 hash of pqrstuv1048970 looks like 000006136ef.... + +use std::io::{stdout, Write}; +use md5::{Digest, Md5}; + +const INPUT: &str = "bgvyzdsv"; + +fn calculate_hash(input_id: u32, seed: &str) -> String { + let to_hash = format!("{}{}", seed, input_id); + let as_hash = format!("{:x}", Md5::digest(to_hash.as_bytes())); + as_hash +} + +fn main() { + println!("abcdef609043 -> {}", calculate_hash(609043, "abcdef")); + println!("pqrstuv1048970 -> {}", calculate_hash(1048970, "pqrstuv")); + let mut need5 = true; + let mut need6 = true; + + for number in 0..u32::MAX { + let hashed = calculate_hash(number, INPUT); + // are the first 6 characters 0? + + if need5 { + if hashed.starts_with("00000") { + println!("5 zeros -> {}{} / {}", INPUT, number, hashed); + need5 = false; + } + } + + if need6 { + if hashed.starts_with("000000") { + println!("6 zeros -> {}{} / {}", INPUT, number, hashed); + need6 = false; + } + } + + if hashed.starts_with("0000000") { + println!("7 zeros -> {}{} / {}", INPUT, number, hashed); + } // 318_903_846 + if number % 100_000 == 0 && !need6 && !need5 { + print!("."); + stdout().flush().unwrap() + } + } +} \ No newline at end of file diff --git a/src/bin/2015_05a.rs b/src/bin/2015_05a.rs new file mode 100644 index 0000000..b0a7e97 --- /dev/null +++ b/src/bin/2015_05a.rs @@ -0,0 +1,89 @@ +// Santa needs help figuring out which strings in his text file are naughty or nice. +// +// A nice string is one with all of the following properties: +// +// It contains at least three vowels (aeiou only), like aei, xazegov, or aeiouaeiouaeiou. +// It contains at least one letter that appears twice in a row, like xx, abcdde (dd), +// or aabbccdd (aa, bb, cc, or dd). +// It does not contain the strings ab, cd, pq, or xy, even if they are part of one of the other +// requirements. +// For example: +// +// ugknbfddgicrmopn is nice because it has at least three vowels (u...i...o...), a double letter +// (...dd...), and none of the disallowed substrings. +// aaa is nice because it has at least three vowels and a double letter, even though the letters +// used by different rules overlap. +// jchzalrnumimnmhp is naughty because it has no double letter. +// haegwjzuvuyypxyu is naughty because it contains the string xy. +// dvszwmarrgswjxmb is naughty because it contains only one vowel. +// How many strings are nice? +// + +use aoc::read_data; + +fn no_banned_parts(to_check: &str) -> bool { + !to_check.contains("ab") && + !to_check.contains("cd") && + !to_check.contains("pq") && + !to_check.contains("xy") +} + +fn has_doubled_letter(to_check: &str) -> bool { + let mut has_doubled = false; + let mut last_char = ' '; + + for current in to_check.chars() { + if current == last_char { + has_doubled = true + } + last_char = current + } + + has_doubled +} + +fn contains_three_vowels(to_check: &str) -> bool { + let mut num_vowels = 0; + for current in to_check.chars() { + match current { + 'a' | 'e' | 'i' | 'o' | 'u' => { + num_vowels += 1; + } + _ => {} + } + } + + num_vowels >= 3 +} + +fn is_nice(to_check: &str) -> bool { + let vowels = contains_three_vowels(to_check); + let has_doubled = has_doubled_letter(to_check); + let no_banned = no_banned_parts(to_check); + + // println!("{} -> V{} D{} B{}", to_check, vowels, has_doubled, no_banned); + + vowels && has_doubled && no_banned +} + +fn main() { + println!("ugknbfddgicrmopn is nice -> {}", is_nice("ugknbfddgicrmopn")); + println!("aaa is nice -> {}", is_nice("aaa")); + println!("jchzalrnumimnmhp is NOT nice -> {}", is_nice("jchzalrnumimnmhp")); + println!("haegwjzuvuyypxyu is NOT nice -> {}", is_nice("haegwjzuvuyypxyu")); + println!("dvszwmarrgswjxmb is NOT nice -> {}", is_nice("dvszwmarrgswjxmb")); + + let binding = read_data("2015_05_data.txt"); + let lines = binding.lines(); + let mut nice = 0; + let num_lines = lines.clone().count(); + + for line in lines { + if is_nice(line) { + nice += 1; + } + } + + println!("There are {} nice out of {} words.", nice, num_lines); +} +// 236 diff --git a/src/bin/2015_05b.rs b/src/bin/2015_05b.rs new file mode 100644 index 0000000..78672ff --- /dev/null +++ b/src/bin/2015_05b.rs @@ -0,0 +1,57 @@ +#![feature(substr_range)] + +// Realizing the error of his ways, Santa has switched to a better model of determining whether a +// string is naughty or nice. None of the old rules apply, as they are all clearly ridiculous. +// +// Now, a nice string is one with all of the following properties: +// +// It contains a pair of any two letters that appears at least twice in the string without +// overlapping, like xyxy (xy) or aabcdefgaa (aa), but not like aaa (aa, but it overlaps). +// It contains at least one letter which repeats with exactly one letter between them, like xyx, +// abcdefeghi (efe), or even aaa. +// For example: +// +// qjhvhtzxzqqjkmpb is nice because is has a pair that appears twice (qj) and a letter that repeats +// with exactly one letter between them (zxz). +// xxyxx is nice because it has a pair that appears twice and a letter that repeats with one +// between, even though the letters used by each rule overlap. +// uurcxstgmygtbstg is naughty because it has a pair (tg) but no repeat with a single letter +// between them. +// ieodomkazucvgmuy is naughty because it has a repeating letter with one between (odo), but no +// pair that appears twice. + + +fn appears_twice_without_overlapping(to_check: &str) -> bool { + + true +} + +fn letter_repeated_seperated_by_1(to_check: &str) -> bool { + println!("Starting to check for XyX"); + let mut has_criteria = false; + + let mut two_back = ' '; + let mut one_back = ' '; + for (index, current) in to_check.chars().enumerate() { + if current == two_back { + has_criteria = true; + println!("Found a seperated pair. {index} / {to_check}"); + break; + } + two_back = one_back; + one_back = current; + } + has_criteria +} + +fn is_nice(to_check: &str) -> bool { + appears_twice_without_overlapping(to_check) && + letter_repeated_seperated_by_1(to_check) +} + +fn main() { + println!("qjhvhtzxzqqjkmpb is nice -> {}", is_nice("qjhvhtzxzqqjkmpb")); + println!("xxyxx is nice -> {}", is_nice("xxyxx")); + println!("uurcxstgmygtbstg is NOT nice -> {}", is_nice("uurcxstgmygtbstg")); + println!("ieodomkazucvgmuy is NOT nice -> {}", is_nice("ieodomkazucvgmuy")); +} diff --git a/src/bin/2015_06a.rs b/src/bin/2015_06a.rs new file mode 100644 index 0000000..fdc0e9d --- /dev/null +++ b/src/bin/2015_06a.rs @@ -0,0 +1,72 @@ +// Because your neighbors keep defeating you in the holiday house decorating contest year after +// year, you've decided to deploy one million lights in a 1000x1000 grid. +// +// Furthermore, because you've been especially nice this year, Santa has mailed you instructions +// on how to display the ideal lighting configuration. +// +// Lights in your grid are numbered from 0 to 999 in each direction; the lights at each corner are +// at 0,0, 0,999, 999,999, and 999,0. The instructions include whether to turn on, turn off, or +// toggle various inclusive ranges given as coordinate pairs. Each coordinate pair represents +// opposite corners of a rectangle, inclusive; a coordinate pair like 0,0 through 2,2 therefore +// refers to 9 lights in a 3x3 square. The lights all start turned off. +// +// To defeat your neighbors this year, all you have to do is set up your lights by doing the +// instructions Santa sent you in order. +// +// For example: +// +// turn on 0,0 through 999,999 would turn on (or leave on) every light. +// toggle 0,0 through 999,0 would toggle the first line of 1000 lights, turning off the ones that +// were on, and turning on the ones that were off. +// turn off 499,499 through 500,500 would turn off (or leave off) the middle four lights. +// After following the instructions, how many lights are lit? + +use aoc::read_data; + +fn main() { + let mut block: [bool; 1000*1000] = [false; 1000*1000]; + let binding = read_data("2015_06_data.txt"); + let lines: Vec<&str> = binding.lines().collect(); + + for instruction in lines { + let parts: Vec<&str> = instruction.split(' ').collect(); + match parts.len() { + 5 => { + let start_parts: Vec = parts[2].split(',').map(|x| x.parse().unwrap()).collect(); + let end_parts: Vec =parts[4].split(',').map(|x| x.parse().unwrap()).collect(); + // figure out if the [1] item is 'on' or 'off' + let target_state = if parts[1] == "on" { true } else { false }; + for x in start_parts[0]..=end_parts[0] { + for y in start_parts[1]..=end_parts[1] { + let offset = (x * 1000) + y; + // println!("Setting {}x{}({}) to {}", x, y, offset, target_state); + block[offset as usize] = target_state; + } + } + } + 4 => { + // toggle + let start_parts: Vec = parts[1].split(',').map(|x| x.parse().unwrap()).collect(); + let end_parts: Vec =parts[3].split(',').map(|x| x.parse().unwrap()).collect(); + + // println!("[{}] Toggling from {}x{} to {}x{}", instruction, start_parts[0], start_parts[1], end_parts[0], end_parts[1]); + for x in start_parts[0]..=end_parts[0] { + for y in start_parts[1]..=end_parts[1] { + let offset = ((x * 1000) + y) as usize; + let current = block[offset]; + // println!("Toggling {}x{} from {}", x, y, current); + block[offset] = !current; + } + } + }, + _ => { unreachable!("Invalid number of parts") } + } + } + println!("Tallying lights..."); + let mut num_lit = 0; + for current in block { + if current { num_lit += 1; } + } + println!("Counted {} lights.", num_lit); +} +// 400410 \ No newline at end of file diff --git a/src/bin/2015_06b.rs b/src/bin/2015_06b.rs new file mode 100644 index 0000000..0942106 --- /dev/null +++ b/src/bin/2015_06b.rs @@ -0,0 +1,72 @@ +// You just finish implementing your winning light pattern when you realize you mistranslated +// Santa's message from Ancient Nordic Elvish. +// +// The light grid you bought actually has individual brightness controls; each light can have a +// brightness of zero or more. The lights all start at zero. +// +// The phrase turn on actually means that you should increase the brightness of those lights by 1. +// +// The phrase turn off actually means that you should decrease the brightness of those lights by 1, +// to a minimum of zero. +// +// The phrase toggle actually means that you should increase the brightness of those lights by 2. +// +// What is the total brightness of all lights combined after following Santa's instructions? +// +// For example: +// +// turn on 0,0 through 0,0 would increase the total brightness by 1. +// toggle 0,0 through 999,999 would increase the total brightness by 2000000. + +use aoc::read_data; + +fn main() { + let mut block: Box<[u32; 1000*1000]> = Box::new([0; 1000*1000]); + let binding = read_data("2015_06_data.txt"); + let lines: Vec<&str> = binding.lines().collect(); + + for instruction in lines { + let parts: Vec<&str> = instruction.split(' ').collect(); + + match parts.len() { + 5 => { + let start_parts: Vec = parts[2].split(',').map(|x| x.parse().unwrap()).collect(); + let end_parts: Vec = parts[4].split(',').map(|x| x.parse().unwrap()).collect(); + + for x in start_parts[0]..=end_parts[0] { + for y in start_parts[1]..=end_parts[1] { + let offset = (x * 1000 + y) as usize; + if parts[1] == "on" { + block[offset] += 1; + } else { + if block[offset] > 0 { + block[offset] -= 1; + } + } + } + } + }, + 4 => { + let start_parts: Vec = parts[1].split(',').map(|x| x.parse().unwrap()).collect(); + let end_parts: Vec = parts[3].split(',').map(|x| x.parse().unwrap()).collect(); + + for x in start_parts[0]..=end_parts[0] { + for y in start_parts[1]..=end_parts[1] { + let offset = ((x * 1000) + y) as usize; + block[offset] += 2; + } + } + } + _ => { + unreachable!("Invalid direction -> [{}]", instruction); + } + } + } + let mut working: u64 = 0; + + for current in block.iter() { + working += *current as u64; + } + println!("Total Brightness = {}", working); +} +// 15343601 diff --git a/src/bin/2016_01a.rs b/src/bin/2016_01a.rs new file mode 100644 index 0000000..85059b8 --- /dev/null +++ b/src/bin/2016_01a.rs @@ -0,0 +1,118 @@ +// Santa's sleigh uses a very high-precision clock to guide its movements, and the clock's +// oscillator is regulated by stars. Unfortunately, the stars have been stolen... by the Easter +// Bunny. To save Christmas, Santa needs you to retrieve all fifty stars by December 25th. +// +// Collect stars by solving puzzles. Two puzzles will be made available on each day in the Advent +// calendar; the second puzzle is unlocked when you complete the first. Each puzzle grants one +// star. Good luck! +// +// You're airdropped near Easter Bunny Headquarters in a city somewhere. "Near", unfortunately, is +// as close as you can get - the instructions on the Easter Bunny Recruiting Document the Elves +// intercepted start here, and nobody had time to work them out further. +// +// The Document indicates that you should start at the given coordinates (where you just landed) +// and face North. Then, follow the provided sequence: either turn left (L) or right (R) 90 +// degrees, then walk forward the given number of blocks, ending at a new intersection. +// +// There's no time to follow such ridiculous instructions on foot, though, so you take a moment +// and work out the destination. Given that you can only walk on the street grid of the city, +// how far is the shortest path to the destination? +// +// For example: +// +// Following R2, L3 leaves you 2 blocks East and 3 blocks North, or 5 blocks away. +// R2, R2, R2 leaves you 2 blocks due South of your starting position, which is 2 blocks away. +// R5, L5, R5, R3 leaves you 12 blocks away. +// How many blocks away is Easter Bunny HQ? +// + +use std::{env, fs}; +use crate::CardinalDirection::*; + +#[derive(Debug)] +enum CardinalDirection { + North, + South, + East, + West +} + +fn manhattan_distance(directions: &str) -> i32 { + let (mut x_distance, mut y_distance, mut x_move, mut y_move) = (0i32,0i32, 0i32, 0i32); + let mut current_direction = North; + for next_direction in directions.split(", ") { + let (direction, vector) = next_direction.split_at(1); + let distance = vector.parse().unwrap(); + // print!("[{}] At {x_distance}x{y_distance}, FACING {current_direction:?}, TURN {} MOVE {} ::::::", next_direction, direction, distance); + + x_move = 0; y_move = 0; + + match direction { + "R" => { + match current_direction { + North => { + current_direction = East; + x_move = distance; + } + South => { + current_direction = West; + x_move = distance * -1 ; + } + East => { + current_direction = South; + y_move = distance * -1; + } + West => { + current_direction = North; + y_move = distance; + } + } + } + "L" => { + match current_direction { + North => { + current_direction = West; + x_move = distance * -1; + } + South => { + current_direction = East; + x_move = distance; + } + East => { + current_direction = North; + y_move = distance; + } + West => { + current_direction = South; + y_move = distance * -1; + } + } + } + _ => { + println!("INVALID DIRECTION"); + } + } + x_distance += x_move; + y_distance += y_move; + + // println!("facing {:?} at {}x{} (moved {}x{})", current_direction, x_distance, y_distance, x_move, y_move); + } + x_distance.abs() + y_distance.abs() +} + +fn main() { + + let directions = fs::read_to_string(format!("{}/data/01_data.txt", env::var("CARGO_MANIFEST_DIR").unwrap())).unwrap(); + let directions = directions.as_str(); + let parmas: Vec<(&str, i32)> = vec![ + ("R2, L3", 5), + ("R2, R2, R2", 2), + ("R5, L5, R5, R3", 12), + (directions, 252)]; + + for (param, expected) in parmas { + println!("Manhattan Distance of {} Expected {}", manhattan_distance(param) , expected); + } +} + +// 252 \ No newline at end of file diff --git a/src/bin/2016_01b.rs b/src/bin/2016_01b.rs new file mode 100644 index 0000000..f62fd7e --- /dev/null +++ b/src/bin/2016_01b.rs @@ -0,0 +1,127 @@ +// Santa's sleigh uses a very high-precision clock to guide its movements, and the clock's +// oscillator is regulated by stars. Unfortunately, the stars have been stolen... by the Easter +// Bunny. To save Christmas, Santa needs you to retrieve all fifty stars by December 25th. +// +// Collect stars by solving puzzles. Two puzzles will be made available on each day in the Advent +// calendar; the second puzzle is unlocked when you complete the first. Each puzzle grants one +// star. Good luck! +// +// You're airdropped near Easter Bunny Headquarters in a city somewhere. "Near", unfortunately, is +// as close as you can get - the instructions on the Easter Bunny Recruiting Document the Elves +// intercepted start here, and nobody had time to work them out further. +// +// The Document indicates that you should start at the given coordinates (where you just landed) +// and face North. Then, follow the provided sequence: either turn left (L) or right (R) 90 +// degrees, then walk forward the given number of blocks, ending at a new intersection. +// +// There's no time to follow such ridiculous instructions on foot, though, so you take a moment +// and work out the destination. Given that you can only walk on the street grid of the city, +// how far is the shortest path to the destination? +// +// For example: +// +// Following R2, L3 leaves you 2 blocks East and 3 blocks North, or 5 blocks away. +// R2, R2, R2 leaves you 2 blocks due South of your starting position, which is 2 blocks away. +// R5, L5, R5, R3 leaves you 12 blocks away. +// How many blocks away is Easter Bunny HQ? +// + +use std::{env, fs}; +use std::collections::HashMap; +use aoc::read_data; +use crate::CardinalDirection::*; + +#[derive(Debug)] +enum CardinalDirection { + North, + South, + East, + West +} + +fn manhattan_distance(directions: &str) -> i32 { + let mut visited_locations: HashMap = HashMap::new(); + visited_locations.insert("0x0".to_string(), 0); + let (mut x_distance, mut y_distance, mut x_move, mut y_move) = (0i32,0i32, 0i32, 0i32); + let mut current_direction = North; + for next_direction in directions.split(", ") { + let (direction, vector) = next_direction.split_at(1); + let distance = vector.parse().unwrap(); + // print!("[{}] At {x_distance}x{y_distance}, FACING {current_direction:?}, TURN {} MOVE {} ::::::", next_direction, direction, distance); + + x_move = 0; y_move = 0; + + match direction { + "R" => { + match current_direction { + North => { + current_direction = East; + x_move = distance; + } + South => { + current_direction = West; + x_move = distance * -1 ; + } + East => { + current_direction = South; + y_move = distance * -1; + } + West => { + current_direction = North; + y_move = distance; + } + } + } + "L" => { + match current_direction { + North => { + current_direction = West; + x_move = distance * -1; + } + South => { + current_direction = East; + x_move = distance; + } + East => { + current_direction = North; + y_move = distance; + } + West => { + current_direction = South; + y_move = distance * -1; + } + } + } + _ => { + println!("INVALID DIRECTION"); + } + } + x_distance += x_move; + y_distance += y_move; + + // have we been here before? + let new_index = format!("{}x{}", x_distance, y_distance); + for key in visited_locations.keys() { + if *key == new_index { + panic!("********************************MATCH -> {} == {}x{}", key, x_distance, y_distance); + } else { + print!("\tNOT MATCH -> {key} {x_distance}x{y_distance}\n"); + } + } + println!("Adding {new_index} to visited list"); + visited_locations.insert(new_index, 0); + } + x_distance.abs() + y_distance.abs() +} + +fn main() { + let binding = read_data("2016_01_data.txt"); + let directions = binding.as_str(); + let params: Vec<&str> = vec![directions]; + + for param in params { + println!("Manhattan Distance of {}", manhattan_distance(param)); + } +} + +// NOT COMPLETED. CANT FIND THE REPEATED LOCATION \ No newline at end of file diff --git a/src/bin/2024_01a.rs b/src/bin/2024_01a.rs new file mode 100644 index 0000000..af0c19a --- /dev/null +++ b/src/bin/2024_01a.rs @@ -0,0 +1,81 @@ +use std::{fs, io}; +use std::fs::File; +use std::io::BufRead; +use std::path::Path; + +/// Given 2 lists, sort the lists smallest to largest and then compare each pair of digits, +/// finding the difference between the two. +/// +/// Ex: +/// +/// 3 4 -> 1 3 = 2 +/// 4 3 -> 2 3 = 1 +/// 2 5 -> 3 3 = 0 +/// 1 3 -> 3 4 = 1 +/// 3 9 -> 3 5 = 2 +/// 3 3 -> 4 9 = 5 +/// SUM 11 +/// +/// + +fn bubble_sort(mut nums: Vec) -> Vec { + let n = nums.len(); + let mut swapped = true; + + while swapped { + swapped = false; + for i in 1..n { + if nums[i - 1] > nums[i] { + nums.swap(i - 1, i); + swapped = true; + } + } + } + + nums +} + +fn read_two_columns>(filename: P) -> io::Result<(Vec, Vec)> { + let file = File::open(filename)?; + let reader = io::BufReader::new(file); + + let mut col1 = Vec::new(); + let mut col2 = Vec::new(); + + for line in reader.lines() { + let line = line?; + let parts: Vec<&str> = line.split_whitespace().collect(); + if parts.len() == 2 { + let a: i32 = parts[0].parse().unwrap_or(0); + let b: i32 = parts[1].parse().unwrap_or(0); + col1.push(a); + col2.push(b); + } + } + + Ok((col1, col2)) +} + +fn main() { + println!("Loading Data..."); + + let input_file = format!("{}/{}" , + std::env::var("CARGO_MANIFEST_DIR").unwrap(), + "data/01_data.txt" + ); + + let (mut list1, mut list2) = read_two_columns(input_file).unwrap(); + list1 = bubble_sort(list1); + list2 = bubble_sort(list2); + + let mut running_total = 0; + for index in 0..list1.len() { + let n1 = list1[index].max(list2[index]); + let n2 = list1[index].min(list2[index]); + + running_total += n1 - n2; + } + + println!("Total = {}", running_total); +} +// 2375403 \ No newline at end of file diff --git a/src/bin/2024_01b.rs b/src/bin/2024_01b.rs new file mode 100644 index 0000000..706bbea --- /dev/null +++ b/src/bin/2024_01b.rs @@ -0,0 +1,102 @@ +use std::{fs, io}; +use std::fs::File; +use std::io::BufRead; +use std::path::Path; + +// Your analysis only confirmed what everyone feared: the two lists of location IDs are indeed +// very different. +// +// Or are they? +// +// The Historians can't agree on which group made the mistakes or how to read most of the Chief's +// handwriting, but in the commotion you notice an interesting detail: a lot of location IDs appear +// in both lists! Maybe the other numbers aren't location IDs at all but rather misinterpreted +// handwriting. +// +// This time, you'll need to figure out exactly how often each number from the left list appears in +// the right list. Calculate a total similarity score by adding up each number in the left list +// after multiplying it by the number of times that number appears in the right list. +// +// Here are the same example lists again: +// +// 3 4 +// 4 3 +// 2 5 +// 1 3 +// 3 9 +// 3 3 +// For these example lists, here is the process of finding the similarity score: +// +// The first number in the left list is 3. It appears in the right list three times, so the +// similarity score increases by 3 * 3 = 9. +// The second number in the left list is 4. It appears in the right list once, so the similarity +// score increases by 4 * 1 = 4. +// The third number in the left list is 2. It does not appear in the right list, so the similarity +// score does not increase (2 * 0 = 0). +// The fourth number, 1, also does not appear in the right list. +// The fifth number, 3, appears in the right list three times; the similarity score increases by 9. +// The last number, 3, appears in the right list three times; the similarity score again increases +// by 9. +// So, for these example lists, the similarity score at the end of this process is +// 31 (9 + 4 + 0 + 0 + 9 + 9). +// +// Once again consider your left and right lists. What is their similarity score? + +fn num_in_list(needle: i32, haystack: &Vec) -> i32 { + let mut working = 0; + for straw in haystack { + if *straw == needle { + working += 1; + } + } + + working +} + +fn count_occurances_in_list(needles: &Vec, haystack: &Vec) -> i32 { + // looking for a needle in a haystack...lets go! + + let mut working = 0; + + for needle in needles { + let num_in_list = num_in_list(*needle, haystack); + println!("Found {}, {} times. / {}", needle, num_in_list, working); + working += needle * num_in_list; + } + + working +} + +fn read_two_columns>(filename: P) -> io::Result<(Vec, Vec)> { + let file = File::open(filename)?; + let reader = io::BufReader::new(file); + + let mut col1 = Vec::new(); + let mut col2 = Vec::new(); + + for line in reader.lines() { + let line = line?; + let parts: Vec<&str> = line.split_whitespace().collect(); + if parts.len() == 2 { + let a: i32 = parts[0].parse().unwrap_or(0); + let b: i32 = parts[1].parse().unwrap_or(0); + col1.push(a); + col2.push(b); + } + } + + Ok((col1, col2)) +} + + +fn main() { + println!("Loading Data..."); + let file_path = std::env::var("CARGO_MANIFEST_DIR").unwrap(); + + let (list1, list2) = read_two_columns(format!("{}/data/01_data.txt", file_path)).unwrap(); + println!("List 1 -> {:?}", list1); + + let final_value = count_occurances_in_list(&list1, &list2); + println!("Final value = {final_value}"); +} +// 23082277 \ No newline at end of file diff --git a/src/bin/2024_02a.rs b/src/bin/2024_02a.rs new file mode 100644 index 0000000..1969eb3 --- /dev/null +++ b/src/bin/2024_02a.rs @@ -0,0 +1,103 @@ +// Fortunately, the first location The Historians want to search isn't a long walk from the Chief +// Historian's office. +// +// While the Red-Nosed Reindeer nuclear fusion/fission plant appears to contain no sign of the +// Chief Historian, the engineers there run up to you as soon as they see you. Apparently, they +// still talk about the time Rudolph was saved through molecular synthesis from a single electron. +// +// They're quick to add that - since you're already here - they'd really appreciate your help +// analyzing some unusual data from the Red-Nosed reactor. You turn to check if The Historians are +// waiting for you, but they seem to have already divided into groups that are currently searching +// every corner of the facility. You offer to help with the unusual data. +// +// The unusual data (your puzzle input) consists of many reports, one report per line. Each report +// is a list of numbers called levels that are separated by spaces. For example: +// +// 7 6 4 2 1 +// 1 2 7 8 9 +// 9 7 6 2 1 +// 1 3 2 4 5 +// 8 6 4 4 1 +// 1 3 6 7 9 +// This example data contains six reports each containing five levels. +// +// The engineers are trying to figure out which reports are safe. The Red-Nosed reactor safety +// systems can only tolerate levels that are either gradually increasing or gradually decreasing. +// So, a report only counts as safe if both of the following are true: +// +// The levels are either all increasing or all decreasing. +// Any two adjacent levels differ by at least one and at most three. +// In the example above, the reports can be found safe or unsafe by checking those rules: +// +// 7 6 4 2 1: Safe because the levels are all decreasing by 1 or 2. +// 1 2 7 8 9: Unsafe because 2 7 is an increase of 5. +// 9 7 6 2 1: Unsafe because 6 2 is a decrease of 4. +// 1 3 2 4 5: Unsafe because 1 3 is increasing but 3 2 is decreasing. +// 8 6 4 4 1: Unsafe because 4 4 is neither an increase or a decrease. +// 1 3 6 7 9: Safe because the levels are all increasing by 1, 2, or 3. +// So, in this example, 2 reports are safe. + +use std::{env, fs}; + +fn min_max(num1: u32, num2: u32) -> (u32, u32) { + (num1.min(num2), num1.max(num2)) +} + +fn in_range(min: u32, max:u32, target: u32) -> bool { + min <= target && target <= max +} + +fn parse_numbers(s: &str) -> Vec { + s.split_whitespace() // split on whitespace + .filter_map(|num| num.parse::().ok()) // try to parse each piece + .collect() +} +fn is_safe(report: &str) -> bool { + let mut is_safe = true; + let mut last_reading = 0; + + let numbers = parse_numbers(report); + println!("numbers: {:?}", numbers); + let mut is_increasing = numbers[0] < numbers[1]; + + println!("Checking report {report}"); + println!("Found is_increasing = {is_increasing} from {}/{}", numbers[0], numbers[1]); + + for (index, reading) in numbers.iter().enumerate() { + println!("Checking {index}->{reading} in {report} / {is_increasing}"); + } + + // for (index, reading) in numbers.enumerate() { + // let reading_u32: u32 = reading.parse().unwrap(); + // if index == 0 { + // // prime it for the report + // last_reading = reading_u32; + // } else if index == 1 { + // if last_reading > reading_u32 { + // is_increasing = false; + // } + // } else { + // let (min,max) = min_max(last_reading as u32, reading_u32); + // + // // changing too fast + // if (max - min) > 2 { is_safe = false; } + // } + // } + is_safe +} + +fn main() { + let input_file = format!("{}/{}" , + std::env::var("CARGO_MANIFEST_DIR").unwrap(), + "data/02_data.txt" + ); + + let binding = fs::read_to_string(input_file).unwrap(); + let reports = binding.lines(); + + for report in reports { + if is_safe(report) { + println!("Handling report of {report} -> Safe: {}", is_safe(report)); + } + } +} diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..02eb2ba --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,28 @@ +/// AOC Lib +/// Generic methods for loading various data inputs from +/// the AOC project. + +pub fn data_path(suffix: &str) -> String { + let path = std::env::var("CARGO_MANIFEST_DIR").unwrap(); + format!("{}/data/{}", path, suffix) +} + +pub fn read_data(suffix: &str) -> String { + std::fs::read_to_string( + data_path(suffix) + ).unwrap() +} + +pub fn string_to_3u32(input: &str) -> Option<(u32, u32, u32)> { + let parts: Vec<&str> = input.split('x').collect(); + if parts.len() == 3 { + if let (Ok(a), Ok(b), Ok(c)) = ( + parts[0].parse::(), + parts[1].parse::(), + parts[2].parse::(), + ) { + return Some((a, b, c)); + } + } + None +}