From f849def32ae62adaacfe1a393d78763ac5d707e1 Mon Sep 17 00:00:00 2001 From: Dylan Thies Date: Tue, 12 Dec 2023 00:20:26 -0500 Subject: [PATCH] day 10 part 1 done --- .gitignore | 50 ++++++ 2023/Cargo.lock | 324 +++++++++++++++++++++++++++++++++++++++ 2023/Cargo.toml | 7 + 2023/day-10/Cargo.toml | 17 ++ 2023/day-10/src/lib.rs | 4 + 2023/day-10/src/main.rs | 12 ++ 2023/day-10/src/part1.rs | 257 +++++++++++++++++++++++++++++++ 2023/day-10/src/part2.rs | 20 +++ 8 files changed, 691 insertions(+) create mode 100644 .gitignore create mode 100644 2023/day-10/Cargo.toml create mode 100644 2023/day-10/src/lib.rs create mode 100644 2023/day-10/src/main.rs create mode 100644 2023/day-10/src/part1.rs create mode 100644 2023/day-10/src/part2.rs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3badaa1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,50 @@ +# Generated by Cargo +# will have compiled files and executables +debug/ +target/ + +# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries +# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html +#Cargo.lock + +# These are backup files generated by rustfmt +**/*.rs.bk + +# MSVC Windows builds of rustc generate these, which store debugging information +*.pdb + +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +!.vscode/*.code-snippets + +# Local History for Visual Studio Code +.history/ + +# Built Visual Studio Code Extensions +*.vsix + +# Swap +[._]*.s[a-v][a-z] +!*.svg # comment out if you don't need vector files +[._]*.sw[a-p] +[._]s[a-rt-v][a-z] +[._]ss[a-gi-z] +[._]sw[a-p] + +# Session +Session.vim +Sessionx.vim + +# Temporary +.netrwhist +*~ +# Auto-generated tag files +tags +# Persistent undo +[._]*.un~ +.vscode/settings.json + +input.txt diff --git a/2023/Cargo.lock b/2023/Cargo.lock index d5a82b4..118dbe5 100644 --- a/2023/Cargo.lock +++ b/2023/Cargo.lock @@ -2,6 +2,21 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "addr2line" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + [[package]] name = "aho-corasick" version = "1.1.2" @@ -23,6 +38,42 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "backtrace" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bytecount" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1e5f035d16fc623ae5f74981db80a439803888314e3a555fd6f04acd51a3205" + +[[package]] +name = "cc" +version = "1.0.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +dependencies = [ + "libc", +] + [[package]] name = "cfg-if" version = "1.0.0" @@ -40,6 +91,17 @@ dependencies = [ "nom", ] +[[package]] +name = "day-10" +version = "2023.0.0" +dependencies = [ + "glam", + "itertools", + "nom", + "nom_locate", + "rstest", +] + [[package]] name = "day-2" version = "2023.0.0" @@ -87,6 +149,7 @@ dependencies = [ name = "day-7" version = "2023.0.0" dependencies = [ + "dhat", "itertools", "nom", "num", @@ -122,6 +185,22 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "dhat" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f2aaf837aaf456f6706cb46386ba8dffd4013a757e36f4ea05c20dd46b209a3" +dependencies = [ + "backtrace", + "lazy_static", + "mintex", + "parking_lot", + "rustc-hash", + "serde", + "serde_json", + "thousands", +] + [[package]] name = "either" version = "1.9.0" @@ -244,6 +323,18 @@ dependencies = [ "wasi", ] +[[package]] +name = "gimli" +version = "0.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" + +[[package]] +name = "glam" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5418c17512bdf42730f9032c74e1ae39afc408745ebb2acf72fbc4691c17945" + [[package]] name = "glob" version = "0.3.1" @@ -259,12 +350,34 @@ dependencies = [ "either", ] +[[package]] +name = "itoa" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" + +[[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 = "lock_api" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +dependencies = [ + "autocfg", + "scopeguard", +] + [[package]] name = "log" version = "0.4.20" @@ -283,6 +396,25 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" +[[package]] +name = "miniz_oxide" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +dependencies = [ + "adler", +] + +[[package]] +name = "mintex" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd7c5ba1c3b5a23418d7bbf98c71c3d4946a0125002129231da8d6b723d559cb" +dependencies = [ + "once_cell", + "sys-info", +] + [[package]] name = "nom" version = "7.1.3" @@ -293,6 +425,17 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "nom_locate" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e3c83c053b0713da60c5b8de47fe8e494fe3ece5267b2f23090a07a053ba8f3" +dependencies = [ + "bytecount", + "memchr", + "nom", +] + [[package]] name = "num" version = "0.4.1" @@ -369,6 +512,44 @@ dependencies = [ "autocfg", ] +[[package]] +name = "object" +version = "0.32.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets", +] + [[package]] name = "pin-project-lite" version = "0.2.13" @@ -435,6 +616,15 @@ dependencies = [ "getrandom", ] +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags", +] + [[package]] name = "regex" version = "1.10.2" @@ -511,6 +701,18 @@ dependencies = [ "syn 2.0.39", ] +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + [[package]] name = "rustc_version" version = "0.4.0" @@ -520,12 +722,55 @@ dependencies = [ "semver", ] +[[package]] +name = "ryu" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + [[package]] name = "semver" version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" +[[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 2.0.39", +] + +[[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 = "slab" version = "0.4.9" @@ -535,6 +780,12 @@ dependencies = [ "autocfg", ] +[[package]] +name = "smallvec" +version = "1.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" + [[package]] name = "syn" version = "1.0.109" @@ -557,6 +808,22 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "sys-info" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b3a0d0aba8bf96a0e1ddfdc352fc53b3df7f39318c71854910c3c4b024ae52c" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "thousands" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bf63baf9f5039dadc247375c29eb13706706cfde997d0330d05aa63a77d8820" + [[package]] name = "unicode-ident" version = "1.0.12" @@ -568,3 +835,60 @@ name = "wasi" version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" diff --git a/2023/Cargo.toml b/2023/Cargo.toml index 050ece6..7d806c7 100644 --- a/2023/Cargo.toml +++ b/2023/Cargo.toml @@ -14,5 +14,12 @@ error-stack = "0.4.1" itertools = "0.12.0" log = "0.4.20" nom = "7.1.3" +nom_locate= "4.2.0" rstest = "0.18.2" rstest_reuse = "0.6.0" +dhat = "0.3.2" + + +[profile.dhat] +inherits = "release" +debug = true diff --git a/2023/day-10/Cargo.toml b/2023/day-10/Cargo.toml new file mode 100644 index 0000000..eb82395 --- /dev/null +++ b/2023/day-10/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "day-10" +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 +nom_locate = {workspace = true } +itertools.workspace = true +glam = "0.24.2" + +[dev-dependencies] +rstest = {workspace = true} diff --git a/2023/day-10/src/lib.rs b/2023/day-10/src/lib.rs new file mode 100644 index 0000000..3fafe8d --- /dev/null +++ b/2023/day-10/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-10/src/main.rs b/2023/day-10/src/main.rs new file mode 100644 index 0000000..58a1fe7 --- /dev/null +++ b/2023/day-10/src/main.rs @@ -0,0 +1,12 @@ +#![warn(clippy::all, clippy::pedantic)] + +use day_10::part1; +use day_10::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-10/src/part1.rs b/2023/day-10/src/part1.rs new file mode 100644 index 0000000..119ce0e --- /dev/null +++ b/2023/day-10/src/part1.rs @@ -0,0 +1,257 @@ +#![warn(clippy::all, clippy::pedantic)] + +use std::{collections::HashMap, iter::successors}; + +use glam::IVec2; +use itertools::Itertools; +use nom::{ + branch::alt, + bytes::complete::tag, + character::complete, + multi::{fold_many1, many1}, + sequence::terminated, + IResult, Parser, combinator::eof, +}; +use nom_locate::LocatedSpan; + +type Span<'a> = LocatedSpan<&'a str>; +type SpanIVec2<'a> = LocatedSpan<&'a str, IVec2>; + +#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Copy, Clone)] +enum PipeFrom { + Up, + Down, + Left, + Right, +} +impl PipeFrom { + fn from_ivecs(a: IVec2, b: IVec2) -> Option { + match (a-b).into() { + (0, 1) => Some(Self::Down), + (0, -1) => Some(Self::Up), + (1, 0) => Some(Self::Right), + (-1, 0) => Some(Self::Left), + _ => None, + //value => unimplemented!("this can't be {a:?} - {b:?} = {value:?}"), + } + } + fn to_ivec(self) -> IVec2 { + match self { + PipeFrom::Up => (0,-1).into(), + PipeFrom::Down => (0,1).into(), + PipeFrom::Left => (-1,0).into(), + PipeFrom::Right => (1,0).into(), + } + } +} + +#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Copy, Clone)] +enum PipeType { + // 'S' + Start, + // '-' + Horizontal, + // '|' + Vertical, + // 'F' + DownRight, + // '7' + DownLeft, + // 'L' + UpRight, + // 'J' + UpLeft, + // '.' -this is so we can parse but should be discarded + None, +} + +impl PipeType { + fn get_adjacents(self) -> Vec { + match self { + PipeType::Start => vec![(-1, 0).into(), (0, -1).into(), (0, 1).into(), (1, 0).into()], + PipeType::Horizontal => vec![(1, 0).into(), (-1, 0).into()], + PipeType::Vertical => vec![(0, 1).into(), (0, -1).into()], + PipeType::DownRight => vec![(0, 1).into(), (1, 0).into()], + PipeType::DownLeft => vec![(0, 1).into(), (-1, 0).into()], + PipeType::UpRight => vec![(0, -1).into(), (1, 0).into()], + PipeType::UpLeft => vec![(0, -1).into(), (-1, 0).into()], + PipeType::None => unimplemented!("this should never have been called"), + } + } +} + +#[derive(Debug, Eq, PartialEq)] +struct Pipe { + pub pipe_type: PipeType, + pub position: IVec2, +} + +impl Pipe { + fn get_adjacent(&self ) -> Vec<(IVec2, PipeFrom)> { + self.pipe_type + .get_adjacents() + .into_iter() + .map(|x| x + self.position) + .filter_map(|x| PipeFrom::from_ivecs(self.position , x).map(|y| (x,y) )) + .collect() + } + fn next(&self, from: PipeFrom) -> IVec2 { + use PipeFrom::*; + use PipeType::*; + match (from, self.pipe_type) { + (Up, Vertical) | (Left, DownLeft) | (Right, DownRight) => Down, + (Up, UpLeft) | (Down, DownLeft) | (Right, Horizontal) => Left, + (Up, UpRight) | (Down, DownRight) | (Left, Horizontal) => Right, + (Down, Vertical) | (Left, UpLeft) | (Right, UpRight) => Up, + _ => unimplemented!("no"), + }.to_ivec() + self.position + } +} + +/// day 10 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 +/// usize +#[must_use] +pub fn part1(input: &str) -> String { + let input = Span::new(input); + let (_, grid) = parse_input(input).expect("aoc always parse"); + let start_node = grid + .values() + .find(|x| x.pipe_type == PipeType::Start) + .expect("has a start"); + + (successors( + Some( + start_node + .get_adjacent() + .iter() + .filter_map(|(x, from)| grid.get(x).map(|y|(y,*from))) + .filter(|(x, _)| x.get_adjacent().iter().map(|(y,_)|y).contains(&start_node.position)) + .collect::>() + ), + |front_nodes| { + Some(front_nodes + .iter() + .filter_map(|(pipe, from)| { + grid.get(&pipe.next(*from)).map(|x|(x,PipeFrom::from_ivecs(pipe.position,x.position ).unwrap())) + }) + .collect::>()) + }, + ) + .filter(|x| !x.is_empty()) + .position(|a| a[0].0 == a[1].0) + .unwrap() + +1) + .to_string() + //todo!() +} + +fn with_xy(span: Span) -> SpanIVec2 { + let x = i32::try_from(span.get_column()).expect("overflow") - 1; + let y = i32::try_from(span.location_line()).expect("wrap around") - 1; + span.map_extra(|()| IVec2::new(x, y)) +} + +fn parse_pipe(input: Span) -> IResult { + alt(( + tag("S").map(with_xy).map(|position| Pipe { + pipe_type: PipeType::Start, + position: position.extra, + }), + tag("-").map(with_xy).map(|position| Pipe { + pipe_type: PipeType::Horizontal, + position: position.extra, + }), + tag("|").map(with_xy).map(|position| Pipe { + pipe_type: PipeType::Vertical, + position: position.extra, + }), + tag("F").map(with_xy).map(|position| Pipe { + pipe_type: PipeType::DownRight, + position: position.extra, + }), + tag("7").map(with_xy).map(|position| Pipe { + pipe_type: PipeType::DownLeft, + position: position.extra, + }), + tag("L").map(with_xy).map(|position| Pipe { + pipe_type: PipeType::UpRight, + position: position.extra, + }), + tag("J").map(with_xy).map(|position| Pipe { + pipe_type: PipeType::UpLeft, + position: position.extra, + }), + tag(".").map(with_xy).map(|position| Pipe { + pipe_type: PipeType::None, + position: position.extra, + }), + ))(input) +} + +fn parse_input(input: Span) -> IResult> { + fold_many1( + terminated(many1(parse_pipe), alt((complete::line_ending, eof))), + HashMap::new, + |mut acc, x| { + x.into_iter() + .filter(|x| x.pipe_type != PipeType::None) + .for_each(|x| { + acc.insert(x.position, x); + }); + acc + }, + )(input) +} + +#[cfg(test)] +mod test { + use super::*; + + use rstest::rstest; + + #[rstest] + #[case( + "..... +.S-7. +.|.|. +.L-J. +.....", + "4" + )] + #[case( + "-L|F7 +7S-7| +L|7|| +-L-J| +L|-JF", + "4" + )] + #[case( + "..F7. +.FJ|. +SJ.L7 +|F--J +LJ...", + "8" + )] + #[case( + "7-F7- +.FJ|7 +SJLL7 +|F--J +LJ.LJ", + "8" + )] + + fn part1_works(#[case] input: &str, #[case] expected: &str) { + let result = part1(input); + assert_eq!(result, expected); + } +} + diff --git a/2023/day-10/src/part2.rs b/2023/day-10/src/part2.rs new file mode 100644 index 0000000..8f15571 --- /dev/null +++ b/2023/day-10/src/part2.rs @@ -0,0 +1,20 @@ +#![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()); + } +} +