This commit is contained in:
2024-12-05 10:17:58 +01:00
parent 3f6a7f31d0
commit a8ea67154b
4 changed files with 85 additions and 0 deletions

2
2024/day5/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
target
input.txt

7
2024/day5/Cargo.lock generated Normal file
View File

@@ -0,0 +1,7 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3
[[package]]
name = "day5"
version = "0.1.0"

6
2024/day5/Cargo.toml Normal file
View File

@@ -0,0 +1,6 @@
[package]
name = "day5"
version = "0.1.0"
edition = "2021"
[dependencies]

70
2024/day5/src/main.rs Normal file
View File

@@ -0,0 +1,70 @@
use std::collections::hash_map::Entry;
use std::collections::HashMap;
use std::fs;
use std::time::Instant;
fn main() {
let input = fs::read_to_string("input.txt").expect("Failed to read input file");
let (rules_str, updates_str) = input.split_once("\n\n").unwrap();
let rules: Vec<&str> = rules_str.split_whitespace().collect::<Vec<&str>>();
let updates: Vec<&str> = updates_str.split_whitespace().collect::<Vec<&str>>();
let mut table: HashMap<&str, Vec<&str>> = HashMap::new();
for r in rules {
let parts = r.split('|').collect::<Vec<&str>>();
if parts.len() == 2 {
table.entry(parts[0]).or_default().push(parts[1]);
}
}
let start = Instant::now();
let (solution1, solution2) = puzzle1_2(&updates, &table);
let end = Instant::now() - start;
println!("Solution 1: {}", solution1);
println!("Solution 2: {}", solution2);
println!("Time: {}", end.as_micros());
}
fn puzzle1_2(updates: &[&str], table: &HashMap<&str, Vec<&str>>) -> (i32, i32) {
let mut counter1 = 0;
let mut counter2 = 0;
for update in updates {
let ud = update.split(',').collect::<Vec<&str>>();
let mut repair = false;
for (i, u) in ud.iter().enumerate() {
if let Some(dependencies) = table.get(*u) {
if dependencies.iter().any(|k| ud[..i].contains(k)) {
counter2 += repair_update(&ud, table);
repair = true;
break;
}
}
}
if !repair {
counter1 += ud[ud.len() / 2].parse::<i32>().unwrap_or(0);
}
}
(counter1, counter2)
}
fn repair_update(ud: &[&str], table: &HashMap<&str, Vec<&str>>) -> i32 {
let mut new_ud = Vec::new();
for u in ud {
let mut counter = new_ud.len();
while let Some(dependencies) = table.get(u) {
if dependencies.iter().any(|k| new_ud[..counter].contains(k)) {
counter -= 1;
} else {
break;
}
}
new_ud.insert(counter, u);
}
new_ud[new_ud.len() / 2].parse::<i32>().unwrap_or(0)
}