From e9a6c19c2eace0035146e3bebda0e0bfd9dcd5db Mon Sep 17 00:00:00 2001 From: Noratrieb <48135649+Noratrieb@users.noreply.github.com> Date: Sat, 7 Dec 2024 12:49:38 +0100 Subject: [PATCH] d6p1 --- 2024/Cargo.lock | 9 +++ 2024/day06/Cargo.toml | 15 ++++ 2024/day06/benches/benches.rs | 3 + 2024/day06/input.txt | 130 ++++++++++++++++++++++++++++++++++ 2024/day06/input_small.txt | 10 +++ 2024/day06/src/lib.rs | 95 +++++++++++++++++++++++++ 2024/day06/src/main.rs | 3 + helper/src/cmd.rs | 20 ++++-- 8 files changed, 279 insertions(+), 6 deletions(-) create mode 100644 2024/day06/Cargo.toml create mode 100644 2024/day06/benches/benches.rs create mode 100644 2024/day06/input.txt create mode 100644 2024/day06/input_small.txt create mode 100644 2024/day06/src/lib.rs create mode 100644 2024/day06/src/main.rs diff --git a/2024/Cargo.lock b/2024/Cargo.lock index 4e8541a..ac67d96 100644 --- a/2024/Cargo.lock +++ b/2024/Cargo.lock @@ -161,6 +161,15 @@ dependencies = [ "rustc-hash", ] +[[package]] +name = "day06" +version = "0.1.0" +dependencies = [ + "divan", + "helper", + "nom", +] + [[package]] name = "divan" version = "0.1.16" diff --git a/2024/day06/Cargo.toml b/2024/day06/Cargo.toml new file mode 100644 index 0000000..e1ca023 --- /dev/null +++ b/2024/day06/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "day06" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +nom.workspace = true +helper.workspace = true +divan.workspace = true + +[[bench]] +name = "benches" +harness = false diff --git a/2024/day06/benches/benches.rs b/2024/day06/benches/benches.rs new file mode 100644 index 0000000..f1fa741 --- /dev/null +++ b/2024/day06/benches/benches.rs @@ -0,0 +1,3 @@ +fn main() { + day06::bench(); +} diff --git a/2024/day06/input.txt b/2024/day06/input.txt new file mode 100644 index 0000000..356b341 --- /dev/null +++ b/2024/day06/input.txt @@ -0,0 +1,130 @@ +......#...........#..............................#..............................#...........................##...............#.... +.............#..............#........#......##...................................................#............##...#..........#... +...#..................#..............#.........#...#.........................................................................#..#. +.....#..........#...................#.....................#..........#...........#......#..#...................#.................. +...#...............................................##..................#............#.....#...................#................... +.#.#..#...................#.##.................#..........#................................#......#.........##..................#. +....................#...................#....#.........#....................#....................................................# +..........#......#...................................................................................................#....#....... +.#...............#.........#...........#...............#...................#......#............................................... +............#...........#........#..##.......#........#.....#................................##................................... +...................#.#.............###.................##.................#.......................#.....#..............##......... +.........................#...#............................#......#.......................#........................................ +.....................#..............................................#.......#......##......................................#...... +............................#.#............................................................................#.................#.... +.#.....#.......................................................#..........#....................................................... +..............#..............................#.....#....#........#....................#....#.#...........#.#..................#... +........................#...#...##......#...........................#.............#............................#.................. +...#........................................................#...#...........................#...#...............#........#........ +.........#..#..........#.....................................#..................................................................#. +...........................................#.........#....#........................................#..#...........#............... +..#..........#...........................................................................................#..............#......... +...#.......#......................................#...............#............................................................... +.#........#......#.#....................................#...#...........#..........#........#.#.......#.......................#... +......................#...........#......##....................#..................#......#..............................#.......#. +..............#......................#..............#...#.#............................................................#.#........ +..............#..................#...#..................#...#.....#...#...............#........................................... +.............#............................##..#...#...............................................................##.............. +..#............................#.......#.#....................................#................................................... +.......#.....#..........#......#.....#...................................#...........................#......#....#..............#. +.#.................#.............................................#................#.............#.....#....................#...... +..............#.........#..#.....#...........#..............................#.................................#............#...... +....#.#............#............................................................#..........#...................................... +.........................................#.......#......#....................................#.....................#...#......#... +....#.............................#....................................#..........#................................#.............. +.........#..#......#..............................................................#....................#.......................... +.......................................................##...#........#......................................................#.#..# +..........................#.......##..##................................................................................#......... +..................................##..................................................................#..........................# +.#..................................................#..............#.....................#.....#.................................. +.......##........................#......................................................#..........#.............................. +.........#....#....#.........#.#........................#...#.....................................................#.....#......... +....#.............................#....#....................#.....................#.....#......#.....................#..........#. +............................................................................................#..........#......#................... +..................................................................................#..........................#.#.....#.........#.. +..................................................#...................................................#......#.....#............#. +..........................................^#................................................................................#..... +...............#..........#.............................................#.....#....#...................#................#......... +#..#....#........#........#.........#.......#.................#.......................#.#.............#...................#....... +..#................................................................#......................................#....................... +........#......................#.....................##.#..........#.............................#.............................#.. +....#..........#........................#......................................................................................... +......#...#.#.#.........#.................#.....#.....#...#......#..................................................##........#... +...#....#....................#...................................................................#......#...............#......... +..#.......#.........................#..........#........#............................#......#....................#................ +.................................#.......................................#....................................................#..# +......................#...#........................#.......................#.............#........................................ +......#.......#...................................................................................................#............... +.............#............#......#............................#...........................................##...................... +..........................#.....................................................................................#................. +....#..............................#......................#........................................#....#...........#............. +................#.......#......................................................................................................... +.............#............#........#.....#.........#.#.#............................#..........#..............#....#.......#.....# +..#.....#...............................................................................................#...............#......... +.......#...........#............#................#.......................................#..........................#......#...... +..........#........................................#......................#............#....................................#..#.. +.......#......#..............................#........................................................#.#.................#....... +.#.................#..#.....................................................................................#...........##........ +#...................................#........................................#..............#.##........#..#.#.............#...... +......#...............#........#....#.........#.........#...#.......................#...........................#............#.... +...#...................................................................................#.......................................#.. +.....#.......................................#................#...............................................................#... +.#................................................##................................#....................#...............#........ +.................................................#..#..................#.......#........................#...............#.....#... +.....##.#.............................#.....................#................................................................#...# +...........#....................#...........#...............#.................................................#.......#.......#..# +........#....................................................#.....#....#.........................................#.....#.#....... +...............#..........................#............#.#.................................................#...................... +...........#......#.....................#...................................................................#.#..............#.... +......#...#.........................#..........................................................#.................................. +.....................#................................................#..#........................................................ +..............#.................#............#....................#.#.......................................#............#........ +............#.....................#................#......#..........................#.#.........#............#................... +........................................................................#.....................#................................... +.............................#.................................................................................................... +.........................#...#..........................................#............................................#............ +..#...............................#.....#.....#.............#.......#..#.................##.#.......................#.........#.#. +......................................#........................................................................................... +...........#.....................................#................#...#.........................#........................#........ +..#...#..#..........................#.......#....#......................................................#................#........ +.....................................#...#.#........#...............#..#......#.....................................#...#......... +.#..............#..............................................................#.........................##......................# +..........#..................................#....#.........#...#.#..........#...#...................................##........... +...............#.....................................................................................................#............ +.#.......#....................#...#..........................#.#...............#......................#........#.................# +.............#....................#........................#..................#......#....#....#.................................. +........#..............................................................#.....................#.................................... +.......................#..............#.............#......#.........................................#.........................#.. +.......#.......#.#........#.......................#..#.......................................................#.#.................. +...............#..#....#.......................#.....#..............................#..................#.....................#.... +......#..............#...........................#............................##...........................#...................... +.......................................#........#................................#..........................#..................... +.#.....................................#............#.............................................................#..#............ +..................#..................#.........................#............#..........#.........................#...#............ +.......................................................#..............#..........................................................# +...#....#..#...#..#...................##....................#.....................#...................#.....#..........#.......... +.......................#........#....................##.................#.......................................................#. +........#.......#.......................#.#......##...##........#..##.........................................#...............##.. +....#..........................#.........##..#......#...........................#........#........#...#........................... +...#..........................#.....#.....................................#....................................................... +....................................##.......#..............................#.............#...#......#.............#.............. +.#..............................#...............................................................................................#. +.....#................................................................................##.....#..............#.#................... +...........................................................................................#....#................#................ +...#..#...................................................#....#.......#.......#.................................#........#....... +.#....#....................#..............................................................................#.............#.......#. +.........#.................#.......................................#...........#......#.......#............#............#......... +........................................#...............................#......................................................... +..............#....#......................#..........#........#.....................................#...........#..........#...... +......##....#.............#..........#......................#.........................................##.......................... +....................#.............................#.....................##.#..........#..#......................###.........#..... +.#.......................................##........................#.....#.....#..#............................................... +..............................#............................#.......................................................##............. +.........#.............................#..............#......#.....#..............#.#............................#........#....#.. +............#..............#.............................#..........................#.............................#............... +.................#...........#..............#.....#..............................#.............#................#.....#........... +........#.....................#........#.....................................#..........................#......#.#................ +.....................................................#..#........................#.##..#.........#................................ +......#..............................................#..........................#...............................#..........#...... +.................................................#.................##.......................#...................................#. +....................#.....#.......#.............#................................#..........#...#................................. diff --git a/2024/day06/input_small.txt b/2024/day06/input_small.txt new file mode 100644 index 0000000..a4eb402 --- /dev/null +++ b/2024/day06/input_small.txt @@ -0,0 +1,10 @@ +....#..... +.........# +.......... +..#....... +.......#.. +.......... +.#..^..... +........#. +#......... +......#... diff --git a/2024/day06/src/lib.rs b/2024/day06/src/lib.rs new file mode 100644 index 0000000..9aa54c6 --- /dev/null +++ b/2024/day06/src/lib.rs @@ -0,0 +1,95 @@ +use helper::{Day, Variants}; + +pub fn main() { + helper::main::(include_str!("../input.txt")); +} + +struct Day06; + +helper::define_variants! { + day => crate::Day06; + part1 { + basic => crate::part1; + } + part2 { + basic => crate::part2; + } +} + +impl Day for Day06 { + fn part1() -> Variants { + part1_variants!(construct_variants) + } + + fn part2() -> Variants { + part2_variants!(construct_variants) + } +} + +fn part1(input: &str) -> u64 { + let input = input.as_bytes(); + + let width = input.iter().position(|&byte| byte == b'\n').unwrap() + 1; // account for newline + let mut guard_pos = input + .iter() + .position(|&byte| byte == b'^' || byte == b'>' || byte == b'<' || byte == b'v') + .unwrap(); + let mut guard_state = input[guard_pos]; + + let mut reached_tiles = vec![false; input.len()]; + reached_tiles[guard_pos] = true; + + loop { + let new_pos = match guard_state { + b'^' => guard_pos.checked_sub(width), + b'v' => guard_pos.checked_add(width), + b'<' => guard_pos.checked_sub(1), + b'>' => guard_pos.checked_add(1), + _ => unreachable!(), + }; + match new_pos { + None => { + break; + } + Some(new_pos) if input.len() <= new_pos => { + break; + } + Some(new_pos) if input[new_pos] == b'\n' => { + break; + } + Some(new_pos) => { + if input[new_pos] == b'#' { + guard_state = match guard_state { + b'^' => b'>', + b'v' => b'<', + b'<' => b'^', + b'>' => b'v', + _ => unreachable!(), + } + } else { + reached_tiles[new_pos] = true; + guard_pos = new_pos; + } + } + } + } + + reached_tiles.iter().filter(|reached| **reached).count() as u64 +} + +fn part2(_input: &str) -> u64 { + 0 +} + +helper::tests! { + day06 Day06; + part1 { + small => 41; + default => 4454; + } + part2 { + small => 0; + default => 0; + } +} +helper::benchmarks! {} diff --git a/2024/day06/src/main.rs b/2024/day06/src/main.rs new file mode 100644 index 0000000..5f82631 --- /dev/null +++ b/2024/day06/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + day06::main(); +} diff --git a/helper/src/cmd.rs b/helper/src/cmd.rs index f0f3cb6..f3b7f64 100644 --- a/helper/src/cmd.rs +++ b/helper/src/cmd.rs @@ -1,6 +1,6 @@ use std::{borrow::Cow, process}; -use clap::{Arg, ArgMatches, Command}; +use clap::{value_parser, Arg, ArgMatches, Command}; use crate::{Day, Variant}; @@ -49,10 +49,13 @@ fn create_variant_subcommands(mut part: Command, variants: &[Variant]) -> Comman Command::new(v.name) .about(format!("Run the {} variant", v.name)) .arg(Arg::new("input").short('i').long("input")) + .arg(Arg::new("iter").long("iter").value_parser(value_parser!(usize))) }) .for_each(|cmd| part = part.clone().subcommand(cmd)); } else { - part = part.arg(Arg::new("input").short('i').long("input")); + part = part + .arg(Arg::new("input").short('i').long("input")) + .arg(Arg::new("iter").long("iter").value_parser(value_parser!(usize))); } part @@ -63,21 +66,26 @@ fn dispatch_root_subcommand( variants: &[Variant], matches: &ArgMatches, ) -> ! { + let iter = matches.get_one::("iter").unwrap_or(&1); + if variants.len() > 1 { let subcommand = matches.subcommand().unwrap(); let variant = variants.iter().find(|v| v.name == subcommand.0).unwrap(); let input = get_input(subcommand.1, default_input); - execute::(variant, &input); + execute::(variant, &input, *iter); } else { let input = get_input(matches, default_input); - execute::(&variants[0], &input); + execute::(&variants[0], &input, *iter); } } -fn execute(variant: &Variant, input: &str) -> ! { +fn execute(variant: &Variant, input: &str, iter: usize) -> ! { use std::io::Write; let input = D::pad_input(input); - let result = (variant.f)(&input); + let mut result = 0; + for _ in 0..iter { + result = (variant.f)(&input); + } let err = writeln!(std::io::stdout(), "{result}"); if let Err(err) = err { if err.kind() != std::io::ErrorKind::BrokenPipe {