--- /dev/null
+use std::error::Error;
+use std::path::Path;
+
+pub fn run(input: &str) -> Result<(), Box<dyn Error>> {
+ let res = run_part1(&input)?;
+ println!("{res}");
+
+ let res = run_part2(&input)?;
+ println!("{res}");
+
+ Ok(())
+}
+
+fn run_part1(input: &str) -> Result<u32, Box<dyn Error>> {
+ let filename = file!();
+ let filename = Path::new(filename).file_stem().unwrap().to_str().unwrap();
+ println!("Running {} - part 1", filename);
+
+ let levels = input.lines()
+ .map(|l| l.split(" ").map(|v| v.parse::<u32>().unwrap()).collect::<Vec<u32>>())
+ .filter(|v|
+ v.is_sorted_by(|a, b| a.abs_diff(*b) >= 1 && a.abs_diff(*b) <= 3)
+ );
+ let res = levels.clone().filter(|v| v.is_sorted_by(|a, b| a < b)).count() +
+ levels.filter(|v| v.is_sorted_by(|a, b| b < a)).count();
+
+ Ok(res as u32)
+}
+
+fn run_part2(input: &str) -> Result<u32, Box<dyn Error>> {
+ let filename = file!();
+ let filename = Path::new(filename).file_stem().unwrap().to_str().unwrap();
+ println!("Running {} - part 1", filename);
+
+ Ok(0)
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ static TEXT_INPUT: &str = "\
+7 6 4 2 1
+1 2 7 8 9
+9 7 6 2 1
+1 3 2 4 5
+8 6 4 4 1
+1 3 6 7 9";
+
+ #[test]
+ fn test_part1() {
+ assert_eq!(2, run_part1(TEXT_INPUT).unwrap());
+ }
+
+ #[test]
+ fn test_part2() {
+ assert_eq!(0, run_part2(TEXT_INPUT).unwrap());
+ }
+}
use std::io::Read;
pub mod day01;
+pub mod day02;
fn main() {
let args: Vec<String> = env::args().collect();
match day {
"day01" => day01::run(&input)?,
+ "day02" => day02::run(&input)?,
_ => return Err(format!("unknown or unimplemented day \"{day}\"").into()),
}
Ok(())