Quest 19: Flappy Quack

  • 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

Link to participate: https://everybody.codes/

  • hadesOPM
    link
    fedilink
    arrow-up
    2
    2 months ago

    Rust

    Shortest solution so far.

    use std::collections::{BTreeMap};
    
    use interval::{
        IntervalSet,
        ops::Range,
        prelude::{Bounded, Empty, Intersection, Union},
    };
    
    pub fn solve_part_1(input: &str) -> String {
        let mut data = BTreeMap::new();
        for v in input.lines().map(|l| {
            l.split(",")
                .map(|v| v.parse().unwrap())
                .collect::<Vec<i64>>()
        }) {
            data.entry(v[0]).or_insert(vec![]).push((v[1], v[2]));
        }
        let mut y_ranges = IntervalSet::new(0, 0);
        let mut x = 0;
        for (wall_x, openings) in data.into_iter() {
            let dx = wall_x - x;
            let mut new_ranges = IntervalSet::empty();
            for interval in y_ranges.into_iter() {
                new_ranges = new_ranges.union(&IntervalSet::new(
                    interval.lower() - dx,
                    interval.upper() + dx,
                ));
            }
            let mut openings_intervalset = IntervalSet::empty();
            for (opening_start, opening_size) in openings {
                openings_intervalset = openings_intervalset.union(&IntervalSet::new(
                    opening_start,
                    opening_start + opening_size - 1,
                ));
            }
            y_ranges = new_ranges.intersection(&openings_intervalset);
            x = wall_x;
        }
        let y = y_ranges
            .iter()
            .flat_map(|i| (i.lower()..=i.upper()))
            .find(|y| y % 2 == x % 2)
            .unwrap();
        ((y + x) / 2).to_string()
    }
    
    pub fn solve_part_2(input: &str) -> String {
        solve_part_1(input)
    }
    pub fn solve_part_3(input: &str) -> String {
        solve_part_1(input)
    }