diff --git a/day5/Cargo.lock b/day5/Cargo.lock new file mode 100644 index 0000000..8050ad2 --- /dev/null +++ b/day5/Cargo.lock @@ -0,0 +1,243 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "addr2line" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9ecd88a8c8378ca913a680cd98f0f13ac67383d35993f86c90a70e3f137816b" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "backtrace" +version = "0.3.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cab84319d616cfb654d03394f38ab7e6f0919e181b1b57e1fd15e7fb4077d9a7" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] +name = "cc" +version = "1.0.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9f73505338f7d905b19d18738976aae232eb46b8efc15554ffc56deb5d9ebe4" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "color-eyre" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a667583cca8c4f8436db8de46ea8233c42a7d9ae424a82d338f2e4675229204" +dependencies = [ + "backtrace", + "color-spantrace", + "eyre", + "indenter", + "once_cell", + "owo-colors", + "tracing-error", +] + +[[package]] +name = "color-spantrace" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ba75b3d9449ecdccb27ecbc479fdc0b87fa2dd43d2f8298f9bf0e59aacc8dce" +dependencies = [ + "once_cell", + "owo-colors", + "tracing-core", + "tracing-error", +] + +[[package]] +name = "day5" +version = "0.1.0" +dependencies = [ + "color-eyre", + "itertools", +] + +[[package]] +name = "either" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" + +[[package]] +name = "eyre" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c2b6b5a29c02cdc822728b7d7b8ae1bab3e3b05d44522770ddd49722eeac7eb" +dependencies = [ + "indenter", + "once_cell", +] + +[[package]] +name = "gimli" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22030e2c5a68ec659fde1e949a745124b48e6fa8b045b7ed5bd1fe4ccc5c4e5d" + +[[package]] +name = "indenter" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.138" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db6d7e329c562c5dfab7a46a2afabc8b987ab9a4834c9d1ca04dc54c1546cef8" + +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "miniz_oxide" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96590ba8f175222643a85693f33d26e9c8a015f599c216509b1a6894af675d34" +dependencies = [ + "adler", +] + +[[package]] +name = "object" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21158b2c33aa6d4561f1c0a6ea283ca92bc54802a93b263e910746d679a7eb53" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86f0b0d4bf799edbc74508c1e8bf170ff5f41238e5f8225603ca7caaae2b7860" + +[[package]] +name = "owo-colors" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f" + +[[package]] +name = "pin-project-lite" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" + +[[package]] +name = "rustc-demangle" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" + +[[package]] +name = "sharded-slab" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "thread_local" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5516c27b78311c50bf42c071425c560ac799b11c30b31f87e3081965fe5e0180" +dependencies = [ + "once_cell", +] + +[[package]] +name = "tracing" +version = "0.1.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +dependencies = [ + "cfg-if", + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-error" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d686ec1c0f384b1277f097b2f279a2ecc11afe8c133c1aabf036a27cb4cd206e" +dependencies = [ + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6176eae26dd70d0c919749377897b54a9276bd7061339665dd68777926b5a70" +dependencies = [ + "sharded-slab", + "thread_local", + "tracing-core", +] + +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" diff --git a/day5/Cargo.toml b/day5/Cargo.toml index f9b62bf..743e1b0 100644 --- a/day5/Cargo.toml +++ b/day5/Cargo.toml @@ -6,3 +6,5 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +color-eyre = "0.6.2" +itertools = "0.10.5" diff --git a/day5/input.txt b/day5/input.txt new file mode 100644 index 0000000..aef7951 --- /dev/null +++ b/day5/input.txt @@ -0,0 +1,511 @@ + [G] [P] [M] + [V] [M] [W] [S] [Q] + [N] [N] [G] [H] [T] [F] + [J] [W] [V] [Q] [W] [F] [P] +[C] [H] [T] [T] [G] [B] [Z] [B] +[S] [W] [S] [L] [F] [B] [P] [C] [H] +[G] [M] [Q] [S] [Z] [T] [J] [D] [S] +[B] [T] [M] [B] [J] [C] [T] [G] [N] + 1 2 3 4 5 6 7 8 9 + +move 2 from 4 to 2 +move 6 from 9 to 7 +move 4 from 7 to 2 +move 2 from 4 to 1 +move 2 from 6 to 7 +move 1 from 3 to 8 +move 4 from 7 to 1 +move 2 from 3 to 2 +move 3 from 8 to 5 +move 3 from 1 to 4 +move 12 from 2 to 5 +move 2 from 6 to 8 +move 12 from 5 to 8 +move 3 from 7 to 9 +move 18 from 8 to 9 +move 2 from 8 to 6 +move 3 from 2 to 3 +move 14 from 9 to 4 +move 1 from 1 to 3 +move 7 from 9 to 3 +move 1 from 2 to 1 +move 8 from 4 to 5 +move 5 from 6 to 3 +move 2 from 7 to 9 +move 3 from 4 to 9 +move 4 from 9 to 6 +move 4 from 6 to 1 +move 8 from 4 to 6 +move 10 from 1 to 2 +move 13 from 3 to 2 +move 17 from 5 to 9 +move 2 from 5 to 1 +move 9 from 9 to 7 +move 1 from 3 to 6 +move 2 from 1 to 8 +move 11 from 2 to 4 +move 5 from 6 to 8 +move 1 from 6 to 3 +move 1 from 1 to 4 +move 3 from 8 to 6 +move 3 from 2 to 8 +move 9 from 7 to 9 +move 4 from 4 to 7 +move 1 from 9 to 5 +move 15 from 9 to 7 +move 7 from 8 to 3 +move 1 from 5 to 6 +move 2 from 6 to 9 +move 8 from 2 to 6 +move 3 from 4 to 3 +move 1 from 2 to 5 +move 4 from 9 to 3 +move 1 from 3 to 4 +move 13 from 6 to 2 +move 1 from 5 to 1 +move 4 from 4 to 9 +move 6 from 3 to 2 +move 11 from 2 to 7 +move 6 from 3 to 4 +move 3 from 3 to 2 +move 1 from 3 to 4 +move 1 from 1 to 3 +move 3 from 9 to 2 +move 1 from 3 to 1 +move 4 from 7 to 1 +move 1 from 9 to 5 +move 5 from 1 to 4 +move 11 from 2 to 4 +move 1 from 5 to 3 +move 1 from 2 to 3 +move 12 from 4 to 2 +move 2 from 7 to 2 +move 7 from 4 to 3 +move 5 from 4 to 1 +move 7 from 7 to 6 +move 4 from 1 to 8 +move 1 from 8 to 5 +move 8 from 3 to 2 +move 4 from 7 to 4 +move 13 from 7 to 1 +move 2 from 8 to 6 +move 5 from 4 to 9 +move 1 from 3 to 6 +move 1 from 5 to 8 +move 1 from 2 to 9 +move 4 from 2 to 6 +move 2 from 8 to 6 +move 10 from 1 to 3 +move 4 from 9 to 4 +move 2 from 1 to 3 +move 5 from 2 to 9 +move 4 from 9 to 2 +move 1 from 1 to 2 +move 13 from 2 to 4 +move 15 from 4 to 5 +move 3 from 6 to 8 +move 8 from 3 to 8 +move 1 from 4 to 2 +move 14 from 5 to 1 +move 1 from 5 to 4 +move 1 from 4 to 2 +move 8 from 6 to 7 +move 3 from 6 to 2 +move 2 from 9 to 1 +move 8 from 8 to 7 +move 9 from 1 to 5 +move 7 from 5 to 3 +move 14 from 7 to 9 +move 2 from 2 to 3 +move 7 from 2 to 1 +move 1 from 6 to 1 +move 4 from 9 to 2 +move 8 from 3 to 6 +move 2 from 4 to 3 +move 4 from 3 to 5 +move 5 from 5 to 7 +move 2 from 6 to 9 +move 6 from 6 to 2 +move 4 from 2 to 3 +move 1 from 6 to 2 +move 2 from 7 to 8 +move 13 from 9 to 5 +move 2 from 7 to 1 +move 14 from 1 to 5 +move 15 from 5 to 7 +move 3 from 8 to 7 +move 5 from 3 to 5 +move 6 from 5 to 7 +move 4 from 1 to 7 +move 1 from 2 to 5 +move 3 from 2 to 8 +move 11 from 5 to 2 +move 10 from 7 to 1 +move 1 from 3 to 4 +move 10 from 2 to 9 +move 1 from 5 to 8 +move 6 from 7 to 3 +move 1 from 4 to 6 +move 2 from 3 to 8 +move 1 from 2 to 1 +move 4 from 3 to 9 +move 3 from 1 to 6 +move 2 from 7 to 1 +move 1 from 5 to 6 +move 1 from 3 to 8 +move 4 from 1 to 4 +move 5 from 2 to 9 +move 3 from 1 to 4 +move 18 from 9 to 7 +move 4 from 8 to 4 +move 3 from 1 to 2 +move 1 from 9 to 7 +move 1 from 4 to 7 +move 1 from 6 to 2 +move 1 from 2 to 5 +move 25 from 7 to 3 +move 7 from 4 to 2 +move 8 from 7 to 9 +move 4 from 8 to 6 +move 1 from 8 to 5 +move 4 from 6 to 5 +move 2 from 9 to 5 +move 3 from 5 to 8 +move 4 from 6 to 4 +move 12 from 3 to 5 +move 11 from 3 to 2 +move 13 from 5 to 8 +move 4 from 9 to 6 +move 7 from 4 to 9 +move 2 from 6 to 2 +move 12 from 2 to 7 +move 1 from 6 to 3 +move 1 from 5 to 6 +move 2 from 5 to 3 +move 15 from 8 to 6 +move 4 from 6 to 7 +move 1 from 5 to 1 +move 10 from 2 to 8 +move 8 from 8 to 3 +move 8 from 6 to 8 +move 2 from 7 to 6 +move 9 from 9 to 7 +move 8 from 8 to 9 +move 1 from 1 to 3 +move 1 from 2 to 7 +move 7 from 3 to 1 +move 3 from 8 to 5 +move 3 from 1 to 6 +move 7 from 9 to 2 +move 2 from 3 to 7 +move 5 from 7 to 9 +move 17 from 7 to 5 +move 2 from 7 to 6 +move 10 from 6 to 3 +move 1 from 1 to 3 +move 6 from 9 to 3 +move 1 from 2 to 9 +move 2 from 7 to 9 +move 2 from 9 to 7 +move 1 from 5 to 8 +move 1 from 8 to 5 +move 6 from 2 to 5 +move 1 from 6 to 1 +move 5 from 3 to 5 +move 1 from 6 to 8 +move 1 from 7 to 9 +move 2 from 9 to 3 +move 15 from 5 to 2 +move 2 from 1 to 8 +move 2 from 3 to 7 +move 2 from 8 to 3 +move 3 from 5 to 9 +move 1 from 8 to 6 +move 1 from 9 to 6 +move 3 from 7 to 6 +move 17 from 3 to 4 +move 1 from 1 to 2 +move 6 from 2 to 9 +move 16 from 4 to 1 +move 4 from 6 to 8 +move 9 from 5 to 6 +move 8 from 6 to 2 +move 2 from 9 to 5 +move 2 from 3 to 5 +move 1 from 6 to 2 +move 1 from 4 to 8 +move 14 from 1 to 3 +move 8 from 5 to 3 +move 20 from 3 to 1 +move 1 from 8 to 2 +move 1 from 9 to 6 +move 1 from 6 to 7 +move 1 from 7 to 3 +move 22 from 1 to 2 +move 3 from 3 to 6 +move 27 from 2 to 8 +move 2 from 2 to 8 +move 2 from 6 to 9 +move 2 from 9 to 4 +move 2 from 4 to 8 +move 1 from 1 to 3 +move 14 from 8 to 5 +move 1 from 3 to 9 +move 3 from 9 to 2 +move 5 from 2 to 8 +move 10 from 2 to 9 +move 1 from 6 to 7 +move 1 from 7 to 5 +move 7 from 5 to 2 +move 2 from 9 to 2 +move 1 from 6 to 2 +move 2 from 9 to 5 +move 3 from 5 to 6 +move 6 from 5 to 3 +move 1 from 5 to 6 +move 4 from 3 to 9 +move 2 from 9 to 8 +move 3 from 9 to 5 +move 23 from 8 to 1 +move 2 from 6 to 1 +move 1 from 5 to 7 +move 2 from 3 to 5 +move 2 from 9 to 5 +move 4 from 9 to 7 +move 2 from 9 to 4 +move 1 from 5 to 4 +move 5 from 8 to 5 +move 2 from 6 to 2 +move 3 from 7 to 3 +move 1 from 3 to 4 +move 3 from 2 to 8 +move 4 from 1 to 6 +move 2 from 6 to 3 +move 4 from 1 to 2 +move 3 from 8 to 1 +move 13 from 2 to 5 +move 4 from 3 to 2 +move 14 from 5 to 7 +move 5 from 2 to 7 +move 18 from 7 to 9 +move 4 from 4 to 7 +move 2 from 5 to 4 +move 17 from 9 to 5 +move 1 from 9 to 1 +move 1 from 7 to 2 +move 5 from 7 to 2 +move 18 from 1 to 4 +move 1 from 7 to 3 +move 1 from 3 to 6 +move 2 from 1 to 3 +move 1 from 6 to 5 +move 2 from 6 to 8 +move 1 from 8 to 9 +move 1 from 8 to 3 +move 13 from 4 to 5 +move 1 from 1 to 6 +move 3 from 2 to 4 +move 1 from 6 to 1 +move 3 from 2 to 9 +move 3 from 3 to 1 +move 5 from 4 to 5 +move 30 from 5 to 3 +move 1 from 4 to 6 +move 1 from 9 to 8 +move 1 from 9 to 6 +move 21 from 3 to 7 +move 3 from 1 to 6 +move 1 from 1 to 4 +move 1 from 9 to 6 +move 1 from 8 to 2 +move 1 from 3 to 6 +move 1 from 9 to 3 +move 5 from 4 to 8 +move 1 from 2 to 4 +move 9 from 5 to 7 +move 2 from 5 to 9 +move 2 from 8 to 2 +move 2 from 6 to 3 +move 1 from 4 to 1 +move 4 from 3 to 8 +move 2 from 9 to 2 +move 4 from 2 to 6 +move 1 from 1 to 4 +move 2 from 6 to 9 +move 2 from 5 to 4 +move 1 from 3 to 1 +move 1 from 1 to 3 +move 2 from 9 to 1 +move 5 from 3 to 5 +move 1 from 1 to 8 +move 4 from 6 to 4 +move 5 from 5 to 6 +move 18 from 7 to 5 +move 1 from 3 to 4 +move 12 from 7 to 5 +move 15 from 5 to 6 +move 1 from 5 to 8 +move 1 from 3 to 7 +move 1 from 1 to 2 +move 1 from 2 to 4 +move 1 from 7 to 9 +move 2 from 8 to 2 +move 1 from 2 to 4 +move 4 from 4 to 2 +move 1 from 2 to 1 +move 1 from 9 to 8 +move 4 from 6 to 4 +move 3 from 2 to 6 +move 1 from 2 to 6 +move 8 from 4 to 3 +move 1 from 1 to 3 +move 6 from 6 to 1 +move 1 from 3 to 6 +move 5 from 1 to 7 +move 10 from 5 to 9 +move 3 from 9 to 8 +move 7 from 6 to 2 +move 1 from 7 to 8 +move 3 from 5 to 8 +move 3 from 6 to 2 +move 6 from 8 to 9 +move 1 from 5 to 3 +move 2 from 3 to 1 +move 2 from 4 to 8 +move 6 from 6 to 9 +move 1 from 1 to 4 +move 17 from 9 to 2 +move 1 from 4 to 1 +move 2 from 7 to 8 +move 1 from 9 to 8 +move 3 from 8 to 4 +move 3 from 1 to 4 +move 9 from 8 to 2 +move 1 from 8 to 4 +move 12 from 2 to 7 +move 4 from 7 to 4 +move 1 from 8 to 1 +move 10 from 4 to 2 +move 3 from 3 to 2 +move 1 from 9 to 7 +move 11 from 7 to 3 +move 1 from 3 to 1 +move 2 from 3 to 9 +move 1 from 3 to 7 +move 2 from 1 to 9 +move 1 from 6 to 5 +move 7 from 3 to 6 +move 1 from 7 to 3 +move 3 from 3 to 4 +move 1 from 5 to 7 +move 2 from 4 to 3 +move 2 from 4 to 8 +move 1 from 7 to 6 +move 2 from 6 to 8 +move 1 from 9 to 2 +move 1 from 9 to 5 +move 1 from 5 to 1 +move 1 from 8 to 6 +move 1 from 3 to 2 +move 4 from 6 to 1 +move 5 from 1 to 4 +move 11 from 2 to 4 +move 2 from 8 to 2 +move 1 from 8 to 9 +move 27 from 2 to 5 +move 4 from 6 to 3 +move 3 from 2 to 4 +move 2 from 5 to 9 +move 1 from 5 to 7 +move 2 from 9 to 5 +move 14 from 4 to 7 +move 2 from 4 to 7 +move 3 from 4 to 8 +move 4 from 3 to 1 +move 4 from 1 to 8 +move 2 from 3 to 9 +move 2 from 9 to 3 +move 7 from 8 to 9 +move 1 from 3 to 8 +move 2 from 3 to 2 +move 25 from 5 to 9 +move 1 from 5 to 8 +move 1 from 8 to 7 +move 26 from 9 to 1 +move 23 from 1 to 5 +move 7 from 9 to 7 +move 1 from 9 to 8 +move 1 from 9 to 2 +move 5 from 7 to 1 +move 20 from 5 to 6 +move 1 from 7 to 6 +move 2 from 5 to 3 +move 1 from 8 to 6 +move 21 from 6 to 8 +move 1 from 6 to 4 +move 1 from 1 to 7 +move 2 from 1 to 6 +move 1 from 1 to 3 +move 1 from 2 to 5 +move 1 from 2 to 6 +move 2 from 7 to 6 +move 6 from 7 to 9 +move 3 from 1 to 2 +move 17 from 8 to 1 +move 1 from 4 to 1 +move 2 from 6 to 9 +move 3 from 8 to 9 +move 2 from 3 to 7 +move 2 from 9 to 8 +move 4 from 7 to 3 +move 4 from 3 to 4 +move 2 from 5 to 8 +move 4 from 8 to 4 +move 3 from 6 to 8 +move 18 from 1 to 5 +move 1 from 3 to 4 +move 3 from 2 to 4 +move 5 from 9 to 1 +move 10 from 7 to 5 +move 5 from 1 to 3 +move 5 from 3 to 5 +move 5 from 4 to 3 +move 2 from 4 to 2 +move 5 from 8 to 3 +move 25 from 5 to 2 +move 3 from 3 to 6 +move 1 from 1 to 3 +move 3 from 6 to 7 +move 1 from 4 to 2 +move 1 from 5 to 8 +move 2 from 4 to 9 +move 1 from 8 to 1 +move 20 from 2 to 7 +move 10 from 7 to 1 +move 1 from 1 to 7 +move 4 from 7 to 8 +move 5 from 5 to 4 +move 4 from 8 to 6 +move 1 from 1 to 3 +move 5 from 7 to 4 +move 2 from 1 to 5 +move 4 from 9 to 1 +move 3 from 2 to 5 +move 5 from 5 to 1 +move 1 from 9 to 1 +move 11 from 1 to 3 +move 1 from 6 to 2 +move 7 from 3 to 5 +move 11 from 3 to 7 +move 1 from 2 to 6 +move 7 from 7 to 8 +move 1 from 9 to 1 +move 2 from 3 to 1 +move 1 from 5 to 3 +move 4 from 1 to 6 +move 4 from 6 to 3 +move 9 from 4 to 5 +move 2 from 8 to 2 +move 4 from 6 to 9 +move 3 from 2 to 4 +move 1 from 8 to 6 diff --git a/day5/src/main.rs b/day5/src/main.rs index e7a11a9..93879ce 100644 --- a/day5/src/main.rs +++ b/day5/src/main.rs @@ -1,3 +1,99 @@ -fn main() { - println!("Hello, world!"); +use std::{fs::read_to_string, str::Lines}; + +use color_eyre::Result; +use itertools::Itertools; + +fn parse_stacks(input: &mut Lines) -> Vec> { + let horizontal_stack = input + .map(|line| { + line.chars() + .skip(1) + .step_by(4) + .map(|c| if c.is_whitespace() { None } else { Some(c) }) + .collect::>() + }) + .take_while(|line| line.first().unwrap_or(&None) != &Some('1')) + .collect::>(); + let num_stacks = horizontal_stack.last().map(|v| v.len()).unwrap_or(0); + let mut vertical_stack: Vec> = Vec::with_capacity(num_stacks); + for _ in 0..num_stacks { + vertical_stack.push(vec![]); + } + + for v in horizontal_stack.iter().rev() { + for (i, c) in v.iter().enumerate() { + if let Some(ch) = c { + vertical_stack[i].push(*ch); + } + } + } + vertical_stack +} + +#[derive(Debug, Clone, Copy)] +struct Move { + pub amount: usize, + pub from: usize, + pub to: usize, +} + +impl Move { + fn play9000(&self, stacks: &mut [Vec]) { + for _ in 0..self.amount { + if let Some(element) = stacks[self.from].pop() { + stacks[self.to].push(element); + } + } + } + + fn play9001(&self, stacks: &mut [Vec]) { + let i = stacks[self.from].len() - self.amount; + let mut moving = stacks[self.from].split_off(i); + stacks[self.to].append(&mut moving); + } +} + +fn parse_move(line: &str) -> Move { + let (amount, from, to) = line + .split_whitespace() + .skip(1) + .step_by(2) + .map(|s| s.parse::().unwrap_or(0)) + .take(3) + .collect_tuple() + .unwrap_or((0, 0, 0)); + Move { + amount, + from: from - 1, + to: to - 1, + } +} + +fn main() -> Result<()> { + let input = read_to_string("input.txt")?; + let mut lines = input.lines(); + let mut stacks9000 = parse_stacks(&mut lines); + let mut stacks9001 = stacks9000.clone(); + let moves = lines.skip(1).map(parse_move); + for m in moves { + m.play9000(&mut stacks9000); + m.play9001(&mut stacks9001); + } + let top9000 = stacks9000 + .iter() + .map(|stack| stack.last().unwrap_or(&' ')) + .fold(String::new(), |mut s, v| { + s.push(*v); + s + }); + let top9001 = stacks9001 + .iter() + .map(|stack| stack.last().unwrap_or(&' ')) + .fold(String::new(), |mut s, v| { + s.push(*v); + s + }); + println!("top crates 9000: {top9000}"); + println!("top crates 9001: {top9001}"); + Ok(()) }