75 lines
1.7 KiB
Rust
75 lines
1.7 KiB
Rust
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 {
|
|
use super::*;
|
|
|
|
#[test]
|
|
fn part1() {
|
|
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);
|
|
}
|
|
}
|