summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZhongheng Liu <z.liu@outlook.com.gr>2024-12-11 21:05:59 +0200
committerZhongheng Liu <z.liu@outlook.com.gr>2024-12-11 21:05:59 +0200
commit057acf84565cc22921f7344920416cb8d180381d (patch)
tree16f56e918194a6d688bb5a4dddc16fb619cc420a
parent71a7dba50c06d35e8f1fe662cce89cade514cc82 (diff)
downloadadvent2024-057acf84565cc22921f7344920416cb8d180381d.tar.gz
advent2024-057acf84565cc22921f7344920416cb8d180381d.tar.bz2
advent2024-057acf84565cc22921f7344920416cb8d180381d.zip
feat: day 1 and 2 code in rust
-rw-r--r--src/day1.rs50
-rw-r--r--src/day2.rs74
-rw-r--r--src/main.rs12
3 files changed, 136 insertions, 0 deletions
diff --git a/src/day1.rs b/src/day1.rs
new file mode 100644
index 0000000..137d7f4
--- /dev/null
+++ b/src/day1.rs
@@ -0,0 +1,50 @@
+use std::fs;
+fn parse_input(input_string: &str, column1: &mut Vec<i32>, column2: &mut Vec<i32>) {
+ let mut counter = 0;
+ input_string.split('\n').for_each(|line| {
+ if line.is_empty() {
+ return;
+ }
+ let values = line
+ .split_once(' ')
+ .expect("Expected line to split successfully");
+ // println!("{}, {}", values.0, values.1);
+ let first = values.0.trim().parse::<i32>().unwrap();
+ let second = values.1.trim().parse::<i32>().unwrap();
+ column1.insert(counter, first);
+ column2.insert(counter, second);
+ counter += 1;
+ });
+}
+pub fn part1(input_path: &str) {
+ println!("Part 1, Day 1");
+ let input = fs::read_to_string(input_path).expect("Expected to read the file");
+ let mut loc1: Vec<i32> = Vec::new();
+ let mut loc2: Vec<i32> = Vec::new();
+ parse_input(&input, &mut loc1, &mut loc2);
+ let mut sum = 0;
+ for i in 0..loc1.len() {
+ let diff = (loc1[i] - loc2[i]).abs();
+ // println!("1: {}, 2: {}, d: {}", loc1[i], loc2[i], diff);
+ sum += diff;
+ }
+ println!("Solution: {}", sum);
+}
+pub fn part2(input_path: &str) {
+ println!("Part 2, Day 1");
+ let input = fs::read_to_string(input_path).expect("Expected to read file normally");
+ let mut list1: Vec<i32> = Vec::new();
+ let mut list2: Vec<i32> = Vec::new();
+ parse_input(&input, &mut list1, &mut list2);
+ let mut similarity_score_sum = 0;
+ for elem in &list1 {
+ let mut occurences = 0;
+ for i in &list2 {
+ if elem == i {
+ occurences += 1;
+ }
+ }
+ similarity_score_sum += elem * occurences;
+ }
+ println!("Solution: {}", similarity_score_sum);
+}
diff --git a/src/day2.rs b/src/day2.rs
new file mode 100644
index 0000000..81e1ac0
--- /dev/null
+++ b/src/day2.rs
@@ -0,0 +1,74 @@
+use std::fs;
+fn parse_input(input_file_path: &str, data: &mut Vec<Vec<i32>>) {
+ let input =
+ fs::read_to_string(input_file_path).expect("Expected to parse string successfully!");
+ let mut i = 0;
+ for line in input.split('\n') {
+ if line.is_empty() {
+ return;
+ }
+ // println!("line: {}", line);
+ let items = line
+ .split(' ')
+ .map(|item| return item.trim().parse::<i32>().unwrap());
+ let mut tmp: Vec<i32> = vec![];
+ for (j, item) in items.enumerate() {
+ tmp.insert(j, item);
+ }
+ data.insert(i, tmp);
+ i += 1;
+ }
+}
+fn is_safe(arr: &[i32]) -> bool {
+ let mut is_increasing = true;
+ let mut is_decreasing = true;
+ for i in 0..arr.len() - 1 {
+ let diff = arr[i] - arr[i + 1];
+ if diff.abs() < 1 || diff.abs() > 3 {
+ return false;
+ }
+ if arr[i] - arr[i + 1] > 0 {
+ is_increasing = false;
+ }
+ if arr[i] - arr[i + 1] < 0 {
+ is_decreasing = false;
+ }
+ }
+ is_increasing || is_decreasing
+}
+fn is_also_safe(arr: &[i32]) -> bool {
+ let safe = is_safe(arr);
+ let mut also_safe = false;
+ if !safe {
+ for (i, _item) in arr.iter().enumerate() {
+ let mut test = arr.to_vec();
+ test.remove(i);
+ also_safe = if is_safe(&test) {true} else {also_safe};
+ }
+ }
+ safe || also_safe
+}
+pub fn part1(input_file_path: &str) {
+ println!("Part 1, Day 2");
+ let mut data = Vec::new();
+ parse_input(input_file_path, &mut data);
+ let mut c = 0;
+ for line in data {
+ if is_safe(&line) {
+ c += 1;
+ }
+ }
+ println!("Safe lines: {}", c);
+}
+pub fn part2(input_file_path: &str) {
+ println!("Part 2, Day 2");
+ let mut data = Vec::new();
+ parse_input(input_file_path, &mut data);
+ let mut c = 0;
+ for line in data {
+ if is_also_safe(&line) {
+ c += 1;
+ }
+ }
+ println!("Safe lines: {}", c);
+}
diff --git a/src/main.rs b/src/main.rs
new file mode 100644
index 0000000..c6bd8d8
--- /dev/null
+++ b/src/main.rs
@@ -0,0 +1,12 @@
+use std::{
+ env,
+ fs,
+};
+mod day1;
+mod day2;
+fn main() {
+ day1::part1("./day1.input");
+ day1::part2("./day1.input");
+ day2::part1("./day2.input");
+ day2::part2("./day2.input");
+}