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

  • madmo@programming.dev
    link
    fedilink
    arrow-up
    1
    ·
    23 days ago

    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);
    }