day 4
parent
51459c17c6
commit
744731c1fc
@ -0,0 +1,7 @@
|
||||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
version = 3
|
||||
|
||||
[[package]]
|
||||
name = "day04"
|
||||
version = "0.1.0"
|
@ -0,0 +1,4 @@
|
||||
[package]
|
||||
name = "day04"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
@ -0,0 +1,61 @@
|
||||
use std::collections::{HashMap, HashSet};
|
||||
use std::io::{stdin, BufRead};
|
||||
|
||||
fn main() {
|
||||
let input = stdin().lock().lines().map(|l| l.unwrap());
|
||||
let mut total_score = 0;
|
||||
let mut card_counts = HashMap::new();
|
||||
let mut total_single_cards = 0;
|
||||
|
||||
for (id, line) in input.enumerate() {
|
||||
let card = line.split_once(':').unwrap().1;
|
||||
let (entries, winners) = card.split_once('|').unwrap();
|
||||
|
||||
let entset = entries
|
||||
.trim()
|
||||
.split(' ')
|
||||
.filter(|num| !num.is_empty())
|
||||
.collect::<HashSet<_>>();
|
||||
let winset = winners
|
||||
.trim()
|
||||
.split(' ')
|
||||
.filter(|num| !num.is_empty())
|
||||
.collect::<HashSet<_>>();
|
||||
|
||||
let common = entset.intersection(&winset);
|
||||
let num_in_common = common.count();
|
||||
total_score += to_score(num_in_common);
|
||||
|
||||
let repeat_count = card_counts.get(&(id + 1)).unwrap_or(&0).to_owned();
|
||||
|
||||
let r = to_range(id, num_in_common);
|
||||
for win_card_copy in r {
|
||||
let current_count = card_counts.get(&win_card_copy).unwrap_or(&0);
|
||||
card_counts.insert(win_card_copy, current_count + 1 + repeat_count);
|
||||
}
|
||||
|
||||
total_single_cards = id + 1;
|
||||
}
|
||||
|
||||
let card_total = card_counts.iter().fold(0, |total, count| total + count.1);
|
||||
|
||||
println!(
|
||||
"P1: {} P2: {}",
|
||||
total_score,
|
||||
total_single_cards + card_total
|
||||
);
|
||||
}
|
||||
|
||||
fn to_range(id: usize, win_count: usize) -> std::ops::Range<usize> {
|
||||
let start = id + 2;
|
||||
let end = start + win_count;
|
||||
start..end
|
||||
}
|
||||
|
||||
fn to_score(entries: usize) -> usize {
|
||||
if entries == 0 {
|
||||
0
|
||||
} else {
|
||||
1 << (entries - 1)
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue