This commit is contained in:
unintendedfraud
2023-12-07 00:25:09 +01:00
parent f75060f653
commit cbf151b35d
7 changed files with 511 additions and 2 deletions
+7
View File
@@ -0,0 +1,7 @@
mod part1;
mod part2;
fn main() {
println!("# Part 1: {}", part1::get_total_points());
println!("# Part 2: {}", part2::get_total_cards());
}
+41
View File
@@ -0,0 +1,41 @@
pub fn get_total_points() -> u32 {
let data1 = util::get_data("data1.txt");
let mut sum: u32 = 0;
for i in 0..data1.len() {
let split: Vec<&str> = data1[i].split(":").collect();
let numbers: Vec<&str> = split[1].split("|").collect();
let winning = get_numbers_from_str(numbers[0]);
let card = get_numbers_from_str(numbers[1]);
sum += get_game_points(&winning, &card);
}
return sum;
}
fn get_game_points(w: &Vec<usize>, c: &Vec<usize>) -> u32 {
let shared_len = c
.iter()
.filter(|x| w.contains(x))
.collect::<Vec<&usize>>()
.len();
if shared_len == 0 {
return 0;
}
let base: u32 = 2;
return base.pow((shared_len - 1) as u32);
}
fn get_numbers_from_str(str: &str) -> Vec<usize> {
return str
.split(" ")
.filter(|x| !x.is_empty())
.map(|x| x.trim().parse().expect("failed to parse"))
.collect();
}
+54
View File
@@ -0,0 +1,54 @@
use std::collections::HashMap;
pub fn get_total_cards() -> usize {
let data = util::get_data("data2.txt");
let mut m: HashMap<usize, usize> = HashMap::new();
for i in 0..data.len() {
m.entry(i).and_modify(|v| *v += 1).or_insert(1);
let count = get_count(&m, i);
let split: Vec<&str> = data[i].split(":").collect();
let numbers: Vec<&str> = split[1].split("|").collect();
let winning = get_numbers_from_str(numbers[0]);
let card = get_numbers_from_str(numbers[1]);
let shared_len = card
.iter()
.filter(|x| winning.contains(x))
.collect::<Vec<&usize>>()
.len();
for j in 0..shared_len {
let k = i + j + 1;
if k < data.len() {
m.entry(k).and_modify(|v| *v += count).or_insert(count);
}
}
}
return m.iter().map(|(_, v)| v).sum();
}
fn get_count(m: &HashMap<usize, usize>, i: usize) -> usize {
let count = match m.get(&i) {
Some(n) => n,
None => {
println!("should always have a value, {:?}, {:?}", m, i);
return 0;
}
};
return *count;
}
fn get_numbers_from_str(str: &str) -> Vec<usize> {
return str
.split(" ")
.filter(|x| !x.is_empty())
.map(|x| x.trim().parse().expect("failed to parse"))
.collect();
}