summaryrefslogtreecommitdiffstats
path: root/src/2021/18/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/2021/18/mod.rs')
-rw-r--r--src/2021/18/mod.rs27
1 files changed, 19 insertions, 8 deletions
diff --git a/src/2021/18/mod.rs b/src/2021/18/mod.rs
index e0616db..bd55f4d 100644
--- a/src/2021/18/mod.rs
+++ b/src/2021/18/mod.rs
@@ -1,7 +1,7 @@
#![allow(clippy::collapsible_else_if)]
#[derive(Clone)]
-enum Number {
+pub enum Number {
Value(u8),
Pair(Box<Number>, Box<Number>),
}
@@ -210,14 +210,19 @@ impl std::fmt::Display for Number {
}
}
-pub fn part1() -> anyhow::Result<i64> {
- let sum: Number = data_lines!()?.map(|line| Number::parse(&line)).sum();
+pub fn parse(
+ fh: std::fs::File,
+) -> anyhow::Result<impl Iterator<Item = Number>> {
+ Ok(crate::util::parse::lines(fh).map(|line| Number::parse(&line)))
+}
+
+pub fn part1(numbers: impl Iterator<Item = Number>) -> anyhow::Result<i64> {
+ let sum: Number = numbers.sum();
Ok(sum.magnitude())
}
-pub fn part2() -> anyhow::Result<i64> {
- let nums: Vec<_> =
- data_lines!()?.map(|line| Number::parse(&line)).collect();
+pub fn part2(numbers: impl Iterator<Item = Number>) -> anyhow::Result<i64> {
+ let nums: Vec<_> = numbers.collect();
let mut max = 0;
for (i, n1) in nums.iter().enumerate() {
for (j, n2) in nums.iter().enumerate() {
@@ -235,6 +240,12 @@ pub fn part2() -> anyhow::Result<i64> {
#[test]
fn test() {
- assert_eq!(part1().unwrap(), 3806);
- assert_eq!(part2().unwrap(), 4727);
+ assert_eq!(
+ part1(parse(crate::util::data(2021, 18).unwrap()).unwrap()).unwrap(),
+ 3806
+ );
+ assert_eq!(
+ part2(parse(crate::util::data(2021, 18).unwrap()).unwrap()).unwrap(),
+ 4727
+ );
}