Quest 8: The Art of Connection

  • 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/

  • hades@programming.devOPM
    link
    fedilink
    arrow-up
    2
    ·
    6 days ago

    Rust

    pub fn solve_part_1(input: &str) -> String {
        let numbers: Vec<i32> = input.split(",").map(|x| x.parse().unwrap()).collect();
        let mut count = 0;
        for i in 1..numbers.len() {
            if numbers[i].abs_diff(numbers[i - 1]) == 16 {
                count += 1;
            }
        }
        count.to_string()
    }
    
    pub fn solve_part_2(input: &str) -> String {
        let numbers: Vec<i32> = input.split(",").map(|x| x.parse().unwrap()).collect();
        let mut lines: Vec<(i32, i32)> = vec![];
        for i in 1..numbers.len() {
            let (a, b) = (numbers[i - 1], numbers[i]);
            if a > b {
                lines.push((b, a));
            } else {
                lines.push((a, b));
            }
        }
        let mut knots = 0;
        for i in 0..lines.len() {
            for j in 0..i {
                let (a, b) = lines[i];
                let (c, d) = lines[j];
                if a == c || a == d || b == c || b == d {
                    continue;
                }
                let c_inside = c > a && c < b;
                let d_inside = d > a && d < b;
                if c_inside != d_inside {
                    knots += 1;
                }
            }
        }
        knots.to_string()
    }
    
    pub fn solve_part_3(input: &str) -> String {
        let numbers: Vec<i32> = input.split(",").map(|x| x.parse().unwrap()).collect();
        let mut lines: Vec<(i32, i32)> = vec![];
        for i in 1..numbers.len() {
            let (a, b) = (numbers[i - 1], numbers[i]);
            if a > b {
                lines.push((b, a));
            } else {
                lines.push((a, b));
            }
        }
        let mut best_cut_threads = i64::MIN;
        for d in 1..=256 {
            for c in 1..d {
                let mut cut_threads = 0;
                for (a, b) in lines.iter().copied() {
                    if a == c || a == d || b == c || b == d {
                        if a == c && b == d {
                            cut_threads += 1;
                        }
                        continue;
                    }
                    let c_inside = c > a && c < b;
                    let d_inside = d > a && d < b;
                    if c_inside != d_inside {
                        cut_threads += 1;
                    }
                }
                if cut_threads > best_cut_threads {
                    best_cut_threads = cut_threads;
                }
            }
        }
        best_cut_threads.to_string()
    }