Rust
Used a sorted/unsorted comparison to solve the first part, the second part was just filling out the else branch.
use std::{
cmp::Ordering,
collections::HashMap,
io::{BufRead, BufReader},
};
fn main() {
let mut lines = BufReader::new(std::fs::File::open("input.txt").unwrap()).lines();
let mut rules: HashMap<u64, Vec<u64>> = HashMap::default();
for line in lines.by_ref() {
let line = line.unwrap();
if line.is_empty() {
break;
}
let lr = line
.split('|')
.map(|el| el.parse::<u64>())
.collect::<Result<Vec<u64>, _>>()
.unwrap();
let left = lr[0];
let right = lr[1];
if let Some(values) = rules.get_mut(&left) {
values.push(right);
values.sort();
} else {
rules.insert(left, vec![right]);
}
}
let mut updates: Vec<Vec<u64>> = Vec::default();
for line in lines {
let line = line.unwrap();
let update = line
.split(',')
.map(|el| el.parse::<u64>())
.collect::<Result<Vec<u64>, _>>()
.unwrap();
updates.push(update);
}
let mut middle_sum = 0;
let mut fixed_middle_sum = 0;
for update in updates {
let mut update_sorted = update.clone();
update_sorted.sort_by(|a, b| {
if let Some(rules) = rules.get(a) {
if rules.contains(b) {
Ordering::Less
} else {
Ordering::Equal
}
} else {
Ordering::Equal
}
});
if update.eq(&update_sorted) {
let middle = update[(update.len() - 1) / 2];
middle_sum += middle;
} else {
let middle = update_sorted[(update_sorted.len() - 1) / 2];
fixed_middle_sum += middle;
}
}
println!("part1: {} part2: {}", middle_sum, fixed_middle_sum);
}