Day 5: Print Queue
Megathread guidelines
- Keep top level comments as only solutions, if you want to say something other than a solution put it in a new post. (replies to comments can be whatever)
- You can send code in code blocks by using three backticks, the code, and then three backticks or use something such as https://topaz.github.io/paste/ if you prefer sending it through a URL
FAQ
- What is this?: Here is a post with a large amount of details: https://programming.dev/post/6637268
- Where do I participate?: https://adventofcode.com/
- Is there a leaderboard for the community?: We have a programming.dev leaderboard with the info on how to join in this post: https://programming.dev/post/6631465
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); }