From 86543d2526cf82987fce4d5d2f4409381548efab Mon Sep 17 00:00:00 2001 From: Justin Wernick Date: Thu, 1 Dec 2022 09:30:46 +0200 Subject: The quest for star fruit has begun! --- 2022/src/bin/day_1.rs | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) (limited to '2022/src/bin') 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> { + 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, +} + +#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone)] +struct Elf { + calories: Vec, +} + +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) -> 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() + } +} -- cgit v1.2.3