Day 25: Code Chronicle

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

  • Gobbel2000
    link
    fedilink
    arrow-up
    2
    ·
    17 hours ago

    Rust

    Nice ending for this year. Lock and key arrays are just added together and all elements must be <= 5. Merry Christmas!

    Solution
    fn flatten_block(block: Vec<Vec<bool>>) -> [u8; 5] {
        let mut flat = [0; 5];
        for row in &block[1..=5] {
            for x in 0..5 {
                if row[x] {
                    flat[x] += 1;
                }
            }
        }
        flat
    }
    
    fn parse(input: &str) -> (Vec<[u8; 5]>, Vec<[u8; 5]>) {
        let mut locks = Vec::new();
        let mut keys = Vec::new();
        for block_s in input.split("\n\n") {
            let block: Vec<Vec<bool>> = block_s
                .lines()
                .map(|l| l.bytes().map(|b| b == b'#').collect::<Vec<bool>>())
                .collect();
            assert_eq!(block.len(), 7);
            // Lock
            if block[0].iter().all(|e| *e) {
                locks.push(flatten_block(block));
            } else {
                keys.push(flatten_block(block));
            }
        }
        (locks, keys)
    }
    
    fn part1(input: String) {
        let (locks, keys) = parse(&input);
        let mut count = 0u32;
        for l in locks {
            for k in &keys {
                if l.iter().zip(k).map(|(li, ki)| li + ki).all(|sum| sum <= 5) {
                    count += 1;
                }
            }
        }
        println!("{count}");
    }
    
    fn part2(_input: String) {
        println!("⭐");
    }
    
    util::aoc_main!();
    

    Also on github