summaryrefslogtreecommitdiff
path: root/2022/src/bin/day_1.rs
diff options
context:
space:
mode:
Diffstat (limited to '2022/src/bin/day_1.rs')
-rw-r--r--2022/src/bin/day_1.rs61
1 files changed, 61 insertions, 0 deletions
diff --git a/2022/src/bin/day_1.rs b/2022/src/bin/day_1.rs
new file mode 100644
index 0000000..bc988b7
--- /dev/null
+++ b/2022/src/bin/day_1.rs
@@ -0,0 +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()
+ }
+}