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() } }