day4
This commit is contained in:
@@ -0,0 +1,7 @@
|
||||
mod part1;
|
||||
mod part2;
|
||||
|
||||
fn main() {
|
||||
println!("# Part 1: {}", part1::get_total_points());
|
||||
println!("# Part 2: {}", part2::get_total_cards());
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
Reference in New Issue
Block a user