From 3be4845987dc37f2d27ee8dff3a0b311a2e2497c Mon Sep 17 00:00:00 2001 From: "RingOfStorms (Joshua Bell)" Date: Wed, 6 Dec 2023 00:38:13 -0600 Subject: [PATCH] prepare day 7, some cleanup of day 6 --- src/bin/day6.rs | 110 ++++++++++++-------------------------------- src/bin/day7.rs | 84 +++++++++++++++++++++++++++++++++ src/bin/template.rs | 84 +++++++++++++++++++++++++++++++++ 3 files changed, 197 insertions(+), 81 deletions(-) create mode 100644 src/bin/day7.rs create mode 100644 src/bin/template.rs diff --git a/src/bin/day6.rs b/src/bin/day6.rs index 0536f8a..ed4775c 100644 --- a/src/bin/day6.rs +++ b/src/bin/day6.rs @@ -1,8 +1,5 @@ use aoc23::prelude::*; use derive_builder::Builder; -use itertools::Itertools; -use rayon::prelude::*; -use std::{str::FromStr, time::Instant}; static DAY: u8 = 6; @@ -44,37 +41,12 @@ impl Race { } } -fn part1(races: &[Race]) -> Result { - // algo - let start = Instant::now(); +fn get_ways_to_beat_in_all_races(races: &[Race]) -> Result { let mut answer = 1; for race in races { let ways_to_beat = race.get_ways_to_beat_count(); - println!( - "Race: {:?}, roots: {:?}, ways to beat: {:?}", - race, - race.get_roots(), - race.get_ways_to_beat_count() - ); answer *= ways_to_beat; } - let algo_time = start.elapsed(); - - // output - println!("part 1: {answer}"); - println!("\talgo: {algo_time:?}"); - Ok(answer) -} - -fn part2(races: &[Race]) -> Result { - // algo - let start = Instant::now(); - let answer = 0; - let algo_time = start.elapsed(); - - // output - println!("part 2: {answer}"); - println!("\talgo: {algo_time:?}"); Ok(answer) } @@ -83,6 +55,24 @@ async fn main() -> Result<()> { // let input = utils::aoc::get_puzzle_input(DAY).await?; println!("Day {DAY}"); println!("====="); + let races: [Race; 3] = [ + Race { + time: 7, + record_distance: 9, + }, + Race { + time: 15, + record_distance: 40, + }, + Race { + time: 30, + record_distance: 200, + }, + ]; + println!( + "part 1, example: {}", + get_ways_to_beat_in_all_races(&races)? + ); let races: [Race; 4] = [ Race { time: 53, @@ -101,61 +91,19 @@ async fn main() -> Result<()> { record_distance: 1025, }, ]; - let races: [Race; 1] = [Race { - time: 53916768, - record_distance: 250133010811025, - }]; - let races: [Race; 3] = [ - Race { - time: 7, - record_distance: 9, - }, - Race { - time: 15, - record_distance: 40, - }, - Race { - time: 30, - record_distance: 200, - }, - ]; + println!("part 1, real: {}", get_ways_to_beat_in_all_races(&races)?); let races: [Race; 1] = [Race { time: 71530, record_distance: 940200, }]; - part1(&races)?; - part2(&races)?; + println!( + "part 2, example: {}", + get_ways_to_beat_in_all_races(&races)? + ); + let races: [Race; 1] = [Race { + time: 53916768, + record_distance: 250133010811025, + }]; + println!("part 2, real: {}", get_ways_to_beat_in_all_races(&races)?); Ok(()) } - -#[cfg(test)] -mod tests { - use super::*; - - static RACES: [Race; 3] = [ - Race { - time: 7, - record_distance: 9, - }, - Race { - time: 15, - record_distance: 40, - }, - Race { - time: 30, - record_distance: 200, - }, - ]; - - #[test] - fn test_part_1() -> Result<()> { - assert_eq!(part1(&RACES)?, 288); - Ok(()) - } - - #[test] - fn test_part_2() -> Result<()> { - assert_eq!(part2(&RACES)?, 0); - Ok(()) - } -} diff --git a/src/bin/day7.rs b/src/bin/day7.rs new file mode 100644 index 0000000..7953385 --- /dev/null +++ b/src/bin/day7.rs @@ -0,0 +1,84 @@ +use aoc23::prelude::*; +use derive_builder::Builder; +use itertools::Itertools; +use rayon::prelude::*; +use std::{str::FromStr, time::Instant}; + +#[derive(Debug, Builder, Clone)] +struct Todo {} + +impl FromStr for Todo { + type Err = BoxE; + + fn from_str(s: &str) -> std::result::Result { + Ok(TodoBuilder::default().build()?) + } +} + +fn part1(input: String) -> Result { + // parse + let start = Instant::now(); + let todo: Todo = input.parse()?; + let parsed_time = start.elapsed(); + + // algo + let start = Instant::now(); + let answer = 0; + let algo_time = start.elapsed(); + + // output + println!("Day 5, part 1: {answer}"); + println!("\tparse: {parsed_time:?}"); + println!("\talgo: {algo_time:?}"); + Ok(answer) +} + +fn part2(input: String) -> Result { + // parse + let start = Instant::now(); + let todo: Todo = input.parse()?; + let parsed_time = start.elapsed(); + + // algo + let start = Instant::now(); + let answer = 0; + let algo_time = start.elapsed(); + + // output + println!("Day 5, part 2: {answer}"); + println!("\tparse: {parsed_time:?}"); + println!("\talgo: {algo_time:?}"); + Ok(answer) +} + +// TODO come back and revise for a faster solution +#[tokio::main] +async fn main() -> Result<()> { + println!("Day {DAY}"); + println!("====="); + let input = utils::aoc::get_puzzle_input(DAY).await?; + part1(input.clone())?; + part2(input.clone())?; + Ok(()) +} + +static DAY: u8 = 7; + +#[cfg(test)] +mod tests { + use super::*; + + static DATA: &'static str = "TODO_REPLACE"; + + #[test] + fn test_part_1() -> Result<()> { + assert_eq!(part1(DATA.to_owned())?, 0); + Ok(()) + } + + #[test] + fn test_part_2() -> Result<()> { + assert_eq!(part2(DATA.to_owned())?, 0); + Ok(()) + } +} diff --git a/src/bin/template.rs b/src/bin/template.rs new file mode 100644 index 0000000..67072b2 --- /dev/null +++ b/src/bin/template.rs @@ -0,0 +1,84 @@ +use aoc23::prelude::*; +use derive_builder::Builder; +use itertools::Itertools; +use rayon::prelude::*; +use std::{str::FromStr, time::Instant}; + +#[derive(Debug, Builder, Clone)] +struct Todo {} + +impl FromStr for Todo { + type Err = BoxE; + + fn from_str(s: &str) -> std::result::Result { + Ok(TodoBuilder::default().build()?) + } +} + +fn part1(input: String) -> Result { + // parse + let start = Instant::now(); + let todo: Todo = input.parse()?; + let parsed_time = start.elapsed(); + + // algo + let start = Instant::now(); + let answer = 0; + let algo_time = start.elapsed(); + + // output + println!("Day 5, part 1: {answer}"); + println!("\tparse: {parsed_time:?}"); + println!("\talgo: {algo_time:?}"); + Ok(answer) +} + +fn part2(input: String) -> Result { + // parse + let start = Instant::now(); + let todo: Todo = input.parse()?; + let parsed_time = start.elapsed(); + + // algo + let start = Instant::now(); + let answer = 0; + let algo_time = start.elapsed(); + + // output + println!("Day 5, part 2: {answer}"); + println!("\tparse: {parsed_time:?}"); + println!("\talgo: {algo_time:?}"); + Ok(answer) +} + +// TODO come back and revise for a faster solution +#[tokio::main] +async fn main() -> Result<()> { + println!("Day {DAY}"); + println!("====="); + let input = utils::aoc::get_puzzle_input(DAY).await?; + part1(input.clone())?; + part2(input.clone())?; + Ok(()) +} + +static DAY: u8 = TODO; + +#[cfg(test)] +mod tests { + use super::*; + + static DATA: &'static str = "TODO_REPLACE"; + + #[test] + fn test_part_1() -> Result<()> { + assert_eq!(part1(DATA.to_owned())?, 0); + Ok(()) + } + + #[test] + fn test_part_2() -> Result<()> { + assert_eq!(part2(DATA.to_owned())?, 0); + Ok(()) + } +}