Added day 4
This commit is contained in:
parent
4a94c602f6
commit
f0370944d3
@ -1,12 +1,28 @@
|
|||||||
use std::{collections::HashSet, path::Path, str::FromStr};
|
use std::{collections::HashSet, path::Path, str::FromStr};
|
||||||
|
|
||||||
|
use itertools::Itertools;
|
||||||
|
|
||||||
use crate::input::{AdventError, read_into_vec};
|
use crate::input::{AdventError, read_into_vec};
|
||||||
|
|
||||||
impl FromStr for ScratchGame {
|
impl FromStr for ScratchGame {
|
||||||
type Err = AdventError;
|
type Err = AdventError;
|
||||||
|
|
||||||
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||||
todo!()
|
let split = s.split(':').collect_vec();
|
||||||
|
let id = split[0].split_whitespace().collect_tuple::<(&str, &str)>().ok_or(AdventError("Game Id not found.".into()))?.1.parse::<i32>()?;
|
||||||
|
let split = split[1].split('|').collect_vec();
|
||||||
|
let my_numbers: HashSet<i32> = split[0].trim().split_whitespace().map(|x| {
|
||||||
|
x.parse::<i32>()
|
||||||
|
}).collect::<Result<HashSet<_>, _>>()?;
|
||||||
|
let winning_numbers: HashSet<i32> = split[1].trim().split_whitespace().map(|x| -> Result<i32, AdventError> {
|
||||||
|
x.parse::<i32>().map_err(Into::into)
|
||||||
|
}).collect::<Result<HashSet<_>, _>>()?;
|
||||||
|
|
||||||
|
Ok(ScratchGame {
|
||||||
|
id,
|
||||||
|
my_numbers,
|
||||||
|
winning_numbers
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -17,10 +33,33 @@ struct ScratchGame {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn one() -> Result<u32, AdventError> {
|
pub fn one() -> Result<u32, AdventError> {
|
||||||
let games = read_into_vec::<ScratchGame>(Path::new("resources/input4.txt"));
|
let games = read_into_vec::<ScratchGame>(Path::new("resources/input4.txt"))?;
|
||||||
Ok(0)
|
Ok(games.into_iter().fold(Ok(0), |acc: Result<u64, AdventError>, game: ScratchGame| {
|
||||||
|
let acc = acc?;
|
||||||
|
let my_winning_numbers = game.my_numbers.intersection(&game.winning_numbers);
|
||||||
|
Ok(acc + match my_winning_numbers.count() {
|
||||||
|
0 => 0,
|
||||||
|
x => (2 as u64).pow((x-1).try_into()?)
|
||||||
|
})
|
||||||
|
})? as u32)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn two() -> Result<u32, AdventError> {
|
pub fn two() -> Result<u32, AdventError> {
|
||||||
Ok(0)
|
let games = read_into_vec::<ScratchGame>(Path::new("resources/input4.txt"))?;
|
||||||
|
let mut vec = Vec::<u32>::new();
|
||||||
|
vec.resize(games.len(), 1);
|
||||||
|
|
||||||
|
for game in games.into_iter() {
|
||||||
|
let my_winning_numbers = game.my_numbers.intersection(&game.winning_numbers);
|
||||||
|
let nr_free_tickets = my_winning_numbers.count() as i32;
|
||||||
|
|
||||||
|
for index in game.id..(game.id + nr_free_tickets ) {
|
||||||
|
let nr_to_count = vec[(game.id - 1) as usize];
|
||||||
|
for _ in 0..nr_to_count {
|
||||||
|
vec[index as usize] += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(vec.iter().sum())
|
||||||
}
|
}
|
@ -1,4 +1,4 @@
|
|||||||
use std::{io::{BufReader, BufRead, self}, fs::File, str::FromStr, path::Path, convert::Infallible, num::ParseIntError};
|
use std::{io::{BufReader, BufRead, self}, fs::File, str::FromStr, path::Path, convert::Infallible, num::{ParseIntError, TryFromIntError}};
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct AdventError(pub String);
|
pub struct AdventError(pub String);
|
||||||
@ -21,6 +21,12 @@ impl From<Infallible> for AdventError {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl From<TryFromIntError> for AdventError {
|
||||||
|
fn from(e: TryFromIntError) -> Self {
|
||||||
|
AdventError(e.to_string())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn read_into_vec<T:FromStr>(file_path : &Path) -> Result<Vec<T>, AdventError> where AdventError: From<<T as FromStr>::Err> {
|
pub fn read_into_vec<T:FromStr>(file_path : &Path) -> Result<Vec<T>, AdventError> where AdventError: From<<T as FromStr>::Err> {
|
||||||
let file = File::open(file_path).expect("no such file");
|
let file = File::open(file_path).expect("no such file");
|
||||||
let buf = BufReader::new(file);
|
let buf = BufReader::new(file);
|
||||||
|
Loading…
Reference in New Issue
Block a user