diff --git a/src/day01.rs b/src/day01.rs new file mode 100644 index 0000000..a376006 --- /dev/null +++ b/src/day01.rs @@ -0,0 +1,33 @@ +use crate::utils; +use anyhow::Result; + +fn count_incrementing_windows(window: usize, v: &[i64]) -> usize { + v[window..].iter().zip(v).filter(|(b, a)| b > a).count() +} + +pub(crate) fn run() -> Result<(usize, usize)> { + let data = utils::read_i64s("data/day01.txt")?; + Ok(( + count_incrementing_windows(1, &data), + count_incrementing_windows(3, &data), + )) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_example() { + let data = utils::read_i64s("data/day01-test.txt").unwrap(); + assert_eq!(count_incrementing_windows(1, &data), 7); + assert_eq!(count_incrementing_windows(3, &data), 5); + } + + #[test] + fn test_my_data() { + let data = utils::read_i64s("data/day01.txt").unwrap(); + assert_eq!(count_incrementing_windows(1, &data), 1298); + assert_eq!(count_incrementing_windows(3, &data), 1248); + } +} diff --git a/src/main.rs b/src/main.rs index a22c59a..05bf281 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,35 +1,9 @@ use anyhow::Result; -use std::fs; -fn read_i64s(filename: &str) -> Result> { - Ok(read_file(filename)? - .lines() - .map(|s| s.parse::().expect("i64 parse error")) - .collect()) -} - -fn read_file(filename: &str) -> Result { - Ok(fs::read_to_string(filename)?) -} - -fn count_incrementing_windows(window: usize, v: &[i64]) -> usize { - v[window..].iter().zip(v).filter(|(b, a)| b > a).count() -} - -fn day01() -> Result<(usize, usize)> { - let data = read_i64s("data/day01-test.txt")?; - assert_eq!(count_incrementing_windows(1, &data), 7); - assert_eq!(count_incrementing_windows(3, &data), 5); - - let data = read_i64s("data/day01.txt")?; - let part1 = count_incrementing_windows(1, &data); - let part2 = count_incrementing_windows(3, &data); - assert_eq!(part1, 1298); - assert_eq!(part2, 1248); - Ok((part1, part2)) -} +mod day01; +mod utils; fn main() -> Result<()> { - println!("day01: {:?}", day01()?); + println!("day01: {:?}", day01::run()?); Ok(()) } diff --git a/src/utils.rs b/src/utils.rs new file mode 100644 index 0000000..898d2fd --- /dev/null +++ b/src/utils.rs @@ -0,0 +1,13 @@ +use anyhow::Result; +use std::fs; + +pub fn read_i64s(filename: &str) -> Result> { + Ok(read_file(filename)? + .lines() + .map(|s| s.parse::().expect("i64 parse error")) + .collect()) +} + +pub fn read_file(filename: &str) -> Result { + Ok(fs::read_to_string(filename)?) +}