50 lines
1.1 KiB
Rust
50 lines
1.1 KiB
Rust
use aoc_runner_derive::{aoc, aoc_generator};
|
|
|
|
#[aoc_generator(day1)]
|
|
fn generator(s: &str) -> Vec<Vec<u32>> {
|
|
let mut iter = s.lines();
|
|
|
|
let mut res = Vec::new();
|
|
let mut current = Vec::new();
|
|
|
|
loop {
|
|
match iter.next() {
|
|
Some("") => {
|
|
res.push(current);
|
|
current = Vec::new();
|
|
}
|
|
Some(s) => {
|
|
current.push(s.parse::<u32>().unwrap());
|
|
}
|
|
None => {
|
|
res.push(current);
|
|
return res;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
#[aoc(day1, part1)]
|
|
fn part1(input: &[Vec<u32>]) -> u32 {
|
|
input.iter().map(|v| v.iter().sum()).max().unwrap()
|
|
}
|
|
|
|
#[aoc(day1, part2)]
|
|
fn part2(input: &[Vec<u32>]) -> u32 {
|
|
let mut res = (0, 0, 0);
|
|
for mut item in input.iter().map(|v| v.iter().sum()) {
|
|
if res.0 < item {
|
|
std::mem::swap(&mut item, &mut res.0)
|
|
}
|
|
|
|
if res.1 < item {
|
|
std::mem::swap(&mut item, &mut res.1)
|
|
}
|
|
|
|
if res.2 < item {
|
|
std::mem::swap(&mut item, &mut res.2)
|
|
}
|
|
}
|
|
res.0 + res.1 + res.2
|
|
}
|