diff --git a/2021/src/day1.rs b/2021/src/day1.rs index 0008b4d..b308c31 100644 --- a/2021/src/day1.rs +++ b/2021/src/day1.rs @@ -3,7 +3,7 @@ use color_eyre::eyre; use crate::lib::ParseLines; -fn run(data: &str) -> eyre::Result<()> { +pub fn run(data: &str) -> eyre::Result<(i32, i32)> { let mut single_increases = 0; let mut window_increases = 0; let mut prev = (None, None, None); @@ -25,7 +25,5 @@ fn run(data: &str) -> eyre::Result<()> { prev = (prev.1, prev.2, Some(n)); } - println!("One: {}", single_increases); - println!("Two: {}", window_increases); - Ok(()) + Ok((single_increases, window_increases)) } diff --git a/2021/src/day2.rs b/2021/src/day2.rs index 8291935..c544639 100644 --- a/2021/src/day2.rs +++ b/2021/src/day2.rs @@ -74,13 +74,11 @@ fn part2(commands: &Vec) -> i32 { } -pub fn run(data: &str) -> eyre::Result<()> { +pub fn run(data: &str) -> eyre::Result<(i32, i32)> { let mut commands = Vec::new(); for res in data.parse_lines::() { commands.push(res?); } - println!("One: {}", part1(&commands)); - println!("Two: {}", part2(&commands)); - Ok(()) + Ok((part1(&commands), part2(&commands))) } diff --git a/2021/src/day3.rs b/2021/src/day3.rs index 3b1a9c7..2250ca2 100644 --- a/2021/src/day3.rs +++ b/2021/src/day3.rs @@ -57,13 +57,11 @@ fn part2(numbers: &Vec) -> u64 { -pub fn run(data: &str) -> eyre::Result<()> { +pub fn run(data: &str) -> eyre::Result<(u64, u64)> { let mut nums = Vec::new(); for line in data.lines() { nums.push(u16::from_str_radix(line, 2)?); } - println!("One: {}", part1(&nums)); - println!("Two: {}", part2(&nums)); - Ok(()) + Ok((part1(&nums), part2(&nums))) } \ No newline at end of file diff --git a/2021/src/day4.rs b/2021/src/day4.rs index bf24d97..debb702 100644 --- a/2021/src/day4.rs +++ b/2021/src/day4.rs @@ -111,20 +111,21 @@ impl Board { } } - fn score(&self) -> eyre::Result { + fn score(&self) -> eyre::Result { let bingo_time = match self.bingo_time { Some(t) => t, None => return Err(eyre!("Cannot find the score of a non-winning board")), }; - let mut total = 0usize; + let mut total = 0; for row in self.squares { for sq in row { if sq.draw_time.is_some() && sq.draw_time.unwrap() > bingo_time { - total += sq.value as usize; + total += sq.value as isize; } } } - Ok(total * self.bingo_value.unwrap() as usize) + let multiplier = self.bingo_value.unwrap() as isize; + Ok(total * multiplier) } } @@ -190,9 +191,8 @@ fn part1(boards: &[Board]) -> eyre::Result { } -pub fn run(data: &str) -> eyre::Result<()> { +pub fn run(data: &str) -> eyre::Result<(isize, isize)> { let boards = load(data)?; let winner = part1(&boards)?; - println!("One: {}", winner.score()?); - Ok(()) + Ok((winner.score()?, 0)) } diff --git a/2021/src/main.rs b/2021/src/main.rs index 19ca81a..c104471 100644 --- a/2021/src/main.rs +++ b/2021/src/main.rs @@ -9,20 +9,26 @@ mod day4; fn main() -> eyre::Result<()> { let data = load("data/04.txt")?; + let start = Instant::now(); - day4::run(&data)?; + let (one, two) = day4::run(&data)?; let (dur, unit) = format_ns(start.elapsed().as_nanos()); - println!("Completed in {}{}", dur, unit); + + let precision = 2.0 - dur.log10().floor(); + println!( + "One: {0}\nTwo: {1}\nCompleted in {2:.4$}{3}", + one, two, dur, unit, precision as usize + ); Ok(()) } -fn format_ns(ns: u128) -> (u128, &'static str) { +fn format_ns(ns: u128) -> (f64, &'static str) { const UNITS: [&str; 4] = ["ns", "us", "ms", "s"]; - let mut display_n = ns; + let mut display_n = ns as f64; // let mut unit_idx = 0; - while display_n > 1000 && unit_idx < 4 { - display_n /= 1000; + while display_n > 1000.0 && unit_idx < 4 { + display_n /= 1000.0; unit_idx += 1 }