Add day 1
This commit is contained in:
@@ -0,0 +1,57 @@
|
||||
use aoc2022::StdError;
|
||||
use std::fs::File;
|
||||
use std::io::{BufRead, BufReader};
|
||||
|
||||
struct BlanklineSplitter<T: Iterator> {
|
||||
iter: T,
|
||||
}
|
||||
|
||||
impl<T: Iterator<Item = String>> BlanklineSplitter<T> {
|
||||
fn new(iter: T) -> Self {
|
||||
BlanklineSplitter { iter }
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: Iterator<Item = String>> Iterator for BlanklineSplitter<T> {
|
||||
type Item = Vec<String>;
|
||||
fn next(&mut self) -> Option<Self::Item> {
|
||||
let mut acc = vec![];
|
||||
loop {
|
||||
match self.iter.next().as_deref() {
|
||||
Some("") => {
|
||||
// Skip over multiple empty lines
|
||||
if !acc.is_empty() {
|
||||
break;
|
||||
}
|
||||
}
|
||||
Some(l) => acc.push(l.into()),
|
||||
None => break,
|
||||
}
|
||||
}
|
||||
if acc.is_empty() {
|
||||
return None;
|
||||
} else {
|
||||
return Some(acc);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn main() -> StdError<()> {
|
||||
let lines = BufReader::new(File::open("input/day1.txt")?)
|
||||
.lines()
|
||||
.filter_map(Result::ok);
|
||||
let mut sums: Vec<_> = BlanklineSplitter::new(lines)
|
||||
.map(|e| {
|
||||
e.iter()
|
||||
.map(|l| l.parse::<u32>())
|
||||
.filter_map(Result::ok)
|
||||
.sum::<u32>()
|
||||
})
|
||||
.collect();
|
||||
sums.sort_by(|a, b| b.cmp(a));
|
||||
let max = sums.iter().max().unwrap();
|
||||
println!("Part 1: {}", max);
|
||||
let top3 = sums[0..3].iter().sum::<u32>();
|
||||
println!("Part 2: {}", top3);
|
||||
Ok(())
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
pub type StdError<T> = Result<T, Box<dyn std::error::Error>>;
|
||||
@@ -0,0 +1,3 @@
|
||||
fn main() {
|
||||
println!("Hello, world!");
|
||||
}
|
||||
Reference in New Issue
Block a user