From b57b2db34d906987a33699d6f9add1c7f01eaffb Mon Sep 17 00:00:00 2001 From: polsevev Date: Sun, 1 Dec 2024 16:41:04 +0100 Subject: [PATCH] Completed day 1 --- .gitignore | 6 +++++ Cargo.toml | 6 +++++ src/main.rs | 14 ++++++++++++ src/one.rs | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/runbase.rs | 21 +++++++++++++++++ 5 files changed, 109 insertions(+) create mode 100644 Cargo.toml create mode 100644 src/main.rs create mode 100644 src/one.rs create mode 100644 src/runbase.rs diff --git a/.gitignore b/.gitignore index 13526e8..2d0e6c6 100644 --- a/.gitignore +++ b/.gitignore @@ -184,3 +184,9 @@ cython_debug/ # option (not recommended) you can uncomment the following to ignore the entire idea folder. #.idea/ + + +# Added by cargo + +/target +/inputs \ No newline at end of file diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..d093923 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "AOC" +version = "0.1.0" +edition = "2021" + +[dependencies] diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..969fce7 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,14 @@ +use one::One; +use runbase::RunBase; + + +mod runbase; +mod one; + +fn main() { + let one = One::new(); + one.run(); +} + + + diff --git a/src/one.rs b/src/one.rs new file mode 100644 index 0000000..3c930eb --- /dev/null +++ b/src/one.rs @@ -0,0 +1,62 @@ +use std::{collections::HashMap, hash::Hash}; + +use crate::runbase::{read_lines, RunBase}; + +pub struct One { + lines: Vec<(i32, i32)>, +} + +impl RunBase for One { + fn new() -> One { + return One { + lines: read_lines("inputs/1") + .into_iter() + .map(|x| { + let mut temp = x.split(" "); + return ( + temp.next().unwrap().parse().unwrap(), + temp.next().unwrap().parse().unwrap(), + ); + }) + .collect(), + }; + } + + fn run(&self) { + self.run_1(); + self.run_2(); + } + + fn run_1(&self) { + let mut left_list: Vec<_> = self.lines.iter().map(|x| x.0).collect(); + let mut right_list: Vec<_> = self.lines.iter().map(|x| x.1).collect(); + left_list.sort(); + right_list.sort(); + let res = left_list + .into_iter() + .enumerate() + .fold(0, |collect: i32, (i, x)| { + collect + (x - right_list.get(i).unwrap()).abs() + }); + println!("{}", res); + } + + fn run_2(&self) { + let mut left_list: Vec<_> = self.lines.iter().map(|x| x.0).collect(); + let mut right_list: Vec<_> = self.lines.iter().map(|x| x.1).collect(); + let mut map:HashMap = HashMap::new(); + + for left in &left_list{ + map.insert(*left, 0); + } + + for right in right_list { + if map.contains_key(&right) { + *map.get_mut(&right).unwrap() += 1; + } + } + + let sum = left_list.into_iter().fold(0, |acc,x| acc + (x * map.get(&x).unwrap()) ); + println!("{}", sum); + } +} diff --git a/src/runbase.rs b/src/runbase.rs new file mode 100644 index 0000000..71e1746 --- /dev/null +++ b/src/runbase.rs @@ -0,0 +1,21 @@ +use std::fs; + + +pub fn read_lines(file: &str) -> Vec{ + match fs::read_to_string(file){ + Ok(x) => { + return x.split("\n").map(|x| x.to_string()).collect::>() + }, + Err(_) => { + panic!("Could not read input file"); + + } + }; +} + +pub trait RunBase { + fn new() -> T; + fn run(&self); + fn run_1(&self); + fn run_2(&self); +} \ No newline at end of file