From 4f0e9d7c7ca74dee9cb5d5a4b7a0de86e3da9bad Mon Sep 17 00:00:00 2001 From: dobiadi <50926840+dobiadi@users.noreply.github.com> Date: Wed, 6 Dec 2023 21:23:56 +0100 Subject: [PATCH] Day4 Rust --- day4/rust/.gitignore | 1 + day4/rust/Cargo.lock | 7 ++++ day4/rust/Cargo.toml | 8 +++++ day4/rust/src/main.rs | 84 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 100 insertions(+) create mode 100644 day4/rust/.gitignore create mode 100644 day4/rust/Cargo.lock create mode 100644 day4/rust/Cargo.toml create mode 100644 day4/rust/src/main.rs diff --git a/day4/rust/.gitignore b/day4/rust/.gitignore new file mode 100644 index 0000000..eb5a316 --- /dev/null +++ b/day4/rust/.gitignore @@ -0,0 +1 @@ +target diff --git a/day4/rust/Cargo.lock b/day4/rust/Cargo.lock new file mode 100644 index 0000000..b21cc6a --- /dev/null +++ b/day4/rust/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "rust" +version = "0.1.0" diff --git a/day4/rust/Cargo.toml b/day4/rust/Cargo.toml new file mode 100644 index 0000000..1ec6963 --- /dev/null +++ b/day4/rust/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "rust" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/day4/rust/src/main.rs b/day4/rust/src/main.rs new file mode 100644 index 0000000..68c674c --- /dev/null +++ b/day4/rust/src/main.rs @@ -0,0 +1,84 @@ +use std::collections::VecDeque; + +struct Card { + _id: usize, + winning_numbers: Vec, + scratched_numbers: Vec, +} + +fn main() { + let stdin = std::io::stdin(); + + let mut cards = Vec::new(); + + for line in stdin.lines() { + let line = line.unwrap(); + + let (card_id_str, numbers) = line.split_once(':').unwrap(); + + let card_id = card_id_str + .split_once(' ') + .unwrap() + .1 + .trim() + .parse() + .unwrap(); + + let (winning_numbers_str, scratched_numbers_str) = numbers.split_once('|').unwrap(); + + let winning_numbers = winning_numbers_str + .split(' ') + .filter(|e| e.len() > 0) + .map(|e| e.parse().unwrap()) + .collect(); + + let scratched_numbers = scratched_numbers_str + .split(' ') + .filter(|e| e.len() > 0) + .map(|e| e.parse().unwrap()) + .collect(); + + cards.push(Card { + _id: card_id, + winning_numbers, + scratched_numbers, + }); + } + + let mut part1 = 0; + let mut part2 = 0; + + let mut foresight = VecDeque::new(); + + for card in &cards { + let mut score = 0; + let mut win_num = 0; + + let card_num = foresight.pop_front().unwrap_or(0) + 1; + part2 += card_num; + + for scratched_number in &card.scratched_numbers { + if card.winning_numbers.contains(&scratched_number) { + win_num += 1; + if score == 0 { + score = 1; + } else { + score *= 2; + } + } + } + + for i in 0..win_num { + if let Some(n) = foresight.get(i) { + foresight[i] = n + card_num; + } else { + foresight.push_back(card_num); + } + } + + part1 += score; + } + + println!("{}", part1); + println!("{}", part2); +}