Quest 13: Unlocking the Mountain

  • 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
    1
    ·
    1 month ago

    Rust

    pub fn solve_part_1(input: &str) -> String {
        let numbers = input
            .lines()
            .map(|l| l.parse().unwrap())
            .collect::<Vec<i64>>();
        let offset = 2025 % (numbers.len() + 1);
        if offset == 0 {
            1
        } else if offset > numbers.len().div_ceil(2) {
            numbers[(numbers.len() - offset) * 2 + 1]
        } else {
            numbers[(offset - 1) * 2]
        }
        .to_string()
    }
    
    fn find_number(ranges: &[(i64, i64)], mut offset: i64, counterclockwise: bool) -> i64 {
        for (from, to) in ranges {
            let segment_size = (to - from) + 1;
            if offset >= segment_size {
                offset -= segment_size;
                continue;
            }
            return if counterclockwise {
                to - offset
            } else {
                from + offset
            };
        }
        panic!("find_number gave up and died");
    }
    
    fn solve_part_2_with_turns(input: &str, turns: i64) -> String {
        let ranges = input
            .lines()
            .map(|l| {
                let (l, r) = l.split_once("-").unwrap();
                (l.parse().unwrap(), r.parse().unwrap())
            })
            .collect::<Vec<(i64, i64)>>();
        let mut clockwise_length = 0;
        let mut clockwise_ranges = vec![];
        let mut counterclockwise_length = 0;
        let mut counterclockwise_ranges = vec![];
        for (i, (from, to)) in ranges.into_iter().enumerate() {
            if i % 2 == 0 {
                clockwise_length += to - from + 1;
                clockwise_ranges.push((from, to));
            } else {
                counterclockwise_length += to - from + 1;
                counterclockwise_ranges.push((from, to));
            }
        }
        counterclockwise_ranges.reverse();
        let offset = turns % (clockwise_length + counterclockwise_length + 1);
        if offset == 0 {
            1
        } else if offset > clockwise_length {
            find_number(
                &counterclockwise_ranges,
                offset - clockwise_length - 1,
                true,
            )
        } else {
            find_number(&clockwise_ranges, offset - 1, false)
        }
        .to_string()
    }
    
    pub fn solve_part_2(input: &str) -> String {
        solve_part_2_with_turns(input, 20252025)
    }
    
    pub fn solve_part_3(input: &str) -> String {
        solve_part_2_with_turns(input, 202520252025)
    }