diff --git a/2021/Cargo.lock b/2021/Cargo.lock new file mode 100644 index 0000000..28f50c9 --- /dev/null +++ b/2021/Cargo.lock @@ -0,0 +1,5 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "advent-2021" +version = "0.1.0" diff --git a/2021/Cargo.toml b/2021/Cargo.toml new file mode 100644 index 0000000..372ba32 --- /dev/null +++ b/2021/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "advent-2021" +version = "0.1.0" +authors = ["Joseph Montanaro "] +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/2021/src/lib.rs b/2021/src/lib.rs new file mode 100644 index 0000000..3c75893 --- /dev/null +++ b/2021/src/lib.rs @@ -0,0 +1,15 @@ +use std::io::{BufReader, BufRead}; +use std::fs::File; + + +pub fn iter_nums(filename: &str) -> impl Iterator { + let file = File::open(filename).expect("File not found! Make sure that your current directory is the project root."); + let reader = BufReader::new(file); + + reader.lines().map(|line| + line + .expect("Couldn't split on lines I guess?") + .parse::() + .expect("Could not parse integer!") + ) +} \ No newline at end of file diff --git a/2021/src/main.rs b/2021/src/main.rs new file mode 100644 index 0000000..3d6561b --- /dev/null +++ b/2021/src/main.rs @@ -0,0 +1,33 @@ +mod lib; +use lib::iter_nums; + + +fn main() { + day_one(); +} + + +fn day_one() { + let mut single_increases = 0; + let mut window_increases = 0; + let mut prev = (None, None, None); + for n in iter_nums("data/01.txt") { + if let Some(p) = prev.2 { + // apparently we can't combine "if let" and regular boolean conditions + if n > p { + single_increases += 1; + } + } + + if let (Some(first), Some(second), Some(third)) = prev { + if (n + second + third) > (first + second + third) { + window_increases += 1; + } + } + // would have forgotten this if not for the warning triggered by "let mut" without mutation + prev = (prev.1, prev.2, Some(n)); + } + + println!("One: {}", single_increases); + println!("Two: {}", window_increases); +}