some minor changes to be cleaner
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
#![warn(clippy::all, clippy::pedantic)]
|
#![warn(clippy::all, clippy::pedantic)]
|
||||||
|
|
||||||
use error_stack::Result;
|
use error_stack::{Report, Result, ResultExt};
|
||||||
use nom::{character::complete, multi::separated_list1, sequence::separated_pair, IResult};
|
use nom::{character::complete, multi::separated_list1, sequence::separated_pair, IResult};
|
||||||
use thiserror::Error;
|
use thiserror::Error;
|
||||||
|
|
||||||
@@ -12,15 +12,16 @@ pub enum Day1Part1Error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn part1(input: &str) -> Result<u64, Day1Part1Error> {
|
pub fn part1(input: &str) -> Result<u64, Day1Part1Error> {
|
||||||
let (_, (mut col1, mut col2)) =
|
let (_, (mut col1, mut col2)) = parse_input(input)
|
||||||
parse_input(input).expect("there should always be valid input from aoc");
|
.map_err(|x| Report::from(x.to_owned()))
|
||||||
col1.sort();
|
.change_context(Day1Part1Error::ParseError)?;
|
||||||
col2.sort();
|
col1.sort_unstable();
|
||||||
|
col2.sort_unstable();
|
||||||
|
|
||||||
Ok(col1
|
Ok(col1
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.zip(col2.iter())
|
.zip(col2.iter())
|
||||||
.map(|(a, b)| u64::max(a, *b) - u64::min(a, *b))
|
.map(|(a, b)| u64::abs_diff(a, *b))
|
||||||
.sum())
|
.sum())
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -30,7 +31,6 @@ fn parse_input(input: &str) -> IResult<&str, (Vec<u64>, Vec<u64>)> {
|
|||||||
separated_pair(complete::u64, complete::space1, complete::u64),
|
separated_pair(complete::u64, complete::space1, complete::u64),
|
||||||
)(input)?;
|
)(input)?;
|
||||||
Ok((input, combo.into_iter().unzip()))
|
Ok((input, combo.into_iter().unzip()))
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
@@ -51,4 +51,3 @@ mod test {
|
|||||||
assert_eq!(result, 11);
|
assert_eq!(result, 11);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -11,6 +11,8 @@ use thiserror::Error;
|
|||||||
pub enum Day1Part2Error {
|
pub enum Day1Part2Error {
|
||||||
#[error("Problem parsing Day 1")]
|
#[error("Problem parsing Day 1")]
|
||||||
ParseError,
|
ParseError,
|
||||||
|
#[error("Catastophic error")]
|
||||||
|
FatalError,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn part2(input: &str) -> Result<u64, Day1Part2Error> {
|
pub fn part2(input: &str) -> Result<u64, Day1Part2Error> {
|
||||||
@@ -22,7 +24,10 @@ pub fn part2(input: &str) -> Result<u64, Day1Part2Error> {
|
|||||||
*val += 1;
|
*val += 1;
|
||||||
acc
|
acc
|
||||||
});
|
});
|
||||||
Ok(col1.iter().map(|x| *x * col2_bucket.get(x).or(Some(&0)).unwrap()).sum())
|
Ok(col1
|
||||||
|
.iter()
|
||||||
|
.map(|x| *x * col2_bucket.get(x).unwrap_or(&0))
|
||||||
|
.sum())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parse_input(input: &str) -> IResult<&str, (Vec<u64>, Vec<u64>)> {
|
fn parse_input(input: &str) -> IResult<&str, (Vec<u64>, Vec<u64>)> {
|
||||||
@@ -51,4 +56,3 @@ mod test {
|
|||||||
assert_eq!(result, 31);
|
assert_eq!(result, 31);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user