From 315b7c2d5eb2bf65c1af727820e4307520804e68 Mon Sep 17 00:00:00 2001 From: Sijmen Date: Wed, 6 Dec 2023 01:12:29 +0100 Subject: [PATCH] Add day 4 rust --- .gitignore | 1 + day04.rs | 42 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 day04.rs diff --git a/.gitignore b/.gitignore index 00d9c72..3fad632 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ *.in *.ex* +day?? diff --git a/day04.rs b/day04.rs new file mode 100644 index 0000000..0510664 --- /dev/null +++ b/day04.rs @@ -0,0 +1,42 @@ +use std::collections::HashSet; +use std::io::{self, BufRead}; + +fn main() { + // Part 1 + let mut part1 = 0; + let cards: Vec = io::stdin() + .lock() + .lines() + .map(|line| { + let line = line.unwrap(); + let (_, card) = line.split_once(": ").unwrap(); + let (winning, owned) = card.split_once(" | ").unwrap(); + + let winning: HashSet = winning + .split_whitespace() + .flat_map(str::parse) + .collect(); + + let owned: HashSet = owned + .split_whitespace() + .flat_map(str::parse) + .collect(); + + let count = winning.intersection(&owned).count(); + + part1 += 1 << (count - 1); + count + }) + .collect(); + + // Part 2 + let mut dp = vec![1; cards.len()]; + let part2: i32 = (0..cards.len()) + .map(|i| { + dp[i] += dp[i - cards[cards.len() - i - 1]..i].iter().sum::(); + dp[i] + }) + .sum(); + + println!("{} {}", part1, part2); +}