Skip to content

Instantly share code, notes, and snippets.

@CallumTeesdale
Last active December 1, 2022 15:35
Show Gist options
  • Save CallumTeesdale/e0008519b5dae235c2ff36f117320640 to your computer and use it in GitHub Desktop.
Save CallumTeesdale/e0008519b5dae235c2ff36f117320640 to your computer and use it in GitHub Desktop.
AOC 2022, Day 1
fn main() {
let input = include_str!("input.txt");
let elves = get_elves(input);
let answer_1 = part_1(&elves);
let answer_2 = part_2(&elves);
println!("{}", answer_1);
println!("{}", answer_2);
}
fn get_elves(input: &str) -> Vec<Vec<u32>> {
input.lines()
.fold((Vec::new(), Vec::new()), |(mut elves, mut elf), line| {
if line.is_empty() {
elves.push(elf);
(elves, Vec::new())
} else {
elf.push(line.parse().unwrap());
(elves, elf)
}
}).0
}
/// Returns the total calories of the elf with the most calories
/// # Examples
/// ```
/// let elves = vec![vec![1000, 2000, 3000], vec![4000], vec![5000, 6000], vec![7000, 8000, 9000], vec![10000]];
/// assert_eq!(part_1(&elves), 24000);
/// ```
fn part_1(elves: &Vec<Vec<u32>>) -> u32 {
elves
.iter()
.map(|elf| elf.iter().sum())
.max()
.unwrap()
}
/// Returns the sum of the top three elves
/// # Examples
/// ```
/// let elves = vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8, 9], vec![10, 11, 12]];
/// assert_eq!(part_2(&elves), 72);
/// ```
///
/// You can also, if you add itertools to your Cargo.toml, use the itertools crate to do this in one line
/// ```
/// use itertools::Itertools;
/// let elves = vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8, 9], vec![10, 11, 12]];
/// assert_eq!(elves.iter().map(|elf| elf.iter().sum()).sorted().rev().take(3).sum::<u32>(), 72);
/// ```
fn part_2(elves: &Vec<Vec<u32>>) -> u32 {
elves.iter()
.map(|elf| elf.iter().sum::<u32>())
.fold(vec![0, 0, 0], |mut acc, x| {
if x > acc[0] {
acc[2] = acc[1];
acc[1] = acc[0];
acc[0] = x;
} else if x > acc[1] {
acc[2] = acc[1];
acc[1] = x;
} else if x > acc[2] {
acc[2] = x;
}
acc
})
.iter()
.sum()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_part_1() {
let elves = vec![vec![1000, 2000, 3000], vec![4000], vec![5000, 6000], vec![7000, 8000, 9000], vec![10000]];
assert_eq!(part_1(&elves), 24000);
}
#[test]
fn test_part_2() {
let elves = vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8, 9], vec![10, 11, 12]];
assert_eq!(part_2(&elves), 72);
}
#[test]
fn test_part_2_with_itertools() {
use itertools::Itertools;
let elves = vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8, 9], vec![10, 11, 12]];
assert_eq!(elves.iter().map(|elf| elf.iter().sum::<u32>()).sorted().rev().take(3).sum::<u32>(), 72);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment