use std::env::args; use std::fs::File; use std::io::BufRead; use std::io::BufReader; fn parse_line(line: &str) -> Result, char> { let mut stack = vec![]; for c in line.chars() { match c { '(' | '[' | '{' | '<' => stack.push(c), ')' => { if stack.pop() != Some('(') { return Err(c); } }, ']' => { if stack.pop() != Some('[') { return Err(c); } }, '}' => { if stack.pop() != Some('{') { return Err(c); } }, '>' => { if stack.pop() != Some('<') { return Err(c); } }, _ => unreachable!(), } } return Ok(stack); } fn main() { let path = args().nth(1).unwrap(); let file = File::open(path).unwrap(); let mut scores = vec![]; for line in BufReader::new(file).lines() { match parse_line(&line.unwrap()) { Ok(v) => { let mut stack = v; let mut score: u64 = 0; stack.reverse(); for c in stack { score *= 5; score += match c { '(' => 1, '[' => 2, '{' => 3, '<' => 4, _ => unreachable!(), }; } scores.push(score); }, Err(_) => {}, } } scores.sort_unstable(); let k = (scores.len() - 1) / 2; print!("{}\n", scores[k]); }