--- /dev/null
+use std::error::Error;
+use std::path::Path;
+use std::iter::zip;
+
+pub fn run(input: &str) -> Result<(), Box<dyn Error>> {
+ let res = run_part1(&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 mut a = Vec::new();
+ let mut b = Vec::new();
+ for l in input.lines() {
+ let v: Vec<u32> = l.split(" ")
+ .map(|s| s.parse::<u32>().unwrap())
+ .collect();
+ a.push(v[0]);
+ b.push(v[1]);
+ }
+ a.sort();
+ b.sort();
+ let res = zip(a.iter(), b.iter())
+ .map(|(i, j)| i.abs_diff(*j))
+ .sum();
+ Ok(res)
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ static TEXT_INPUT: &str = "\
+3 4
+4 3
+2 5
+1 3
+3 9
+3 3";
+
+ #[test]
+ fn day01_part1() {
+ assert_eq!(11, run_part1(TEXT_INPUT).unwrap());
+ }
+}
use std::fs::File;
use std::io::Read;
+pub mod day01;
+
fn main() {
let args: Vec<String> = env::args().collect();
if args.len() != 3 {
f.read_to_string(&mut input)?;
match day {
+ "day01" => day01::run(&input)?,
_ => return Err(format!("unknown or unimplemented day \"{day}\"").into()),
}
Ok(())