From 4b02c556994f2fea944dc6a3bdeceeee99a8e168 Mon Sep 17 00:00:00 2001 From: "RingOfStorms (Joshua Bell)" Date: Mon, 4 Dec 2023 01:28:48 -0600 Subject: [PATCH] revised, faster --- src/bin/day4.rs | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/src/bin/day4.rs b/src/bin/day4.rs index 66c8d7e..166ab80 100644 --- a/src/bin/day4.rs +++ b/src/bin/day4.rs @@ -3,6 +3,7 @@ use itertools::Itertools; use std::{ collections::{HashMap, VecDeque}, str::FromStr, + time::Instant, }; #[derive(Debug)] @@ -84,12 +85,41 @@ fn part2(input: String) -> Result { Ok(sum) } +fn part2_revised(input: String) -> Result { + let mut sum = 0; + let cards = input + .lines() + .map(|line| line.parse::()) + .filter_map(|card| card.ok()) + .collect_vec(); + let mut card_counts: HashMap = HashMap::new(); + for card in cards { + let count = { + let card_count = card_counts.entry(card.id).or_insert(1); + sum += *card_count; + *card_count + }; + for card_index in 1..=card.part_2_matches { + *card_counts.entry(card.id + card_index).or_insert(1) += count; + } + } + Ok(sum) +} + #[tokio::main] async fn main() -> Result<()> { println!("Day 4"); println!("====="); let input = utils::aoc::get_puzzle_input(4).await?; - println!("part 1: {}", part1(input.clone())?); - println!("part 2: {}", part2(input.clone())?); + let start = Instant::now(); + println!("part 1: {}\t[{:?}]", part1(input.clone())?, start.elapsed()); + let start = Instant::now(); + println!("part 2: {}\t[{:?}]", part2(input.clone())?, start.elapsed()); + let start = Instant::now(); + println!( + "part 2: {}\t[{:?}]\t[revised]", + part2_revised(input.clone())?, + start.elapsed() + ); Ok(()) }