diff options
Diffstat (limited to '2022/src')
-rw-r--r-- | 2022/src/bin/day_1.rs | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/2022/src/bin/day_1.rs b/2022/src/bin/day_1.rs index 078760e..bc988b7 100644 --- a/2022/src/bin/day_1.rs +++ b/2022/src/bin/day_1.rs @@ -1,3 +1,61 @@ +use nom::{ + character::complete::{line_ending, u32 as nom_u32}, + combinator::map, + multi::separated_list1, + sequence::pair, + IResult, +}; +use std::fs; + fn main() -> Result<(), Box<dyn std::error::Error>> { + let input = fs::read_to_string("inputs/day_1.txt")?; + let elves = Elves::parser(&input).unwrap().1; + dbg!(elves.max_calories_sum(1)); + dbg!(elves.max_calories_sum(3)); Ok(()) } + +#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone)] +struct Elves { + elves: Vec<Elf>, +} + +#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone)] +struct Elf { + calories: Vec<u32>, +} + +impl Elves { + fn parser(input: &str) -> IResult<&str, Elves> { + map( + separated_list1(pair(line_ending, line_ending), Elf::parser), + Elves::new, + )(input) + } + + fn new(mut elves: Vec<Elf>) -> Elves { + elves.sort_unstable_by_key(|elf| elf.total_calories()); + Elves { elves } + } + + fn max_calories_sum(&self, count: usize) -> u32 { + self.elves + .iter() + .rev() + .take(count) + .map(|elf| elf.total_calories()) + .sum() + } +} + +impl Elf { + fn parser(input: &str) -> IResult<&str, Elf> { + map(separated_list1(line_ending, nom_u32), |calories| Elf { + calories, + })(input) + } + + fn total_calories(&self) -> u32 { + self.calories.iter().sum() + } +} |