use core::panic; pub fn process_part1(input: &str) -> i32 { input .chars() .map(|char| { if char == '(' { 1 } else if char == ')' { -1 } else if char == '\n' { 0 } else { panic!("Expected '(' or ')'") } }) .sum() } pub fn process_part2(input: &str) -> i32 { let mut floor = 0; let mut pos = 0; for char in input.chars() { pos += 1; if char == '(' { floor += 1; } else if char == ')' { floor += -1; } else if char == '\n' { floor += 0; } else { panic!("Expected '(' or ')'") } if floor == -1 { break; } } pos } #[cfg(test)] mod tests_1 { use super::*; #[test] fn it_works() { let result = process_part1("(())"); assert_eq!(result, 0); let result = process_part1("(())"); assert_eq!(result, 0); let result = process_part1("((("); assert_eq!(result, 3); let result = process_part1("(()(()("); assert_eq!(result, 3); let result = process_part1("))((((("); assert_eq!(result, 3); let result = process_part1("())"); assert_eq!(result, -1); let result = process_part1("))("); assert_eq!(result, -1); let result = process_part1(")))"); assert_eq!(result, -3); let result = process_part1(")())())"); assert_eq!(result, -3); } #[test] fn part2() { let result = process_part2(")(())))("); assert_eq!(result, 1); let result = process_part2("()()))))"); assert_eq!(result, 5); } }