diff --git a/day_04/src/lib.rs b/day_04/src/lib.rs index 6f509b2..24f035a 100644 --- a/day_04/src/lib.rs +++ b/day_04/src/lib.rs @@ -10,40 +10,40 @@ use nom::{ #[derive(Debug)] pub struct Card { - winning_set: Vec, - player_set: Vec, + winning_set: Vec, + player_set: Vec, } impl Card { - fn score(&self) -> u32 { + fn score(&self) -> u64 { let count = self.win_count(); if count == 0 { 0 } else { - 2_u32.pow(count as u32 - 1) + 2_u64.pow(count as u64 - 1) } } - fn win_count(&self) -> u32 { - self.player_set.iter().filter(|num| {self.winning_set.contains(num)}).count() as u32 + fn win_count(&self) -> u64 { + self.player_set.iter().filter(|num| {self.winning_set.contains(num)}).count() as u64 } } // Card 1: 41 48 83 86 17 | 83 86 6 31 17 9 48 53 fn parse_line(input: &str) -> IResult<&str, Card> { - let (input, _) = preceded(tag("Card "), preceded(space0, complete::u32))(input)?; - let (input, winning_set) = preceded(tag(": "), preceded(space0, separated_list1(space1, complete::u32)))(input)?; - let (input, player_set) = preceded(tag(" | "), preceded(space0, separated_list1(space1, complete::u32)))(input)?; + let (input, _) = preceded(tag("Card "), preceded(space0, complete::u64))(input)?; + let (input, winning_set) = preceded(tag(": "), preceded(space0, separated_list1(space1, complete::u64)))(input)?; + let (input, player_set) = preceded(tag(" | "), preceded(space0, separated_list1(space1, complete::u64)))(input)?; Ok((input, Card{winning_set, player_set})) } pub fn part1(input: &str) -> String { - input.lines().map(|line| { parse_line(line).unwrap().1.score() }).sum::().to_string() + input.lines().map(|line| { parse_line(line).unwrap().1.score() }).sum::().to_string() } pub fn part2(input: &str) -> String { let num_games = input.lines().count(); - let mut current_cards = (0..num_games).map(|_| {1}).collect::>(); + let mut current_cards = (0..num_games).map(|_| {1}).collect::>(); current_cards.push(0); let mut current_index = 0; let mut cards = input.lines().map(|line| { @@ -58,7 +58,7 @@ pub fn part2(input: &str) -> String { current_cards[i] += number_of_current_card; } } - current_cards.into_iter().sum::().to_string() + current_cards.into_iter().sum::().to_string() } pub mod prelude { diff --git a/day_06/Cargo.lock b/day_06/Cargo.lock new file mode 100644 index 0000000..582d6fa --- /dev/null +++ b/day_06/Cargo.lock @@ -0,0 +1,639 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "aho-corasick" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +dependencies = [ + "memchr", +] + +[[package]] +name = "anes" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi", + "libc", + "winapi", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bumpalo" +version = "3.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" + +[[package]] +name = "cast" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "ciborium" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "effd91f6c78e5a4ace8a5d3c0b6bfaec9e2baaef55f3efc00e45fb2e477ee926" +dependencies = [ + "ciborium-io", + "ciborium-ll", + "serde", +] + +[[package]] +name = "ciborium-io" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdf919175532b369853f5d5e20b26b43112613fd6fe7aee757e35f7a44642656" + +[[package]] +name = "ciborium-ll" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defaa24ecc093c77630e6c15e17c51f5e187bf35ee514f4e2d67baaa96dae22b" +dependencies = [ + "ciborium-io", + "half", +] + +[[package]] +name = "clap" +version = "3.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" +dependencies = [ + "bitflags", + "clap_lex", + "indexmap", + "textwrap", +] + +[[package]] +name = "clap_lex" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" +dependencies = [ + "os_str_bytes", +] + +[[package]] +name = "criterion" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c76e09c1aae2bc52b3d2f29e13c6572553b30c4aa1b8a49fd70de6412654cb" +dependencies = [ + "anes", + "atty", + "cast", + "ciborium", + "clap", + "criterion-plot", + "itertools", + "lazy_static", + "num-traits", + "oorandom", + "plotters", + "rayon", + "regex", + "serde", + "serde_derive", + "serde_json", + "tinytemplate", + "walkdir", +] + +[[package]] +name = "criterion-plot" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" +dependencies = [ + "cast", + "itertools", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" +dependencies = [ + "cfg-if", + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" +dependencies = [ + "autocfg", + "cfg-if", + "crossbeam-utils", + "memoffset", + "scopeguard", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "day_06" +version = "0.1.0" +dependencies = [ + "criterion", + "nom", + "strum", + "strum_macros", +] + +[[package]] +name = "either" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" + +[[package]] +name = "half" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown", +] + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" + +[[package]] +name = "js-sys" +version = "0.3.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca" +dependencies = [ + "wasm-bindgen", +] + +[[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.150" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" + +[[package]] +name = "log" +version = "0.4.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" + +[[package]] +name = "memchr" +version = "2.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" + +[[package]] +name = "memoffset" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" +dependencies = [ + "autocfg", +] + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "num-traits" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +dependencies = [ + "autocfg", +] + +[[package]] +name = "once_cell" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" + +[[package]] +name = "oorandom" +version = "11.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" + +[[package]] +name = "os_str_bytes" +version = "6.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" + +[[package]] +name = "plotters" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2c224ba00d7cadd4d5c660deaf2098e5e80e07846537c51f9cfa4be50c1fd45" +dependencies = [ + "num-traits", + "plotters-backend", + "plotters-svg", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "plotters-backend" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e76628b4d3a7581389a35d5b6e2139607ad7c75b17aed325f210aa91f4a9609" + +[[package]] +name = "plotters-svg" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38f6d39893cca0701371e3c27294f09797214b86f1fb951b89ade8ec04e2abab" +dependencies = [ + "plotters-backend", +] + +[[package]] +name = "proc-macro2" +version = "1.0.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rayon" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "regex" +version = "1.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" + +[[package]] +name = "rustversion" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" + +[[package]] +name = "ryu" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "serde" +version = "1.0.193" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.193" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "strum" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" + +[[package]] +name = "strum_macros" +version = "0.25.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn", +] + +[[package]] +name = "syn" +version = "2.0.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "textwrap" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" + +[[package]] +name = "tinytemplate" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "walkdir" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" + +[[package]] +name = "web-sys" +version = "0.3.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50c24a44ec86bb68fbecd1b3efed7e85ea5621b39b35ef2766b66cd984f8010f" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/day_06/Cargo.toml b/day_06/Cargo.toml new file mode 100644 index 0000000..1bd2b27 --- /dev/null +++ b/day_06/Cargo.toml @@ -0,0 +1,22 @@ +[package] +name = "day_06" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +nom = "7.1.3" +strum = "0.25.0" +strum_macros = "0.25.3" + +[dev-dependencies] +criterion = { version = "0.4", features = ["html_reports"] } + +[[bench]] +name = "part1" +harness = false + +[[bench]] +name = "part2" +harness = false diff --git a/day_06/benches/part1.rs b/day_06/benches/part1.rs new file mode 100644 index 0000000..70a30c1 --- /dev/null +++ b/day_06/benches/part1.rs @@ -0,0 +1,11 @@ +use criterion::{black_box, criterion_group, criterion_main, Criterion}; + +use day_06::prelude::*; + +fn criterion_benchmark(c: &mut Criterion) { + let input = include_str!("../input.txt"); + c.bench_function("part 1", |b| b.iter(|| part1(black_box(input)))); +} + +criterion_group!(benches, criterion_benchmark); +criterion_main!(benches); diff --git a/day_06/benches/part2.rs b/day_06/benches/part2.rs new file mode 100644 index 0000000..3340ce4 --- /dev/null +++ b/day_06/benches/part2.rs @@ -0,0 +1,11 @@ +use criterion::{black_box, criterion_group, criterion_main, Criterion}; + +use day_06::prelude::*; + +fn criterion_benchmark(c: &mut Criterion) { + let input = include_str!("../input.txt"); + c.bench_function("part 2", |b| b.iter(|| part2(black_box(input)))); +} + +criterion_group!(benches, criterion_benchmark); +criterion_main!(benches); diff --git a/day_06/input.txt b/day_06/input.txt new file mode 100644 index 0000000..9de08c1 --- /dev/null +++ b/day_06/input.txt @@ -0,0 +1,2 @@ +Time: 46 82 84 79 +Distance: 347 1522 1406 1471 diff --git a/day_06/src/lib.rs b/day_06/src/lib.rs new file mode 100644 index 0000000..e490712 --- /dev/null +++ b/day_06/src/lib.rs @@ -0,0 +1,64 @@ +use nom::{ + bytes::complete::tag, + character::complete::{ + self, space0, space1, + }, + multi::separated_list1, + sequence::{preceded, tuple}, + IResult, +}; +use std::iter::zip; + +fn parse_races(input: &str) -> IResult<&str, Vec<(u64, u64)>> { + let (input, times) = preceded(tuple((tag("Time:"),space1)), separated_list1(space1, complete::u64))(input)?; + let (input, distances) = preceded(tuple((tag("\nDistance:"),space1)), separated_list1(space1, complete::u64))(input)?; + Ok((input, zip(times, distances).collect())) +} + +fn parse_races_alt(input: &str) -> IResult<&str, (u64, u64)> { + let (input, times) = preceded(tuple((tag("Time:"),space0)), complete::u64)(input)?; + let (input, distances) = preceded(tuple((tag("\nDistance:"),space0)), complete::u64)(input)?; + Ok((input, (times, distances))) +} + +pub fn part1(input: &str) -> String { + let (_, races) = parse_races(input).unwrap(); + races.into_iter().map(|(time, distance)| { + let upper_bound_full = (time as f64 + ((time as f64).powi(2) - 4.0 * distance as f64).sqrt()) / 2.0; + let upper_bound = if upper_bound_full - upper_bound_full.floor() == 0.0 { + upper_bound_full.floor() as u64 - 1 + } else { + upper_bound_full.floor() as u64 + }; + let lower_bound_full = (time as f64 - ((time as f64).powi(2) - 4.0 * distance as f64).sqrt()) / 2.0; + let lower_bound = if lower_bound_full - lower_bound_full.ceil() == 0.0 { + lower_bound_full.ceil() as u64 + 1 + } else { + lower_bound_full.ceil() as u64 + }; + upper_bound - lower_bound + 1 + }).product::().to_string() +} + +pub fn part2(input: &str) -> String { + let (_, (time, distance)) = parse_races_alt(input.replace(" ", "").as_str()).unwrap(); + let upper_bound_full = (time as f64 + ((time as f64).powi(2) - 4.0 * distance as f64).sqrt()) / 2.0; + let upper_bound = if upper_bound_full - upper_bound_full.floor() == 0.0 { + upper_bound_full.floor() as u64 - 1 + } else { + upper_bound_full.floor() as u64 + }; + let lower_bound_full = (time as f64 - ((time as f64).powi(2) - 4.0 * distance as f64).sqrt()) / 2.0; + let lower_bound = if lower_bound_full - lower_bound_full.ceil() == 0.0 { + lower_bound_full.ceil() as u64 + 1 + } else { + lower_bound_full.ceil() as u64 + }; + (upper_bound - lower_bound + 1).to_string() +} + +pub mod prelude { + pub use super::part1; + pub use super::part2; +} + diff --git a/day_06/src/main.rs b/day_06/src/main.rs new file mode 100644 index 0000000..a87e42b --- /dev/null +++ b/day_06/src/main.rs @@ -0,0 +1,27 @@ +use day_06::prelude::*; + +fn main() { + let input = include_str!("../input.txt"); + println!("{}", part1(input)); + println!("{}", part2(input)); +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_part1() { + let test_input = "Time: 7 15 30 +Distance: 9 40 200"; + assert_eq!(part1(test_input), "288".to_string()); + } + + #[test] + fn test_part2() { + let test_input = "Time: 7 15 30 +Distance: 9 40 200"; + assert_eq!(part2(test_input), "71503".to_string()); + } + +} diff --git a/day_07/Cargo.lock b/day_07/Cargo.lock new file mode 100644 index 0000000..8478528 --- /dev/null +++ b/day_07/Cargo.lock @@ -0,0 +1,639 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "aho-corasick" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +dependencies = [ + "memchr", +] + +[[package]] +name = "anes" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi", + "libc", + "winapi", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bumpalo" +version = "3.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" + +[[package]] +name = "cast" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "ciborium" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "effd91f6c78e5a4ace8a5d3c0b6bfaec9e2baaef55f3efc00e45fb2e477ee926" +dependencies = [ + "ciborium-io", + "ciborium-ll", + "serde", +] + +[[package]] +name = "ciborium-io" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdf919175532b369853f5d5e20b26b43112613fd6fe7aee757e35f7a44642656" + +[[package]] +name = "ciborium-ll" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defaa24ecc093c77630e6c15e17c51f5e187bf35ee514f4e2d67baaa96dae22b" +dependencies = [ + "ciborium-io", + "half", +] + +[[package]] +name = "clap" +version = "3.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" +dependencies = [ + "bitflags", + "clap_lex", + "indexmap", + "textwrap", +] + +[[package]] +name = "clap_lex" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" +dependencies = [ + "os_str_bytes", +] + +[[package]] +name = "criterion" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c76e09c1aae2bc52b3d2f29e13c6572553b30c4aa1b8a49fd70de6412654cb" +dependencies = [ + "anes", + "atty", + "cast", + "ciborium", + "clap", + "criterion-plot", + "itertools", + "lazy_static", + "num-traits", + "oorandom", + "plotters", + "rayon", + "regex", + "serde", + "serde_derive", + "serde_json", + "tinytemplate", + "walkdir", +] + +[[package]] +name = "criterion-plot" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" +dependencies = [ + "cast", + "itertools", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" +dependencies = [ + "cfg-if", + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" +dependencies = [ + "autocfg", + "cfg-if", + "crossbeam-utils", + "memoffset", + "scopeguard", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "day_07" +version = "0.1.0" +dependencies = [ + "criterion", + "nom", + "strum", + "strum_macros", +] + +[[package]] +name = "either" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" + +[[package]] +name = "half" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown", +] + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" + +[[package]] +name = "js-sys" +version = "0.3.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca" +dependencies = [ + "wasm-bindgen", +] + +[[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.150" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" + +[[package]] +name = "log" +version = "0.4.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" + +[[package]] +name = "memchr" +version = "2.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" + +[[package]] +name = "memoffset" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" +dependencies = [ + "autocfg", +] + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "num-traits" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +dependencies = [ + "autocfg", +] + +[[package]] +name = "once_cell" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" + +[[package]] +name = "oorandom" +version = "11.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" + +[[package]] +name = "os_str_bytes" +version = "6.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" + +[[package]] +name = "plotters" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2c224ba00d7cadd4d5c660deaf2098e5e80e07846537c51f9cfa4be50c1fd45" +dependencies = [ + "num-traits", + "plotters-backend", + "plotters-svg", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "plotters-backend" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e76628b4d3a7581389a35d5b6e2139607ad7c75b17aed325f210aa91f4a9609" + +[[package]] +name = "plotters-svg" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38f6d39893cca0701371e3c27294f09797214b86f1fb951b89ade8ec04e2abab" +dependencies = [ + "plotters-backend", +] + +[[package]] +name = "proc-macro2" +version = "1.0.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rayon" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "regex" +version = "1.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" + +[[package]] +name = "rustversion" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" + +[[package]] +name = "ryu" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "serde" +version = "1.0.193" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.193" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "strum" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" + +[[package]] +name = "strum_macros" +version = "0.25.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn", +] + +[[package]] +name = "syn" +version = "2.0.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "textwrap" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" + +[[package]] +name = "tinytemplate" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "walkdir" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" + +[[package]] +name = "web-sys" +version = "0.3.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50c24a44ec86bb68fbecd1b3efed7e85ea5621b39b35ef2766b66cd984f8010f" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/day_07/Cargo.toml b/day_07/Cargo.toml new file mode 100644 index 0000000..f7b7e26 --- /dev/null +++ b/day_07/Cargo.toml @@ -0,0 +1,22 @@ +[package] +name = "day_07" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +nom = "7.1.3" +strum = "0.25.0" +strum_macros = "0.25.3" + +[dev-dependencies] +criterion = { version = "0.4", features = ["html_reports"] } + +[[bench]] +name = "part1" +harness = false + +[[bench]] +name = "part2" +harness = false diff --git a/day_07/benches/part1.rs b/day_07/benches/part1.rs new file mode 100644 index 0000000..57927e1 --- /dev/null +++ b/day_07/benches/part1.rs @@ -0,0 +1,11 @@ +use criterion::{black_box, criterion_group, criterion_main, Criterion}; + +use day_07::prelude::*; + +fn criterion_benchmark(c: &mut Criterion) { + let input = include_str!("../input.txt"); + c.bench_function("part 1", |b| b.iter(|| part1(black_box(input)))); +} + +criterion_group!(benches, criterion_benchmark); +criterion_main!(benches); diff --git a/day_07/benches/part2.rs b/day_07/benches/part2.rs new file mode 100644 index 0000000..b5f127f --- /dev/null +++ b/day_07/benches/part2.rs @@ -0,0 +1,11 @@ +use criterion::{black_box, criterion_group, criterion_main, Criterion}; + +use day_07::prelude::*; + +fn criterion_benchmark(c: &mut Criterion) { + let input = include_str!("../input.txt"); + c.bench_function("part 2", |b| b.iter(|| part2(black_box(input)))); +} + +criterion_group!(benches, criterion_benchmark); +criterion_main!(benches); diff --git a/day_07/input.txt b/day_07/input.txt new file mode 100644 index 0000000..fbb248a --- /dev/null +++ b/day_07/input.txt @@ -0,0 +1,1000 @@ +8A7J7 301 +QAAT7 677 +J3K4K 622 +KJJ62 577 +49AAA 298 +45585 855 +33KKK 115 +4Q777 438 +7KK77 836 +5T55T 397 +85855 56 +Q6Q38 157 +AA8AA 85 +32J33 293 +KKQQA 247 +888J4 944 +2AJ2K 482 +33777 338 +KT434 696 +K3K63 648 +86866 136 +93983 584 +57857 489 +5JJ2Q 76 +82335 133 +J25T4 559 +9TQ2A 211 +596J6 926 +ATAAA 513 +6KKKQ 277 +AAA22 554 +J2265 332 +8Q3QQ 486 +6735A 28 +Q5555 595 +J9888 262 +5QQQ2 626 +J7777 953 +643TA 572 +8579Q 99 +23294 683 +55J54 501 +9JK93 567 +64388 941 +3J8T5 40 +29K29 422 +JQ4K2 401 +AA6A3 78 +2KK44 821 +9AA2A 884 +43434 386 +J7A67 177 +4JKKT 956 +AA999 296 +2A2T9 519 +9T9KT 342 +Q5J5A 19 +QJK7A 925 +AA9AA 337 +4T2QT 751 +77888 324 +343QT 914 +33229 576 +J5Q5Q 169 +22952 620 +J4444 17 +T9JTT 172 +48888 729 +28522 138 +66363 302 +68TTJ 778 +5Q885 66 +24KJ3 229 +5A68K 731 +A79A7 906 +QQQAQ 698 +J34AJ 109 +TTTTJ 503 +3J528 183 +5A5AA 598 +5AAAA 782 +TT77J 968 +24Q62 178 +T6K7A 811 +99788 53 +494K6 560 +7JQ87 327 +Q9QQQ 597 +496Q2 392 +2252K 995 +Q85TA 2 +KT66Q 165 +383T6 509 +9997Q 724 +4TT4T 368 +35TQA 707 +33534 24 +KKKJ4 469 +A9TAA 830 +A445A 481 +3Q63Q 192 +AATAT 680 +2225J 436 +Q4869 471 +A4JA4 330 +5K35T 545 +TK3A4 877 +8K62J 596 +9Q7T8 582 +898KK 813 +5AJJA 504 +T5TKQ 289 +6T88Q 359 +A8AAJ 526 +393J3 817 +Q2Q22 212 +Q8Q22 89 +265T8 757 +Q2584 807 +T33TT 853 +T22TA 391 +46999 61 +9AA9J 57 +6T538 674 +3T253 271 +63TAJ 395 +34943 323 +6QQQQ 497 +TA75K 938 +4T467 141 +36AQK 197 +884A4 228 +77277 453 +AQ854 50 +Q56QJ 456 +T4TKT 319 +K63Q4 30 +79793 110 +AJKQ6 421 +22278 996 +222TT 357 +42J74 647 +Q4QAT 634 +66574 951 +2KK22 446 +Q65Q3 533 +77887 267 +58533 719 +287K9 51 +Q5656 199 +564AQ 106 +QJ579 77 +9732T 46 +JAK23 808 +688K8 364 +A993A 651 +Q9QQ9 93 +74777 929 +QT722 723 +76QAQ 621 +8K836 573 +77557 783 +A5555 65 +TTT6T 643 +83595 933 +J3J97 734 +JTTA3 87 +TTAQA 282 +A555A 765 +4TQTT 538 +T777Q 763 +T82J9 63 +83359 213 +AQQAQ 363 +47AT9 311 +96A9T 310 +K5TK5 450 +ATKK8 429 +7K777 541 +5TJAK 987 +KAQ73 687 +TTATA 874 +J4TJ2 857 +666KK 204 +AA777 990 +J98A8 946 +7A95A 288 +3K2K3 820 +79K42 112 +A65KT 300 +596T8 266 +J5664 585 +75585 964 +73AT2 491 +2J2KT 375 +6888T 480 +A5765 992 +KK555 224 +AT2TA 514 +TTTTQ 753 +Q4348 273 +KK66K 887 +44JQ9 67 +Q339Q 341 +833Q8 574 +K456T 766 +J98KK 209 +K4644 328 +43935 79 +8848K 380 +K22A2 834 +8654Q 703 +4K2AT 96 +K276J 863 +8K64J 320 +AAA7A 571 +72747 950 +4A4Q9 120 +66636 814 +33637 881 +KK2AK 895 +J8677 851 +A48A8 430 +56656 866 +55355 976 +66J77 370 +3353J 896 +56556 237 +3KJ5Q 270 +J22J2 261 +AJ2AA 163 +JJJJJ 517 +48A28 819 +K4443 799 +TJTJ5 345 +T3K9J 868 +49AJ9 605 +45455 741 +KJJKK 754 +63333 789 +76677 989 +AJ774 264 +JKJ2A 531 +TQQQT 809 +Q6KJ6 411 +KQK7Q 704 +2A4Q5 410 +68KK8 652 +8K938 194 +72J22 242 +9J672 43 +7Q6Q5 903 +64666 95 +J2372 798 +A263T 781 +JK598 909 +55J92 625 +A2567 343 +4A7A7 174 +8KA3J 68 +JQTQ3 528 +74444 127 +QA5AT 306 +T9K7T 254 +75TT7 166 +83388 325 +888Q8 982 +8Q7A6 84 +2K7JA 663 +T9959 937 +3KA87 921 +4KJ92 786 +28A83 442 +99T8J 699 +TKKKK 457 +25552 431 +TTATK 862 +QJQKK 664 +QJQQ9 552 +T4J77 206 +Q7777 352 +QJ747 534 +9K9KK 656 +44646 479 +5T64Q 455 +QQQQK 475 +73478 827 +Q3J33 975 +Q655Q 930 +7T7T7 231 +53A72 409 +3333A 833 +29928 787 +97J58 307 +T2555 673 +Q44A5 382 +J5A57 144 +7J447 131 +8KK99 600 +99555 349 +43682 205 +63259 518 +AA3A8 591 +J444J 58 +52J23 772 +5KK3K 660 +5KT2K 329 +54K6K 252 +49J24 864 +673Q5 780 +TT848 333 +227A5 424 +JT9J5 675 +7K9QJ 825 +732Q7 461 +24343 859 +TJ333 604 +T33AJ 149 +KJ5KK 129 +54555 249 +25222 3 +TQJA3 38 +7Q7Q7 460 +999J4 557 +J6766 831 +K4KKK 185 +363K3 566 +K888J 885 +55855 488 +97979 565 +2597T 493 +77456 233 +Q9Q5Q 202 +99K23 98 +63763 7 +TQ498 849 +74626 590 +K44KK 73 +9AA97 498 +Q6696 706 +95555 697 +69969 670 +JQ294 203 +24246 425 +6QJ6A 16 +AQAAA 916 +6K6JK 313 +9AK99 41 +4T6J5 219 +6Q6T6 549 +96999 983 +79977 522 +57Q8A 732 +AQ6AQ 156 +284Q6 351 +K88KJ 123 +57A8A 606 +4J97Q 592 +5JTQ3 369 +A467T 742 +2878J 669 +KKAJ6 668 +T5TTT 570 +8AA88 665 +3238A 428 +67286 979 +88585 997 +T6866 132 +88T83 912 +68888 832 +A95TK 371 +T8Q33 167 +333K8 286 +KK888 722 +7TAK7 281 +A7J77 216 +9T85Q 969 +54444 918 +77822 151 +9KJ2T 759 +Q8483 536 +9JJA9 788 +J8Q8T 272 +27KJQ 958 +76666 671 +5T932 182 +887T4 628 +6499T 607 +447Q4 718 +9736J 716 +AQJAQ 611 +T4933 690 +3TJAJ 923 +K7722 412 +77737 22 +775AQ 812 +5QKQ5 362 +448T8 114 +A7A7A 502 +4Q466 583 +74744 749 +7363J 939 +88388 59 +Q3KQT 861 +42222 794 +96669 294 +54959 378 +TTTTA 544 +796JA 867 +92KK9 238 +9TJT9 848 +8A2A2 309 +687K3 515 +KTKKT 610 +J8659 210 +22K4K 423 +586Q9 55 +AAA7K 599 +33J73 198 +K74KJ 936 +55JJ5 943 +Q6QJQ 801 +5435J 137 +QJ5QQ 553 +AAA78 485 +67676 404 +34K33 376 +8Q32J 326 +A66KA 649 +52K8Q 179 +A32A2 561 +JTQJQ 645 +59KK7 11 +6763Q 189 +KKK88 426 +8KTJ8 681 +2222T 767 +KK5J7 372 +QQQ57 942 +7A72J 904 +2222J 467 +7KQQQ 186 +J3993 629 +73437 952 +8A37T 771 +966J9 752 +4KT29 710 +82378 840 +4QT72 785 +3629T 934 +JTK77 977 +KKQ33 915 +4242A 744 +TQA9A 215 +A6666 854 +23333 170 +TTT9T 587 +J3377 34 +6JJ66 835 +A3AAA 897 +96936 427 +8JJJ4 686 +32332 173 +QJ868 640 +67388 111 +88988 613 +4TJTT 435 +T988T 702 +K59K5 894 +Q8Q88 688 +5Q847 347 +9J599 154 +958K6 462 +AAQQA 959 +JKJKQ 846 +7992T 72 +9899A 510 +22Q22 389 +939J7 971 +J4K4A 367 +TT7TQ 816 +KKKT3 297 +97KK6 793 +7QQQ7 824 +ATQQA 102 +J597K 797 +78J88 473 +87A87 42 +828A7 527 +K8777 107 +8963J 949 +29399 998 +3TKA8 190 +3TQ66 889 +JJ5T5 985 +J566T 568 +T38K2 815 +2J5KA 646 +A8J32 184 +622Q6 777 +TK7QT 26 +47766 790 +2J5Q6 932 +9K969 878 +82235 64 +3A3JK 152 +49494 540 +7JJJ7 350 +39233 437 +5466Q 239 +Q3QQQ 961 +A8J5Q 623 +Q3333 739 +4T396 90 +25T2J 284 +TK7T3 9 +5555K 993 +J2666 383 +22292 250 +J5T95 478 +22T29 226 +24242 126 +99939 121 +73373 414 +78Q92 738 +A5362 826 +3KK2J 756 +77877 291 +T9TT9 879 +3JJTT 145 +3T363 524 +6Q6QQ 619 +Q2QQQ 8 +8J58J 967 +65KJK 398 +KTA2T 464 +T7JJJ 922 +44888 948 +2KJ2K 755 +63858 353 +49K4T 483 +5833J 180 +62822 105 +99JK9 635 +QAJAA 962 +977T5 691 +655KK 274 +9966A 393 +55J5T 303 +284K5 589 +27636 872 +K29KK 774 +K9JJ4 792 +6JKTT 108 +TK8TJ 745 +T3A7K 400 +9J3TQ 901 +ATJKK 917 +666A5 448 +A5AT6 588 +6T4J6 822 +Q9A9A 260 +594J3 241 +Q3A34 279 +A9999 220 +7AQQ9 49 +737Q3 999 +JQQ8Q 882 +78977 399 +53333 689 +2K2JQ 25 +34848 800 +2585T 334 +5T799 908 +69864 644 +659TK 278 +J4363 633 +T9J97 101 +QJ94T 615 +363J6 373 +J777J 379 +99J93 966 +TT26T 312 +TA8T8 870 +3J535 245 +86A63 283 +2KTK2 508 +Q9Q2Q 162 +59QJT 667 +6JJKQ 71 +55J25 200 +89993 980 +45474 581 +Q4394 159 +45697 346 +KK99Q 496 +J3J53 466 +3QQ3Q 348 +7843J 612 +T733K 164 +42589 818 +Q9K36 232 +QQ22Q 762 +5AA3J 287 +48KKK 449 +7QQQJ 248 +K5KJA 616 +KQ387 965 +Q4898 12 +A3T9Q 227 +K7KTT 269 +JTJ22 768 +85K88 875 +6T666 624 +97K7Q 586 +7854J 804 +T4TTT 609 +8T44T 415 +3T3KK 601 +5AAAJ 258 +8555K 828 +4Q8JQ 593 +JT823 396 +J9K96 838 +55565 632 +7J77T 713 +36353 578 +5Q962 529 +5KQ9T 181 +82697 627 +66654 88 +7747J 919 +A3AAJ 441 +569KJ 805 +TTQJ5 445 +444T4 661 +29959 37 +62J26 955 +Q4JT5 214 +KQA4T 44 +24424 758 +2Q4AK 222 +729A4 195 +4Q35T 928 +329T8 551 +6T5T5 33 +T25Q9 978 +9Q9J9 407 +A4KT7 911 +27397 603 +4244Q 490 +JA255 384 +2AAJ2 876 +6222K 125 +AA46A 360 +J4343 672 +JAJQ9 880 +888J2 468 +Q5K9J 268 +A85Q9 387 +J4A35 705 +66A64 97 +QAQQ8 700 +55TJ4 31 +88J58 650 +693AK 679 +259K2 806 +9998J 176 +6822T 235 +9J699 913 +7QQQQ 602 +T7T4T 317 +6226T 725 +JJ9J9 316 +55575 761 +A6A66 796 +K9T29 764 +33334 608 +KKK7K 893 +99988 579 +J8JJJ 259 +4AJ89 390 +9QQ84 14 +9KJ3K 580 +77736 433 +KK22K 555 +755J2 940 +4JA9A 492 +9Q555 484 +6J687 542 +99K53 910 +6236J 36 +9J999 54 +6663J 454 +85JJK 122 +966J3 171 +QJ2KK 747 +KJA2A 676 +788J5 858 +78833 218 +6KJ6J 308 +T75AT 318 +7JQ36 728 +AJ8TA 354 +96KTQ 899 +52993 402 +9K5AJ 898 +Q7JQJ 748 +5Q5QQ 48 +A5858 148 +85888 988 +2TJ82 556 +9AJK4 843 +TJ26Q 406 +2296K 356 +22K22 18 +KJ6KQ 253 +T444T 117 +6T257 715 +AA444 113 +39737 693 +877QQ 521 +TK454 735 +38QA8 562 +KT4A4 984 +JKKKK 920 +666J6 452 +8JAJT 280 +A62QJ 945 +868TT 243 +KQ66K 511 +J3J33 512 +T9K9K 160 +66TT3 537 +J3T48 234 +44999 158 +9876A 666 +JJ73Q 546 +85A3Q 20 +3333K 750 +6AJ73 381 +Q3Q58 637 +69644 654 +J6669 641 +8K2KK 733 +33535 447 +32K56 153 +TA94Q 994 +7979A 543 +Q663Q 432 +KQJ7Q 516 +66K65 6 +484T4 991 +88387 15 +96229 21 +7AK62 499 +88KK7 618 +3K344 69 +6A6KK 569 +22J24 784 +QKT53 837 +7K2KK 1 +87T95 810 +2228Q 82 +Q66AQ 548 +J6Q66 366 +5J42Q 465 +8QQJ8 246 +JAAKJ 630 +5TT99 408 +5T7Q6 779 +768A7 631 +22262 201 +664AA 104 +A96A6 128 +T666K 5 +3984K 684 +3335K 208 +79A77 891 +K7K76 285 +AQ8A6 678 +36535 130 +JT443 760 +477T9 547 +48A33 532 +AA66A 321 +56666 776 +3AQKJ 888 +K6Q68 83 +2J727 902 +3TT33 339 +85Q6T 714 +QT333 717 +7T74T 335 +J3A85 974 +8J888 617 +K974K 802 +8777Q 947 +A9Q6K 175 +77757 75 +7JA22 458 +3K499 791 +98TTJ 256 +5555J 505 +QTQQJ 70 +T232T 506 +Q9999 907 +J4A88 74 +A4K58 191 +K3888 263 +2QJ22 23 +3368Q 155 +QKKKQ 743 +JK222 139 +KQ84Q 905 +T25T2 91 +Q9TJJ 844 +QQ8Q8 720 +335KK 355 +29T76 963 +39AQ6 292 +27222 276 +88JJ8 388 +52A22 134 +7A95Q 86 +7TTTA 314 +9642K 187 +A33A3 416 +6Q66Q 92 +93A23 403 +77722 523 +33J34 196 +J8333 639 +K8TJ5 736 +222AA 116 +JT3TT 970 +87A65 225 +82555 459 +22JT2 255 +Q2223 972 +K63JA 143 +8AQ86 653 +JJ3J9 614 +3A77A 365 +KK9KT 47 +5T959 385 +7JKQ4 477 +497T3 711 +34A33 770 +57557 869 +777KJ 193 +KKK5Q 892 +9Q299 230 +34J83 795 +3KTTQ 692 +66696 695 +57472 960 +77J26 841 +TAT2T 685 +33969 662 +9Q393 295 +QKQ88 142 +TTT98 32 +25555 374 +265QK 924 +JAAJA 440 +9999K 257 +346KT 500 +JJ299 535 +QJ4KA 135 +7A422 305 +A2T85 773 +4T69J 52 +73Q8A 463 +KK6KK 420 +8Q7QJ 251 +QQK3K 168 +66644 150 +44424 444 +84T53 299 +AKAAK 240 +6A952 35 +Q5875 217 +22888 829 +38589 642 +94848 417 +32222 727 +966Q9 27 +JQ9QT 336 +52K2T 886 +J7787 721 +AAQ3A 147 +6K823 957 +6668Q 839 +AAA88 39 +KJ33K 4 +J5J5J 419 +2A7T9 275 +4A777 470 +7KK7K 377 +99992 418 +93TA8 865 +95T34 709 +K34JA 322 +94674 658 +AJAA7 45 +JQ22A 304 +K83Q2 13 +A6923 439 +98977 331 +689J6 769 +99953 931 +QQQJQ 94 +J5AA5 871 +TJTJT 413 +ATA28 530 +6T66T 564 +KAKKK 873 +T43QQ 657 +TTTT2 563 +9898J 118 +QQQQ8 659 +99997 236 +88826 188 +6KKK5 394 +2QQJ2 495 +8T864 900 +888K8 655 +28KQ4 361 +33732 472 +AA2A7 845 +TTT7T 726 +68A84 852 +3KKKK 161 +343Q2 358 +75792 476 +AAAJA 550 +KK9A9 558 +72569 737 +4AT33 708 +KKKQ9 119 +8JJJ6 315 +78A77 850 +JJQJ7 140 +3A5A5 740 +78278 344 +Q4Q44 103 +44JA4 146 +74T95 636 +2A2AT 507 +TK5Q5 474 +7T982 712 +AJ378 1000 +75858 494 +AAA99 746 +72T94 981 +TT77T 803 +393K3 124 +T8T95 265 +AJA66 244 +AA4TA 207 +44777 638 +68QT2 973 +9K628 340 +7595K 443 +9A949 682 +KJKTT 954 +23T26 100 +5KJ5T 434 +66626 81 +K33K3 856 +J7555 525 +JQJJ5 60 +868J6 935 +22299 823 +J4445 539 +9KKK7 890 +JAA48 80 +755Q5 520 +4JQQJ 223 +997T9 405 +8A888 575 +K369T 730 +A5565 847 +39JQ4 29 +QQQJJ 694 +86789 860 +333J3 10 +9A94A 221 +J99JT 62 +87888 701 +AA6A2 290 +T5QK4 775 +35354 927 +323Q3 451 +25TA5 883 +2954J 487 +376J6 594 +2K975 842 +AAAA6 986 diff --git a/day_07/src/lib.rs b/day_07/src/lib.rs new file mode 100644 index 0000000..df8057a --- /dev/null +++ b/day_07/src/lib.rs @@ -0,0 +1,171 @@ +use nom::{ + bytes::complete::take, + character::complete::{ + self, space1, + }, + sequence::preceded, + IResult, +}; +use std::collections::HashMap; + +// 393J3 50208020002 836 +// 3TJAJ 50209001200 837 + +fn is_five_of_a_kind(card: &str, match_numbers: Vec) -> bool { + if match_numbers.iter().any(|x| {x==&5}) { + true + } else if match_numbers.iter().any(|x| {x==&4}) && card.matches("J").count() == 1 { + true + } else if match_numbers.iter().any(|x| {x==&3}) && card.matches("J").count() == 2 { + true + } else if match_numbers.iter().any(|x| {x==&2}) && card.matches("J").count() == 3 { + true + } else if match_numbers.iter().any(|x| {x==&1}) && card.matches("J").count() == 4 { + true + } else if card.matches("J").count() == 5 { + true + } else { + false + } +} + +fn is_four_of_a_kind(card: &str, match_numbers: Vec) -> bool { + if match_numbers.iter().any(|x| {x==&4}) { + true + } else if match_numbers.iter().any(|x| {x==&3}) && card.matches("J").count() == 1 { + true + } else if match_numbers.iter().any(|x| {x==&2}) && card.matches("J").count() == 2 { + true + } else if card.matches("J").count() == 3 { + true + } else { + false + } +} + +fn is_full_house(card: &str, match_numbers: Vec) -> bool { + if match_numbers.iter().filter(|x| x > &&0).count() == 2 && match_numbers.iter().sum::() == 5 { + true + } else if match_numbers.iter().filter(|x| x == &&2).count() == 2 && card.matches("J").count() == 1 { + true + } else { + false + } +} + +fn is_three_of_a_kind(card: &str, match_numbers: Vec) -> bool { + if match_numbers.iter().any(|x| {x==&3}) { + true + } else if match_numbers.iter().any(|x| {x==&2}) && card.matches("J").count() == 1 { + true + } else if card.matches("J").count() == 2 { + true + } else { + false + } +} + +fn is_two_pair(_card: &str, match_numbers: Vec) -> bool { + if match_numbers.iter().filter(|x| x == &&2).count() == 2 { + true + } else { + false + } +} + +fn is_pair(card: &str, match_numbers: Vec) -> bool { + if match_numbers.iter().any(|x| {x==&2}) { + true + } else if card.matches("J").count() == 1 { + true + } else { + false + } +} + +fn score_card_pt2(card: &str) -> u64 { + let values = HashMap::from( + [('2', 1),('3', 2),('4', 3),('5', 4),('6', 5),('7', 6),('8', 7),('9', 8),('T', 9),('J', 0),('Q', 10),('K', 11),('A', 12)] + ); + let values_without_joker = HashMap::from( + [('2', 1),('3', 2),('4', 3),('5', 4),('6', 5),('7', 6),('8', 7),('9', 8),('T', 9),('Q', 10),('K', 11),('A', 12)] + ); + let sub_score = card.chars().enumerate().fold(0, |acc, (i, character)| { + acc + values.get(&character).unwrap() * 10_u64.pow(8 - 2*i as u32) + }); + let match_numbers = values_without_joker.keys().map(|value| { card.matches(*value).count() }).collect::>(); + + if is_five_of_a_kind(card, match_numbers.clone()) { + 6 * 10_u64.pow(10) + sub_score + } else if is_four_of_a_kind(card, match_numbers.clone()) { + 5 * 10_u64.pow(10) + sub_score + } else if is_full_house(card, match_numbers.clone()) { + 4 * 10_u64.pow(10) + sub_score + } else if is_three_of_a_kind(card, match_numbers.clone()) { + 3 * 10_u64.pow(10) + sub_score + } else if is_two_pair(card, match_numbers.clone()) { + 2 * 10_u64.pow(10) + sub_score + } else if is_pair(card, match_numbers.clone()) { + 1 * 10_u64.pow(10) + sub_score + } else { + sub_score + } +} + +fn score_card(card: &str) -> u64 { + let values = HashMap::from( + [('2', 0),('3', 1),('4', 2),('5', 3),('6', 4),('7', 5),('8', 6),('9', 7),('T', 8),('J', 9),('Q', 10),('K', 11),('A', 12)] + ); + let sub_score = card.chars().enumerate().fold(0, |acc, (i, character)| { + acc + values.get(&character).unwrap() * 10_u64.pow(8 - 2*i as u32) + }); + let match_numbers = values.keys().map(|value| { card.matches(*value).count() }); + if match_numbers.clone().any(|x| {x==5}) { + 6 * 10_u64.pow(10) + sub_score + } else if match_numbers.clone().any(|x| {x==4}) { + 5 * 10_u64.pow(10) + sub_score + } else if match_numbers.clone().filter(|x| x > &0).count() == 2 && match_numbers.clone().sum::() == 5 { + 4 * 10_u64.pow(10) + sub_score + } else if match_numbers.clone().any(|x| {x==3}) { + 3 * 10_u64.pow(10) + sub_score + } else if match_numbers.clone().filter(|x| x > &0).count() == 3 { + 2 * 10_u64.pow(10) + sub_score + } else if match_numbers.clone().any(|x| {x==2}) { + 1 * 10_u64.pow(10) + sub_score + } else { + sub_score + } +} + +fn parse_card(input: &str) -> IResult<&str, (&str, u64)> { + let (input, card) = take(5 as usize)(input)?; + let (input, bid) = preceded(space1, complete::u64)(input)?; + Ok((input, (card, bid))) +} + +pub fn part1(input: &str) -> String { + let mut scored_hands = input.lines().map(|line| { + let (_, (card, bid)) = parse_card(line).unwrap(); + let score = score_card(card); + (card, score, bid) + }).collect::>(); + scored_hands.sort_by_key(|x| {x.1}); + scored_hands.into_iter().enumerate().map(|(i, (_, _, bid))| { (i as u64 + 1) * bid }).sum::().to_string() +} + +pub fn part2(input: &str) -> String { + let mut scored_hands = input.lines().map(|line| { + let (_, (card, bid)) = parse_card(line).unwrap(); + let score = score_card_pt2(card); + (card, score, bid) + }).collect::>(); + scored_hands.sort_by_key(|x| {x.1}); + scored_hands.iter().enumerate().for_each(|(i, (card, score, _))| {println!("{} {} {}", card, score, i);}); + scored_hands.into_iter().enumerate().map(|(i, (_, _, bid))| { (i as u64 + 1) * bid }).sum::().to_string() +} + +pub mod prelude { + pub use super::part1; + pub use super::part2; +} + diff --git a/day_07/src/main.rs b/day_07/src/main.rs new file mode 100644 index 0000000..97d1783 --- /dev/null +++ b/day_07/src/main.rs @@ -0,0 +1,33 @@ +use day_07::prelude::*; + +fn main() { + let input = include_str!("../input.txt"); + println!("{}", part1(input)); + println!("{}", part2(input)); +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_part1() { + let test_input = "32T3K 765 +T55J5 684 +KK677 28 +KTJJT 220 +QQQJA 483"; + assert_eq!(part1(test_input), "6440".to_string()); + } + + #[test] + fn test_part2() { + let test_input = "32T3K 765 +T55J5 684 +KK677 28 +KTJJT 220 +QQQJA 483"; + assert_eq!(part2(test_input), "5905".to_string()); + } + +} diff --git a/day_08/Cargo.lock b/day_08/Cargo.lock new file mode 100644 index 0000000..630349a --- /dev/null +++ b/day_08/Cargo.lock @@ -0,0 +1,639 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "aho-corasick" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +dependencies = [ + "memchr", +] + +[[package]] +name = "anes" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi", + "libc", + "winapi", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bumpalo" +version = "3.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" + +[[package]] +name = "cast" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "ciborium" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "effd91f6c78e5a4ace8a5d3c0b6bfaec9e2baaef55f3efc00e45fb2e477ee926" +dependencies = [ + "ciborium-io", + "ciborium-ll", + "serde", +] + +[[package]] +name = "ciborium-io" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdf919175532b369853f5d5e20b26b43112613fd6fe7aee757e35f7a44642656" + +[[package]] +name = "ciborium-ll" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defaa24ecc093c77630e6c15e17c51f5e187bf35ee514f4e2d67baaa96dae22b" +dependencies = [ + "ciborium-io", + "half", +] + +[[package]] +name = "clap" +version = "3.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" +dependencies = [ + "bitflags", + "clap_lex", + "indexmap", + "textwrap", +] + +[[package]] +name = "clap_lex" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" +dependencies = [ + "os_str_bytes", +] + +[[package]] +name = "criterion" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c76e09c1aae2bc52b3d2f29e13c6572553b30c4aa1b8a49fd70de6412654cb" +dependencies = [ + "anes", + "atty", + "cast", + "ciborium", + "clap", + "criterion-plot", + "itertools", + "lazy_static", + "num-traits", + "oorandom", + "plotters", + "rayon", + "regex", + "serde", + "serde_derive", + "serde_json", + "tinytemplate", + "walkdir", +] + +[[package]] +name = "criterion-plot" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" +dependencies = [ + "cast", + "itertools", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" +dependencies = [ + "cfg-if", + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" +dependencies = [ + "autocfg", + "cfg-if", + "crossbeam-utils", + "memoffset", + "scopeguard", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "day_08" +version = "0.1.0" +dependencies = [ + "criterion", + "nom", + "strum", + "strum_macros", +] + +[[package]] +name = "either" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" + +[[package]] +name = "half" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown", +] + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" + +[[package]] +name = "js-sys" +version = "0.3.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca" +dependencies = [ + "wasm-bindgen", +] + +[[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.150" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" + +[[package]] +name = "log" +version = "0.4.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" + +[[package]] +name = "memchr" +version = "2.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" + +[[package]] +name = "memoffset" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" +dependencies = [ + "autocfg", +] + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "num-traits" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +dependencies = [ + "autocfg", +] + +[[package]] +name = "once_cell" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" + +[[package]] +name = "oorandom" +version = "11.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" + +[[package]] +name = "os_str_bytes" +version = "6.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" + +[[package]] +name = "plotters" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2c224ba00d7cadd4d5c660deaf2098e5e80e07846537c51f9cfa4be50c1fd45" +dependencies = [ + "num-traits", + "plotters-backend", + "plotters-svg", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "plotters-backend" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e76628b4d3a7581389a35d5b6e2139607ad7c75b17aed325f210aa91f4a9609" + +[[package]] +name = "plotters-svg" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38f6d39893cca0701371e3c27294f09797214b86f1fb951b89ade8ec04e2abab" +dependencies = [ + "plotters-backend", +] + +[[package]] +name = "proc-macro2" +version = "1.0.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rayon" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "regex" +version = "1.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" + +[[package]] +name = "rustversion" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" + +[[package]] +name = "ryu" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "serde" +version = "1.0.193" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.193" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "strum" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" + +[[package]] +name = "strum_macros" +version = "0.25.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn", +] + +[[package]] +name = "syn" +version = "2.0.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "textwrap" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" + +[[package]] +name = "tinytemplate" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "walkdir" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" + +[[package]] +name = "web-sys" +version = "0.3.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50c24a44ec86bb68fbecd1b3efed7e85ea5621b39b35ef2766b66cd984f8010f" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/day_08/Cargo.toml b/day_08/Cargo.toml new file mode 100644 index 0000000..93635e3 --- /dev/null +++ b/day_08/Cargo.toml @@ -0,0 +1,22 @@ +[package] +name = "day_08" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +nom = "7.1.3" +strum = "0.25.0" +strum_macros = "0.25.3" + +[dev-dependencies] +criterion = { version = "0.4", features = ["html_reports"] } + +[[bench]] +name = "part1" +harness = false + +[[bench]] +name = "part2" +harness = false diff --git a/day_08/benches/part1.rs b/day_08/benches/part1.rs new file mode 100644 index 0000000..efa9971 --- /dev/null +++ b/day_08/benches/part1.rs @@ -0,0 +1,11 @@ +use criterion::{black_box, criterion_group, criterion_main, Criterion}; + +use day_08::prelude::*; + +fn criterion_benchmark(c: &mut Criterion) { + let input = include_str!("../input.txt"); + c.bench_function("part 1", |b| b.iter(|| part1(black_box(input)))); +} + +criterion_group!(benches, criterion_benchmark); +criterion_main!(benches); diff --git a/day_08/benches/part2.rs b/day_08/benches/part2.rs new file mode 100644 index 0000000..4ba5c6b --- /dev/null +++ b/day_08/benches/part2.rs @@ -0,0 +1,11 @@ +use criterion::{black_box, criterion_group, criterion_main, Criterion}; + +use day_08::prelude::*; + +fn criterion_benchmark(c: &mut Criterion) { + let input = include_str!("../input.txt"); + c.bench_function("part 2", |b| b.iter(|| part2(black_box(input)))); +} + +criterion_group!(benches, criterion_benchmark); +criterion_main!(benches); diff --git a/day_08/input.txt b/day_08/input.txt new file mode 100644 index 0000000..7b57beb --- /dev/null +++ b/day_08/input.txt @@ -0,0 +1,752 @@ +LRRLLRLRRRLRRRLRRLRRRLRRLRRRLRRLRRRLRLRRRLRRRLRRRLRLRRLRRRLRRRLRRLRRLRRLRLLLRRRLRRRLRLRLRRLLRRRLRRLRRRLRLRRLRRRLRRRLLRLRLLRRRLRRRLLRRRLRRRLRRRLRRLRRRLLLRRRLRLLLRLRLRLLRLRLLLRRLRRLLRRLRRRLRRLRRLRLRRLLRRLRLRRLLLRRRLLRRRLLRLRLLRRRLRLLRRLRLRRLRLRRRLLRRRLLRRLRLRRLRRLLRLRLRRRLRLRRRR + +GLJ = (QQV, JTL) +JSJ = (DKN, GQN) +MGD = (BPL, LQC) +VSK = (SPH, DDH) +TSB = (MKP, TKX) +HPD = (GKG, XMX) +BLZ = (HGN, KRR) +BMQ = (JXC, HFC) +GDG = (BVJ, NBL) +LST = (PVJ, DPR) +QQQ = (RLV, SNJ) +TMV = (XGV, KCL) +NPZ = (JRD, NHL) +DDH = (NDR, XPN) +SFQ = (TKD, SQH) +RNK = (TJN, NFX) +FRS = (SCJ, FDV) +RST = (BSQ, MHQ) +DSM = (FRX, DMN) +GBN = (VBL, XRK) +GLH = (KNN, PKP) +JRD = (LDP, RNH) +SPV = (JNR, FRK) +PMD = (FXP, BKL) +MDV = (MGD, FHM) +MGG = (KMN, QPL) +FNX = (FKG, NLT) +FPH = (QXS, PBR) +DKP = (QFT, QQQ) +XVH = (PVP, GBJ) +SSP = (BHD, KRM) +JVR = (RHB, LDJ) +HCX = (RNK, LGT) +LRX = (SFN, GXD) +DXN = (NQX, KNL) +GNT = (GHV, DKG) +QVF = (NJN, FSN) +QHQ = (FXN, PNP) +CHX = (DHN, BQB) +GQD = (TLQ, XXG) +RMF = (RVF, KKR) +JHN = (NRG, RCC) +MBG = (XPV, MSB) +XJN = (SQT, XXJ) +JNR = (VTP, XSF) +NXD = (DKP, MKJ) +LSS = (KHS, BSV) +SQH = (BLH, VCG) +TLM = (DCG, BQL) +HTG = (TLF, KRB) +GGM = (KLV, PTG) +PVJ = (BHR, TRH) +PRP = (QLC, JPQ) +CVC = (KVJ, FTM) +RMH = (RPD, FFK) +MRL = (KFK, LJK) +VMG = (LSX, FPH) +DKQ = (XSM, CXK) +QBD = (BGB, GPS) +RFV = (QCG, NJD) +FDN = (QFL, DXN) +RMV = (NCJ, PMZ) +BCJ = (MDD, TMG) +BMB = (GLH, MKK) +DLQ = (JKX, VGS) +NBL = (GFQ, PRQ) +NVG = (SCS, JTS) +CBX = (MXQ, QSM) +HFJ = (NXX, VRX) +FMQ = (KDV, HFJ) +DSK = (BND, GFJ) +TRM = (MMX, BTG) +XKS = (GXD, SFN) +LDJ = (TFQ, CJK) +LFP = (TFS, LST) +PQS = (PJR, SMD) +MTA = (JPD, MVX) +FMM = (GPC, BVB) +NJD = (JMG, DPL) +VQJ = (KRM, BHD) +PXP = (BPB, JJK) +JDM = (HHQ, JXD) +BJK = (SRN, DRL) +MRS = (RPT, SQF) +RCC = (DRD, SPP) +XPG = (XRK, VBL) +JLR = (LJQ, XDP) +KLV = (SKX, SKX) +JBB = (LRB, RRT) +NDP = (KMS, DDJ) +XML = (TPD, VKQ) +TPM = (PKJ, PGR) +DGQ = (JFK, TMB) +XTL = (MPK, CTL) +VSH = (BNH, HJR) +PVG = (SPV, KCS) +CCQ = (LQB, VTK) +PLS = (HPS, CVC) +GMQ = (CTG, QHQ) +PNP = (VSK, JCV) +JPD = (KKV, FQP) +PRL = (KRB, TLF) +NMT = (HXL, NHV) +DLP = (KXR, BXQ) +NFG = (DSR, HNX) +BPB = (BTM, MGR) +JPL = (NMT, QMD) +HJG = (XJD, HHX) +BBK = (VVF, SBN) +GQL = (XNX, CKR) +BND = (SQB, KFG) +VRF = (JKS, LGG) +PXG = (QMD, NMT) +FKG = (GBS, JLR) +NCJ = (NFG, CQH) +CVM = (LFD, NPZ) +GQN = (SMM, PQH) +LJQ = (LXQ, KVG) +PFK = (HHQ, JXD) +KLQ = (JNB, DKQ) +QRP = (SCB, HCM) +LRB = (RMD, KLN) +XPP = (GMK, LKL) +LFD = (NHL, JRD) +TVK = (TMV, TJF) +MQD = (HTG, PRL) +MKJ = (QQQ, QFT) +QLF = (CHX, XSR) +MPP = (XMK, QFP) +HQQ = (PCS, PDC) +NXX = (BTN, KBJ) +JBQ = (GGH, FJL) +BGB = (JSF, MNP) +BRD = (VMF, NTR) +HCM = (RHX, KJG) +NKP = (GHV, DKG) +XJK = (TRS, DGQ) +GPS = (MNP, JSF) +NCM = (VMJ, CSC) +LSX = (PBR, QXS) +VLF = (MTL, GVK) +XFT = (XGS, CRL) +HLR = (FMM, QLH) +FFR = (XXX, BGX) +MRB = (XJD, HHX) +TVS = (MTL, GVK) +KNL = (KDN, HQQ) +PNV = (SQF, RPT) +HVB = (BBB, LLG) +RGX = (RLK, MSX) +MKB = (HNP, NGM) +FKL = (XMK, QFP) +LXQ = (GNB, TQH) +CQF = (NGF, NQF) +BSV = (KFX, HNH) +SVQ = (PXP, XQM) +BHD = (XVH, GDN) +QQB = (PCB, PCB) +DCG = (GRH, RGX) +RRT = (KLN, RMD) +KDN = (PDC, PCS) +RHJ = (VTK, LQB) +LVR = (VSH, QGS) +NHT = (LQS, DMB) +PBR = (TCF, JCC) +GBJ = (MLT, XNB) +BJB = (XPR, MBG) +PQH = (MCH, LMB) +MPM = (BSV, KHS) +SGB = (TKF, PMD) +XQM = (JJK, BPB) +TLQ = (FGM, CRC) +FXP = (BCJ, TDR) +VDG = (VMJ, CSC) +XGV = (LHS, LTS) +JKP = (PXG, JPL) +KFQ = (TSB, RNB) +NHL = (LDP, RNH) +TRS = (JFK, TMB) +PMM = (RHC, KMQ) +QMB = (PPJ, CNG) +MKH = (DDJ, KMS) +NCG = (XXX, BGX) +DBG = (SND, HMN) +GVK = (TQD, JHN) +KKM = (KKL, PBT) +HLP = (JPQ, QLC) +GPH = (JKG, DKK) +XQP = (GLH, MKK) +HRF = (BGB, GPS) +BXQ = (BDH, GQT) +NDR = (KKM, LRR) +HQR = (RGL, RMX) +PCS = (DTB, LDS) +LQB = (GMQ, HRQ) +KKR = (KTV, CMB) +NGM = (KFQ, BQJ) +KLN = (XFT, JRL) +HRR = (RHJ, CCQ) +XSF = (CKX, PLS) +BTG = (GDG, JDS) +PBT = (NVG, DVP) +CPP = (VSH, QGS) +MLN = (VGS, JKX) +JRF = (SKN, RMF) +KHS = (KFX, HNH) +DDP = (QJG, XKJ) +FGM = (TVK, TNS) +QJH = (XSL, QXP) +TNX = (NBV, KLQ) +JVC = (FBR, PFT) +XPV = (TLM, PPK) +PCK = (KBG, TGJ) +HRS = (VKM, JVF) +DKK = (NHT, ZZZ) +TJN = (KTL, QLF) +THT = (JJQ, LRJ) +JNB = (CXK, XSM) +CRL = (VXT, TBG) +RVF = (CMB, KTV) +GQT = (PBB, CVM) +QGF = (MGT, SKV) +SCJ = (CQF, KRQ) +SCM = (DPB, PMM) +KNN = (XLQ, VPB) +PPK = (BQL, DCG) +LPP = (HJG, MRB) +RRM = (RXT, PBZ) +DCT = (FTF, HVB) +PQP = (PBQ, HVR) +NTV = (SCM, GKN) +XXX = (LSS, MPM) +BKP = (LXL, LXL) +BLH = (QLV, SFJ) +SPH = (NDR, XPN) +CVF = (KDV, HFJ) +XDK = (RHJ, CCQ) +NQQ = (NTT, FVL) +TQF = (XCV, NDX) +VRX = (BTN, KBJ) +KFX = (XLN, FDN) +DMN = (TPT, JRQ) +VVF = (TPQ, CDH) +XPN = (LRR, KKM) +LQC = (TMX, LHQ) +XXT = (TLR, DDP) +PBB = (LFD, LFD) +GKF = (CHM, XTL) +SNJ = (NSR, KVD) +FKS = (PPL, PSM) +BJZ = (MVX, JPD) +JSF = (GQD, GQP) +BFM = (QXR, MVF) +QSD = (JHV, JKP) +XSR = (DHN, BQB) +SVM = (PKJ, PGR) +XXJ = (HGF, MPG) +KRB = (QMB, VNX) +XJD = (SFQ, SGF) +HGN = (KBF, LXS) +TKF = (FXP, BKL) +KHB = (TPJ, CGD) +JFK = (JJX, DMH) +PMT = (HGC, HJQ) +NBV = (DKQ, JNB) +FMN = (BJB, HSV) +HPS = (KVJ, KVJ) +GLT = (LXL, NFN) +PSM = (PMT, CKP) +RSM = (JRF, PDB) +KVD = (PFK, JDM) +CSQ = (HJG, MRB) +PKJ = (HDR, TJQ) +LRJ = (JSJ, BFS) +KFG = (KKT, CQR) +TPD = (THT, KBB) +KBB = (LRJ, JJQ) +XGS = (VXT, TBG) +RHX = (XJK, QND) +QPL = (DDN, STH) +BQB = (XJC, SBH) +KCL = (LHS, LTS) +XPH = (KXR, BXQ) +QNA = (NHL, JRD) +KVJ = (KHJ, KHJ) +QJP = (RNK, LGT) +QFL = (KNL, NQX) +KFP = (HLR, LCV) +QLV = (PMX, BJK) +TLR = (QJG, XKJ) +NLQ = (XML, BDS) +JXD = (MQD, GBH) +LXP = (HRR, XDK) +DJS = (GLJ, RNF) +FLS = (FMB, MRL) +HXL = (BXS, FDM) +NQX = (KDN, HQQ) +PGR = (TJQ, HDR) +CGD = (DGS, VKN) +KRQ = (NQF, NGF) +JSB = (PNQ, DHV) +MBJ = (JCK, QRP) +MXQ = (DRG, DSM) +HMN = (CBP, CPG) +JTL = (RST, SPD) +DKG = (GQK, XMQ) +NJN = (TVS, VLF) +LTS = (JCB, TQF) +XNP = (JVF, VKM) +RTG = (XXJ, SQT) +KNT = (LRB, RRT) +SFL = (LXP, CDN) +GXD = (MMT, CNX) +SMC = (XTL, CHM) +JCB = (XCV, NDX) +DQT = (RBJ, QGF) +TFR = (MKH, NDP) +HTP = (CSQ, LPP) +JKM = (VVK, SHX) +LGG = (RPH, NTV) +NSR = (JDM, PFK) +QFT = (SNJ, RLV) +SQF = (GRG, RSX) +SFD = (FFK, RPD) +SCD = (SNC, LGQ) +CXK = (VDN, SQM) +LDP = (NLQ, DGV) +CDN = (XDK, HRR) +HFC = (QBD, HRF) +LGT = (NFX, TJN) +VKM = (QJP, HCX) +HGF = (SCD, TKT) +VGS = (SGB, VXD) +MGL = (FTN, LBF) +FDM = (DLQ, MLN) +FTP = (HJL, JQG) +TCN = (MRL, FMB) +NGR = (QPL, KMN) +NDX = (DMX, LTG) +GVJ = (JDG, PCK) +MVF = (KVR, TQK) +MXJ = (FPQ, VBV) +RNH = (DGV, NLQ) +RPD = (RFV, PGG) +JKG = (NHT, NHT) +XNX = (JDB, DQT) +DRL = (GCM, DSK) +TCF = (TCJ, SVQ) +LCL = (NJN, FSN) +MJM = (QSM, MXQ) +JJK = (BTM, MGR) +SPX = (JDG, PCK) +QLC = (DHJ, PVG) +GPC = (XKC, RTT) +TJQ = (XPG, GBN) +HSV = (XPR, MBG) +JKS = (RPH, NTV) +XDP = (KVG, LXQ) +JDS = (NBL, BVJ) +TQK = (NCR, HTP) +BLX = (TFS, LST) +KRR = (LXS, KBF) +XMQ = (KHB, MMC) +KBG = (DBG, MQR) +LRR = (KKL, PBT) +LFV = (HVQ, MNJ) +HGD = (MNL, PDJ) +GLB = (NDP, MKH) +CMB = (VDG, NCM) +TKD = (VCG, BLH) +BQJ = (TSB, RNB) +QBT = (MKB, RKM) +GJQ = (BTG, MMX) +SGF = (TKD, SQH) +RMD = (JRL, XFT) +DDJ = (HRS, XNP) +HNP = (KFQ, BQJ) +FQF = (MNJ, HVQ) +PJT = (FRQ, KFP) +RKM = (NGM, HNP) +VBV = (LVR, CPP) +RBJ = (SKV, MGT) +MPG = (SCD, TKT) +BHR = (BRM, FJC) +VTP = (CKX, PLS) +PBQ = (RQC, HGD) +RMX = (FTP, NGJ) +SMP = (KRR, HGN) +KBF = (RMK, BMQ) +LSL = (JSB, VPL) +KRM = (GDN, XVH) +DHJ = (SPV, KCS) +XNB = (QFH, PGQ) +TGJ = (DBG, MQR) +LHQ = (FNX, KFF) +GCM = (GFJ, BND) +MJQ = (BBK, KVM) +NQF = (SSP, VQJ) +VPL = (DHV, PNQ) +HHX = (SFQ, SGF) +FJL = (MGL, XKH) +HNH = (FDN, XLN) +RLK = (LCL, QVF) +SND = (CPG, CBP) +CNG = (DJS, HVS) +VDN = (QBK, MXJ) +BRM = (SMC, GKF) +VTK = (HRQ, GMQ) +MVX = (KKV, FQP) +TDR = (TMG, MDD) +SQT = (HGF, MPG) +TMN = (HVB, FTF) +GNB = (BFT, QXK) +QXP = (MJM, CBX) +GQK = (MMC, KHB) +QGX = (NDB, QSD) +TMX = (FNX, KFF) +BLD = (NBV, KLQ) +RHC = (NXK, PJT) +XJC = (QKG, QKG) +GBH = (HTG, PRL) +TPT = (TRQ, XXT) +FTF = (BBB, LLG) +QJG = (FKS, PQG) +FVR = (LXP, CDN) +XCA = (FVR, SFL) +VMJ = (KHP, MDV) +NTT = (LFP, BLX) +DMB = (TCN, FLS) +CQR = (LRX, XKS) +JFR = (TMN, DCT) +TRQ = (DDP, TLR) +BXS = (MLN, DLQ) +LLG = (LSK, XMD) +CBP = (RHF, BRD) +PFT = (SMP, BLZ) +TNS = (TMV, TJF) +DHV = (VFX, VVR) +PPL = (CKP, PMT) +QND = (DGQ, TRS) +VBL = (MGG, NGR) +FHM = (BPL, LQC) +KKT = (LRX, XKS) +LHS = (JCB, TQF) +LXL = (LJH, LJH) +BLT = (GGH, FJL) +JQG = (XCT, FRS) +KCS = (JNR, FRK) +SKX = (JKG, JKG) +VKN = (NMS, QBT) +DSL = (FMN, PJN) +TPJ = (VKN, DGS) +CKR = (JDB, DQT) +LKL = (QLQ, NXD) +SMM = (LMB, MCH) +FSN = (TVS, VLF) +KMS = (XNP, HRS) +MTX = (LGG, JKS) +CHM = (CTL, MPK) +HRQ = (QHQ, CTG) +QCG = (JMG, DPL) +TQH = (QXK, BFT) +JXC = (QBD, HRF) +JVF = (QJP, HCX) +TJF = (KCL, XGV) +XDS = (QQB, QQB) +KJG = (QND, XJK) +CTG = (FXN, PNP) +BBB = (LSK, XMD) +DMH = (NHF, JKM) +BGX = (LSS, MPM) +RHF = (VMF, NTR) +KHJ = (JPD, MVX) +SCS = (FNJ, RSM) +VFX = (LXV, XPP) +XLQ = (RMH, SFD) +HDB = (HVR, PBQ) +PTG = (SKX, GPH) +NTR = (LDG, LKV) +KKL = (NVG, DVP) +XKH = (FTN, LBF) +BDS = (TPD, VKQ) +QKG = (FBR, FBR) +LDS = (HQR, BJC) +KKV = (MPP, FKL) +JRQ = (TRQ, XXT) +MNP = (GQP, GQD) +BTM = (GJQ, TRM) +RPH = (GKN, SCM) +TQD = (RCC, NRG) +FQP = (FKL, MPP) +VFV = (QQB, HPB) +XSL = (CBX, MJM) +GKN = (DPB, PMM) +PBK = (QBH, GQL) +HPB = (PCB, RRM) +MCH = (RTG, XJN) +KSL = (FVL, NTT) +TCJ = (PXP, XQM) +RNF = (JTL, QQV) +BXA = (NFG, CQH) +KVK = (PRP, HLP) +NGF = (SSP, VQJ) +PJN = (BJB, HSV) +SFJ = (BJK, PMX) +CPL = (LDJ, RHB) +MKP = (TRJ, BFM) +RPT = (GRG, RSX) +PRQ = (XPH, DLP) +DSR = (KNT, JBB) +VPB = (RMH, SFD) +QLQ = (MKJ, DKP) +FNJ = (PDB, JRF) +SBH = (QKG, JVC) +PDC = (LDS, DTB) +QFP = (MJQ, HFK) +CTL = (RDD, KVK) +LXS = (BMQ, RMK) +VKF = (QBH, GQL) +HJL = (XCT, FRS) +KTK = (LDF, HPD) +RMK = (HFC, JXC) +MGT = (JFR, HXB) +XLN = (QFL, DXN) +FRQ = (HLR, LCV) +FMB = (KFK, LJK) +NFX = (KTL, QLF) +LMB = (RTG, XJN) +JDG = (TGJ, KBG) +MNJ = (GVJ, SPX) +VMF = (LDG, LKV) +SRN = (GCM, DSK) +JCC = (SVQ, TCJ) +NGJ = (HJL, JQG) +XCT = (SCJ, FDV) +FFK = (RFV, PGG) +NFN = (LJH, RMV) +GHV = (GQK, XMQ) +HFK = (KVM, BBK) +MNL = (GLB, TFR) +BPL = (LHQ, TMX) +LJH = (NCJ, NCJ) +FDV = (CQF, KRQ) +PBZ = (SFL, FVR) +MSB = (PPK, TLM) +GGH = (XKH, MGL) +MPK = (KVK, RDD) +VVR = (XPP, LXV) +NMS = (MKB, RKM) +NXK = (FRQ, KFP) +BSQ = (JCS, MBJ) +XMX = (DSL, CTX) +NHF = (VVK, SHX) +MMC = (CGD, TPJ) +GQP = (TLQ, XXG) +TRH = (FJC, BRM) +RLV = (NSR, KVD) +DKN = (PQH, SMM) +MSX = (LCL, QVF) +SKN = (KKR, RVF) +LSK = (PNV, MRS) +RDD = (PRP, HLP) +DRD = (JBQ, BLT) +GBS = (XDP, LJQ) +TFQ = (BLD, TNX) +QGS = (BNH, HJR) +LJK = (CVF, FMQ) +NCR = (CSQ, LPP) +HJQ = (SVM, TPM) +JCS = (QRP, JCK) +KTV = (VDG, NCM) +MMX = (GDG, JDS) +HVS = (GLJ, RNF) +XMD = (PNV, MRS) +VVK = (XDS, VFV) +FBR = (SMP, SMP) +XKJ = (PQG, FKS) +AAA = (LQS, DMB) +LCV = (FMM, QLH) +PPJ = (HVS, DJS) +DGS = (QBT, NMS) +PFG = (LDF, HPD) +HVR = (RQC, HGD) +QXK = (BMB, XQP) +BTN = (GHD, JXP) +DPR = (TRH, BHR) +KVG = (GNB, TQH) +GFJ = (KFG, SQB) +JCK = (SCB, HCM) +QSM = (DRG, DSM) +XPR = (XPV, MSB) +RNB = (TKX, MKP) +RHB = (TFQ, CJK) +PGQ = (VRF, MTX) +CDH = (GNT, NKP) +BVJ = (PRQ, GFQ) +LTG = (QGX, LVL) +XJR = (QXP, XSL) +JCV = (SPH, DDH) +GDN = (PVP, GBJ) +HNX = (KNT, JBB) +SFN = (MMT, CNX) +RGL = (FTP, NGJ) +VCA = (KRR, HGN) +ZZZ = (DMB, LQS) +GMK = (QLQ, NXD) +LKV = (VMG, SDQ) +PMZ = (CQH, NFG) +KBJ = (GHD, JXP) +PNQ = (VFX, VVR) +TPQ = (GNT, NKP) +SPD = (MHQ, BSQ) +XCV = (DMX, LTG) +BVB = (XKC, RTT) +BQL = (RGX, GRH) +JTS = (RSM, FNJ) +SPP = (BLT, JBQ) +VXT = (CPL, JVR) +MTL = (JHN, TQD) +KMN = (DDN, STH) +RQC = (PDJ, MNL) +FTM = (KHJ, BJZ) +RXT = (FVR, SFL) +QXR = (KVR, TQK) +HJR = (QJH, XJR) +BFS = (GQN, DKN) +TKX = (BFM, TRJ) +DGV = (BDS, XML) +DRG = (FRX, DMN) +VNX = (CNG, PPJ) +CSC = (MDV, KHP) +KMQ = (PJT, NXK) +DVP = (SCS, JTS) +LDF = (XMX, GKG) +QFH = (MTX, VRF) +RTT = (PQS, GBD) +KXR = (BDH, BDH) +SMD = (GHT, GGM) +TMB = (DMH, JJX) +KHP = (FHM, MGD) +TLF = (QMB, VNX) +FRK = (VTP, XSF) +KTL = (CHX, XSR) +GRH = (RLK, MSX) +QMD = (NHV, HXL) +KDV = (VRX, NXX) +LGQ = (VKF, PBK) +FVL = (BLX, LFP) +MMT = (NQQ, KSL) +CKP = (HJQ, HGC) +STH = (BKP, GLT) +QBK = (FPQ, VBV) +CTX = (FMN, PJN) +HHQ = (GBH, MQD) +JHV = (PXG, JPL) +FJC = (GKF, SMC) +TMG = (PFG, KTK) +XXG = (CRC, FGM) +BDH = (PBB, PBB) +FPQ = (CPP, LVR) +BKL = (BCJ, TDR) +GKG = (DSL, CTX) +LVL = (NDB, QSD) +BNH = (QJH, XJR) +TBG = (JVR, CPL) +CQH = (HNX, DSR) +VXD = (TKF, PMD) +MGR = (TRM, GJQ) +PDJ = (GLB, TFR) +HXB = (DCT, TMN) +XSM = (SQM, VDN) +HDR = (XPG, GBN) +GFQ = (XPH, DLP) +XKC = (PQS, GBD) +SBN = (TPQ, CDH) +RSX = (LFV, FQF) +PVP = (XNB, MLT) +LDG = (VMG, SDQ) +LXV = (LKL, GMK) +TKT = (SNC, LGQ) +SHX = (XDS, VFV) +GRG = (FQF, LFV) +QQV = (RST, SPD) +CNX = (NQQ, KSL) +DMX = (LVL, QGX) +CRC = (TVK, TNS) +JXP = (FFR, NCG) +BJC = (RGL, RMX) +BFT = (XQP, BMB) +SKV = (JFR, HXB) +JDB = (QGF, RBJ) +XRK = (NGR, MGG) +FXN = (JCV, VSK) +JJQ = (JSJ, BFS) +DDN = (BKP, GLT) +QBH = (XNX, CKR) +MLT = (PGQ, QFH) +SNC = (VKF, PBK) +FTN = (HDB, PQP) +DPL = (LSL, FXH) +TFS = (DPR, PVJ) +HVQ = (SPX, GVJ) +JJX = (NHF, JKM) +KVR = (HTP, NCR) +MQR = (SND, HMN) +MDD = (PFG, KTK) +PCB = (RXT, RXT) +NLT = (GBS, JLR) +GBD = (SMD, PJR) +NHV = (BXS, FDM) +GHT = (KLV, PTG) +SDQ = (LSX, FPH) +TRJ = (QXR, MVF) +HGC = (TPM, SVM) +MHQ = (JCS, MBJ) +CKX = (HPS, HPS) +SQM = (MXJ, QBK) +PQG = (PPL, PSM) +JRL = (CRL, XGS) +NRG = (DRD, SPP) +GHD = (NCG, FFR) +LBF = (PQP, HDB) +MKK = (KNN, PKP) +CPG = (RHF, BRD) +SQB = (KKT, CQR) +VKQ = (THT, KBB) +KFK = (FMQ, CVF) +PJR = (GHT, GGM) +FXH = (JSB, VPL) +JPQ = (PVG, DHJ) +PDB = (SKN, RMF) +JKX = (VXD, SGB) +DTB = (HQR, BJC) +VCG = (QLV, SFJ) +KVM = (SBN, VVF) +QXS = (TCF, JCC) +CJK = (BLD, TNX) +PKP = (VPB, XLQ) +JMG = (LSL, FXH) +FRX = (JRQ, TPT) +KFF = (FKG, NLT) +DPB = (RHC, KMQ) +SCB = (KJG, RHX) +DHN = (XJC, SBH) +QLH = (GPC, BVB) +PMX = (DRL, SRN) +XMK = (HFK, MJQ) +NDB = (JHV, JKP) +LQS = (TCN, FLS) +PGG = (NJD, QCG) diff --git a/day_08/src/lib.rs b/day_08/src/lib.rs new file mode 100644 index 0000000..ae11bfd --- /dev/null +++ b/day_08/src/lib.rs @@ -0,0 +1,72 @@ +use nom::{ + bytes::complete::{take_until, take, tag}, + character::complete::{ + newline, multispace1, alphanumeric1, + }, + sequence::{preceded, separated_pair}, + multi::separated_list1, + IResult, +}; +use std::collections::HashMap; +use std::str::Chars; + +fn parse_mapline(input: &str) -> IResult<&str, (&str, (&str, &str))> { + let (input, start) = take(3 as usize)(input)?; + let (input, (left, right)) = preceded(tag(" = ("), separated_pair(alphanumeric1, tag(", "), alphanumeric1))(input)?; + Ok((input, (start, (left, right)))) +} + +pub fn part1(input: &str) -> String { + let mut lines = input.lines(); + let instructions = lines.next().unwrap().chars(); + let map = lines.skip(1).map(|line| { + parse_mapline(line).unwrap().1 + }).collect::>(); + let mut total_steps = 0; + let mut position = "AAA"; + for _ in 0..100 { + for instruction in instructions.clone() { + total_steps += 1; + let (left, right) = map.get(position).unwrap(); + if instruction == 'L' { + position = left; + } else { + position = right; + } + if position == "ZZZ" { return total_steps.to_string(); }; + } + }; + total_steps.to_string() +} + +pub fn part2(input: &str) -> String { + let mut lines = input.lines(); + let instructions = lines.next().unwrap().chars(); + let map = lines.skip(1).map(|line| { + parse_mapline(line).unwrap().1 + }).collect::>(); + let start_nodes = map.keys().into_iter().filter(|x| x.chars().last().unwrap() == 'A').collect::>(); + let mut total_steps = 0; + let mut positions = start_nodes; + for _ in 0..10000000 { + for instruction in instructions.clone() { + total_steps += 1; + for i in 0..positions.len() { + let (left, right) = map.get(positions[i]).unwrap(); + if instruction == 'L' { + positions[i] = &left; + } else { + positions[i] = &right; + } + } + if positions.iter().all(|x| {x.chars().last().unwrap() == 'Z'}) { return total_steps.to_string(); }; + } + }; + total_steps.to_string() +} + +pub mod prelude { + pub use super::part1; + pub use super::part2; +} + diff --git a/day_08/src/main.rs b/day_08/src/main.rs new file mode 100644 index 0000000..7798316 --- /dev/null +++ b/day_08/src/main.rs @@ -0,0 +1,48 @@ +use day_08::prelude::*; + +fn main() { + let input = include_str!("../input.txt"); + println!("{}", part1(input)); + println!("{}", part2(input)); +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_part1() { + let test_input = "RL + +AAA = (BBB, CCC) +BBB = (DDD, EEE) +CCC = (ZZZ, GGG) +DDD = (DDD, DDD) +EEE = (EEE, EEE) +GGG = (GGG, GGG) +ZZZ = (ZZZ, ZZZ)"; + assert_eq!(part1(test_input), "2".to_string()); + let new_test_input = "LLR + +AAA = (BBB, BBB) +BBB = (AAA, ZZZ) +ZZZ = (ZZZ, ZZZ)"; + assert_eq!(part1(new_test_input), "6".to_string()); + } + + #[test] + fn test_part2() { + let test_input = "LR + +11A = (11B, XXX) +11B = (XXX, 11Z) +11Z = (11B, XXX) +22A = (22B, XXX) +22B = (22C, 22C) +22C = (22Z, 22Z) +22Z = (22B, 22B) +XXX = (XXX, XXX)"; + assert_eq!(part2(test_input), "6".to_string()); + } + +}