• 4 Posts
  • 23 Comments
Joined 1 year ago
cake
Cake day: June 15th, 2023

help-circle











  • Rust solution:

    use std::cmp::min;
    use std::ops::Range;
    
    fn completer(bracket: char) -> char {
        match bracket {
            ')' => '(',
            '}' => '{',
            ']' => '[',
            _ => unreachable!(),
        }
    }
    
    pub struct Char {
        index: usize,
        value: char,
    }
    
    fn main() {
        let input: String = std::env::args().nth(1).unwrap();
        let mut longest = Range::default();
        {
            let mut current = Range::default();
            let mut stack: Vec = Vec::with_capacity(input.len() << 1);
            let mut streak = false;
            for (i, c) in input.chars().enumerate() {
                match c {
                    ']' | '}' | ')' => {
                        let matched = stack
                            .last()
                            .map(|other| completer(c) == other.value)
                            .unwrap_or_default();
                        if matched {
                            current.start = if streak {
                                min(current.start, stack.pop().unwrap().index)
                            } else {
                                stack.pop().unwrap().index
                            };
                            current.end = i;
                            streak = true;
                        } else {
                            stack.clear();
                            if longest.len() < current.len() {
                                longest = current;
                            }
                            current = Range {
                                start: i + 1,
                                end: i + 1,
                            };
                            streak = false;
                        }
                    }
                    '[' | '{' | '(' => {
                        stack.push(Char { index: i, value: c });
                    }
                    _ => {}
                };
            }
    
            if streak {
                longest = current;
            }
        }
    
        if longest.start != longest.end {
            longest.end += 1;
        }
        println!("{}", &input[longest]);
    }
    

    Also available at: https://pastebin.com/EJsLYPqQ


  • Rust solution:

    fn completer(bracket: char) -> char {
        match bracket {
            '[' => ']',
            '{' => '}',
            '(' => ')',
            ')' => '(',
            '}' => '{',
            ']' => '[',
            _ => unreachable!(),
        }
    }
    
    fn rec(v: &mut Vec, stack: &mut Vec, depth: usize) {
        // If we have more characters in the stack to complete
        // than the space avaiable, bail!
        if stack.len() > depth {
            return;
        }
    
        if depth == 0 {
            let output: String = v.iter().collect();
            println!("{}", output);
            return;
        }
    
        for b in &['[', '{', '('] {
            v.push(*b);
            stack.push(*b);
            rec(v, stack, depth - 1);
            stack.pop();
            v.pop();
        }
    
        if let Some(c) = stack.pop() {
            v.push(completer(c));
            rec(v, stack, depth - 1);
            stack.push(c);
            v.pop();
        }
    }
    
    fn main() {
        let depth: usize = std::env::args().nth(1).unwrap().parse().unwrap();
        let mut v = Vec::with_capacity(depth);
        let mut s = Vec::with_capacity(depth / 2);
        rec(&mut v, &mut s, depth);
    }
    

    Hope you enjoy this!

    Edit: Lemmy makes the usize in angle brackets disappear after parse::. Idk what to do.

    Edit: I kinda fixed it by assigning the type as a part of the variable definition.

    Note to self: the angle bracket problem persists nonetheless.