From c05ab694ab951e744ba5c88753b403ab39478cd5 Mon Sep 17 00:00:00 2001 From: Dylan Thies Date: Thu, 28 Dec 2023 20:26:01 -0500 Subject: [PATCH] done with 2023 --- 2023/Cargo.lock | 240 ++++++++++++++++++++++++++++++++++----- 2023/day-25/Cargo.toml | 14 +++ 2023/day-25/src/lib.rs | 4 + 2023/day-25/src/main.rs | 12 ++ 2023/day-25/src/part1.rs | 92 +++++++++++++++ 2023/day-25/src/part2.rs | 19 ++++ 6 files changed, 354 insertions(+), 27 deletions(-) create mode 100644 2023/day-25/Cargo.toml create mode 100644 2023/day-25/src/lib.rs create mode 100644 2023/day-25/src/main.rs create mode 100644 2023/day-25/src/part1.rs create mode 100644 2023/day-25/src/part2.rs diff --git a/2023/Cargo.lock b/2023/Cargo.lock index 4208dda..ce7ca6b 100644 --- a/2023/Cargo.lock +++ b/2023/Cargo.lock @@ -17,6 +17,19 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +[[package]] +name = "ahash" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a" +dependencies = [ + "cfg-if", + "getrandom", + "once_cell", + "version_check", + "zerocopy", +] + [[package]] name = "aho-corasick" version = "1.1.2" @@ -26,6 +39,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "allocator-api2" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" + [[package]] name = "anyhow" version = "1.0.75" @@ -80,13 +99,44 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "crossbeam-deque" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fca89a0e215bab21874660c67903c5f143333cab1da83d041c7ded6053774751" +dependencies = [ + "cfg-if", + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e3681d554572a651dda4186cd47240627c3d0114d45a95f6ad27f2f22e7548d" +dependencies = [ + "autocfg", + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3a430a770ebd84726f584a90ee7f020d28db52c6d02138900f22341f866d39c" +dependencies = [ + "cfg-if", +] + [[package]] name = "day-1" version = "2023.0.0" dependencies = [ "derive-getters", "error-stack", - "itertools", + "itertools 0.12.0", "log", "nom", ] @@ -96,7 +146,7 @@ name = "day-10" version = "2023.0.0" dependencies = [ "glam", - "itertools", + "itertools 0.12.0", "nom", "nom_locate", "rstest", @@ -107,7 +157,7 @@ name = "day-11" version = "2023.0.0" dependencies = [ "glam", - "itertools", + "itertools 0.12.0", "nom", "nom_locate", ] @@ -116,7 +166,7 @@ dependencies = [ name = "day-12" version = "2023.0.0" dependencies = [ - "itertools", + "itertools 0.12.0", "nom", "rstest", ] @@ -126,7 +176,7 @@ name = "day-13" version = "2023.0.0" dependencies = [ "glam", - "itertools", + "itertools 0.12.0", "nom", "nom_locate", "rstest", @@ -137,7 +187,7 @@ name = "day-14" version = "2023.0.0" dependencies = [ "glam", - "itertools", + "itertools 0.12.0", "nom", "nom_locate", "rstest", @@ -147,7 +197,7 @@ dependencies = [ name = "day-15" version = "2023.0.0" dependencies = [ - "itertools", + "itertools 0.12.0", "nom", "rstest", ] @@ -157,7 +207,7 @@ name = "day-16" version = "2023.0.0" dependencies = [ "glam", - "itertools", + "itertools 0.12.0", "nom", "nom_locate", ] @@ -167,7 +217,7 @@ name = "day-17" version = "2023.0.0" dependencies = [ "glam", - "itertools", + "itertools 0.12.0", "nom", "nom_locate", "pathfinding", @@ -179,7 +229,7 @@ name = "day-18" version = "2023.0.0" dependencies = [ "glam", - "itertools", + "itertools 0.12.0", "nom", ] @@ -187,7 +237,7 @@ dependencies = [ name = "day-19" version = "2023.0.0" dependencies = [ - "itertools", + "itertools 0.12.0", "nom", ] @@ -195,7 +245,7 @@ dependencies = [ name = "day-2" version = "2023.0.0" dependencies = [ - "itertools", + "itertools 0.12.0", "log", "nom", ] @@ -204,7 +254,7 @@ dependencies = [ name = "day-20" version = "2023.0.0" dependencies = [ - "itertools", + "itertools 0.12.0", "nom", "num", "rstest", @@ -215,7 +265,7 @@ name = "day-21" version = "2023.0.0" dependencies = [ "glam", - "itertools", + "itertools 0.12.0", "nom", "nom_locate", "rstest", @@ -226,7 +276,7 @@ name = "day-22" version = "2023.0.0" dependencies = [ "glam", - "itertools", + "itertools 0.12.0", "nom", ] @@ -235,7 +285,7 @@ name = "day-23" version = "2023.0.0" dependencies = [ "glam", - "itertools", + "itertools 0.12.0", "nom", "nom_locate", "petgraph", @@ -246,16 +296,26 @@ name = "day-24" version = "2023.0.0" dependencies = [ "glam", - "itertools", + "itertools 0.12.0", "nom", "num", ] +[[package]] +name = "day-25" +version = "2023.0.0" +dependencies = [ + "itertools 0.12.0", + "nom", + "petgraph", + "rustworkx-core", +] + [[package]] name = "day-3" version = "2023.0.0" dependencies = [ - "itertools", + "itertools 0.12.0", "log", ] @@ -263,7 +323,7 @@ dependencies = [ name = "day-4" version = "2023.0.0" dependencies = [ - "itertools", + "itertools 0.12.0", "nom", "rstest", "rstest_reuse", @@ -273,7 +333,7 @@ dependencies = [ name = "day-5" version = "2023.0.0" dependencies = [ - "itertools", + "itertools 0.12.0", "nom", ] @@ -281,7 +341,7 @@ dependencies = [ name = "day-6" version = "2023.0.0" dependencies = [ - "itertools", + "itertools 0.12.0", "nom", ] @@ -290,7 +350,7 @@ name = "day-7" version = "2023.0.0" dependencies = [ "dhat", - "itertools", + "itertools 0.12.0", "nom", "num", "num-traits", @@ -300,7 +360,7 @@ dependencies = [ name = "day-8" version = "2023.0.0" dependencies = [ - "itertools", + "itertools 0.12.0", "nom", "rstest", ] @@ -309,7 +369,7 @@ dependencies = [ name = "day-9" version = "2023.0.0" dependencies = [ - "itertools", + "itertools 0.12.0", "nom", "rstest", ] @@ -505,11 +565,32 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + [[package]] name = "hashbrown" version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +dependencies = [ + "ahash", + "allocator-api2", + "rayon", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", +] [[package]] name = "indexmap" @@ -518,7 +599,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" dependencies = [ "equivalent", - "hashbrown", + "hashbrown 0.14.3", + "rayon", ] [[package]] @@ -530,6 +612,15 @@ dependencies = [ "num-traits", ] +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + [[package]] name = "itertools" version = "0.12.0" @@ -747,7 +838,7 @@ checksum = "3ea07a6e677e47d6a84724d4fdf88b1e37fcb49ac94e236d7caeefd8fee75c8a" dependencies = [ "deprecate-until", "fixedbitset", - "indexmap", + "indexmap 2.1.0", "integer-sqrt", "num-traits", "rustc-hash", @@ -761,7 +852,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" dependencies = [ "fixedbitset", - "indexmap", + "indexmap 2.1.0", ] [[package]] @@ -782,6 +873,16 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +[[package]] +name = "priority-queue" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fff39edfcaec0d64e8d0da38564fad195d2d51b680940295fcc307366e101e61" +dependencies = [ + "autocfg", + "indexmap 1.9.3", +] + [[package]] name = "proc-macro2" version = "1.0.70" @@ -830,6 +931,46 @@ dependencies = [ "getrandom", ] +[[package]] +name = "rand_pcg" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59cad018caf63deb318e5a4586d99a24424a364f40f1e5778c29aca23f4fc73e" +dependencies = [ + "rand_core", +] + +[[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-cond" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ac2a28c5317e6d26ac87a8629c0eb362690ed1d739f4040e21cfaafdf04e6f8" +dependencies = [ + "either", + "itertools 0.10.5", + "rayon", +] + +[[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 = "redox_syscall" version = "0.4.1" @@ -936,6 +1077,25 @@ dependencies = [ "semver", ] +[[package]] +name = "rustworkx-core" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72abf7976bc09a30391248b3c6509338b235c02b0e9b0bf8af686c289cad3f45" +dependencies = [ + "ahash", + "fixedbitset", + "hashbrown 0.14.3", + "indexmap 2.1.0", + "num-traits", + "petgraph", + "priority-queue", + "rand", + "rand_pcg", + "rayon", + "rayon-cond", +] + [[package]] name = "ryu" version = "1.0.16" @@ -1064,6 +1224,12 @@ version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -1126,3 +1292,23 @@ name = "windows_x86_64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "zerocopy" +version = "0.7.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] diff --git a/2023/day-25/Cargo.toml b/2023/day-25/Cargo.toml new file mode 100644 index 0000000..35bef18 --- /dev/null +++ b/2023/day-25/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "day-25" +version.workspace = true +edition.workspace = true +authors.workspace = true +repository.workspace = true + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +nom = { workspace = true } +itertools = {workspace = true } +petgraph = "0.6.4" +rustworkx-core = "0.13.2" diff --git a/2023/day-25/src/lib.rs b/2023/day-25/src/lib.rs new file mode 100644 index 0000000..3fafe8d --- /dev/null +++ b/2023/day-25/src/lib.rs @@ -0,0 +1,4 @@ +pub mod part1; +pub use crate::part1::*; +pub mod part2; +pub use crate::part2::*; diff --git a/2023/day-25/src/main.rs b/2023/day-25/src/main.rs new file mode 100644 index 0000000..047376b --- /dev/null +++ b/2023/day-25/src/main.rs @@ -0,0 +1,12 @@ +#![warn(clippy::all, clippy::pedantic)] + +use day_25::part1; +use day_25::part2; + +fn main() { + let input = include_str!("./input.txt"); + let part1_result = part1(input); + println!("part 1: {part1_result}"); + let part2_result = part2(input); + println!("part 2: {part2_result}"); +} diff --git a/2023/day-25/src/part1.rs b/2023/day-25/src/part1.rs new file mode 100644 index 0000000..8de71cc --- /dev/null +++ b/2023/day-25/src/part1.rs @@ -0,0 +1,92 @@ +#![warn(clippy::all, clippy::pedantic)] + +use std::collections::HashMap; + +use itertools::Itertools; +use nom::{ + bytes::complete::tag, + character::complete, + multi::separated_list1, + sequence::{separated_pair, tuple}, + IResult, +}; +use petgraph::prelude::*; +use rustworkx_core::connectivity::stoer_wagner_min_cut; + +/// day 25 part 1 of aoc 2023 +/// +/// # Arguments +/// - input the input for today's puzzle +/// +/// # Panics +/// panics whne it cannot parse the input OR when ever the number of game numbers is greater than +#[must_use] +pub fn part1(input: &str) -> String { + let (_, initial_map) = parse_input(input).expect("AOC should have valid input"); + + let all_node_strings = initial_map + .iter() + .flat_map(|(key, nodes)| { + let mut nodes = nodes.clone(); + nodes.push(key); + nodes + }) + .unique() + .collect::>(); + + let mut graph = UnGraph::<&str, u32>::default(); + let node_map = all_node_strings + .iter() + .map(|&id| (id, graph.add_node(id))) + .collect::>(); + + for (&src_id, dest_nodes) in &initial_map { + for &dest_id in dest_nodes { + graph.add_edge(node_map[src_id], node_map[dest_id], 1); + } + } + let total_nodes = all_node_strings.len(); + let min_cut_res: rustworkx_core::Result)>> = + stoer_wagner_min_cut(&graph, |_| Ok(1)); + let (_mincut, partition) = min_cut_res.unwrap().unwrap(); + let partition_len = partition.len(); + let rest_len = total_nodes - partition_len; + (partition_len * rest_len).to_string() +} + +fn parse_input(input: &str) -> IResult<&str, HashMap<&str, Vec<&str>>> { + let (input, nodes_as_array) = separated_list1( + complete::line_ending, + separated_pair( + complete::alpha1, + tuple((tag(":"), complete::space0)), + separated_list1(complete::space1, complete::alpha1), + ), + )(input)?; + Ok((input, nodes_as_array.into_iter().collect())) +} + +#[cfg(test)] +mod test { + use super::*; + + const INPUT: &str = "jqt: rhn xhk nvd +rsh: frs pzl lsr +xhk: hfx +cmg: qnr nvd lhk bvb +rhn: xhk bvb hfx +bvb: xhk hfx +pzl: lsr hfx nvd +qnr: nvd +ntq: jqt hfx bvb xhk +nvd: lhk +lsr: lhk +rzs: qnr cmg lsr rsh +frs: qnr lhk lsr"; + + #[test] + fn part1_works() { + let result = part1(INPUT); + assert_eq!(result, "54".to_string()); + } +} diff --git a/2023/day-25/src/part2.rs b/2023/day-25/src/part2.rs new file mode 100644 index 0000000..d8e6695 --- /dev/null +++ b/2023/day-25/src/part2.rs @@ -0,0 +1,19 @@ +#![warn(clippy::all, clippy::pedantic)] + +#[must_use] +pub fn part2(_input: &str) -> String { + "Not Finished".to_string() +} + +#[cfg(test)] +mod test { + use super::*; + + const INPUT: &str = ""; + + #[test] + fn part2_works() { + let result = part2(INPUT); + assert_eq!(result, "Not Finished".to_string()); + } +}