-
Notifications
You must be signed in to change notification settings - Fork 0
/
mod.rs
73 lines (58 loc) · 1.6 KB
/
mod.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
use std::num::ParseIntError;
use crate::utils::ParseError;
#[aoc_generator(day1)]
pub fn input_generator(input: &str) -> Result<Vec<u32>, ParseIntError> {
let mut elves: Vec<u32> = vec![];
let mut buffer: Vec<u32> = vec![];
for line in input.lines() {
if line.is_empty() {
elves.push(buffer.iter().sum());
buffer = vec![];
continue;
}
buffer.push(line.parse::<u32>()?);
}
if !buffer.is_empty() {
elves.push(buffer.iter().sum());
}
Ok(elves)
}
#[aoc(day1, part1)]
pub fn solve_part1(input: &[u32]) -> Result<u32, ParseError> {
Ok(*input
.iter()
.max()
.ok_or_else(|| ParseError::new("Could not find max element"))?)
}
#[aoc(day1, part2)]
pub fn solve_part2(input: &Vec<u32>) -> Result<u32, ParseError> {
if input.len() < 3 {
return Err(ParseError::new("Not enough elves"))?;
}
let mut list = input.clone();
list.sort();
let top3sum = list.iter().rev().take(3).sum();
Ok(top3sum)
}
#[cfg(test)]
mod test {
use super::*;
fn sample_input() -> &'static str {
"1000\n2000\n3000\n\n4000\n\n5000\n6000\n\n7000\n8000\n9000\n\n10000"
}
fn sample() -> Vec<u32> {
input_generator(sample_input()).unwrap()
}
#[test]
fn part1_sample() -> Result<(), ParseError> {
let sample = sample();
assert_eq!(solve_part1(&sample)?, 24_000);
Ok(())
}
#[test]
fn part2_sample() -> Result<(), ParseError> {
let sample = sample();
assert_eq!(solve_part2(&sample)?, 45_000);
Ok(())
}
}