summaryrefslogtreecommitdiff
path: root/day10
diff options
context:
space:
mode:
authorSanto Cariotti <santo@dcariotti.me>2021-12-14 21:31:50 +0100
committerSanto Cariotti <santo@dcariotti.me>2021-12-14 21:31:50 +0100
commit6e10cc2773fcaff64902b13f44443da014f38be7 (patch)
treedfd4e3dc0ea473150eb2bb1de6d94107e77dd518 /day10
parent70637c2a63a9f99e8e97e679ad896729b3764607 (diff)
Add part2 of day10
Diffstat (limited to 'day10')
-rw-r--r--day10/src/lib.rs88
1 files changed, 88 insertions, 0 deletions
diff --git a/day10/src/lib.rs b/day10/src/lib.rs
index f483420..6cf54ad 100644
--- a/day10/src/lib.rs
+++ b/day10/src/lib.rs
@@ -81,6 +81,80 @@ impl SyntaxLines {
result
}
+
+ pub fn part2(&self) -> u64 {
+ let mut scores = Vec::<u64>::new();
+
+ for line in &self.lines {
+ let mut qopen = VecDeque::new();
+ let mut panic_char = ' ';
+ let mut result: u64 = 0;
+
+ for character in line.chars() {
+ match character {
+ c if character == '('
+ || character == '['
+ || character == '{'
+ || character == '<' =>
+ {
+ qopen.push_back(c);
+ }
+ c if character == ')'
+ || character == ']'
+ || character == '}'
+ || character == '>' =>
+ {
+ match qopen.pop_back() {
+ Some(bracket) => {
+ let mut error = false;
+ if c == ')' && bracket != '(' {
+ error = true;
+ } else if c == ']' && bracket != '[' {
+ error = true;
+ } else if c == '}' && bracket != '{' {
+ error = true;
+ } else if c == '>' && bracket != '<' {
+ error = true;
+ }
+
+ if error {
+ panic_char = c;
+ }
+ }
+ None => panic!("Wtf?"),
+ };
+ }
+ _ => {}
+ };
+
+ if panic_char != ' ' {
+ break;
+ }
+ }
+
+ if panic_char == ' ' {
+ while !qopen.is_empty() {
+ let v = qopen.pop_back().unwrap();
+ result *= 5;
+ result += if v == '(' {
+ 1
+ } else if v == '[' {
+ 2
+ } else if v == '{' {
+ 3
+ } else {
+ 4
+ };
+ }
+ scores.push(result);
+ }
+ }
+
+ let middle = scores.len() / 2 as usize;
+ scores.sort();
+
+ scores[middle]
+ }
}
#[cfg(test)]
@@ -95,9 +169,23 @@ mod tests {
}
#[test]
+ fn test_example_part2() {
+ let input: SyntaxLines = include_str!("../example.txt").parse().unwrap();
+ let result = input.part2();
+ assert_eq!(result, 288957);
+ }
+
+ #[test]
fn test_puzzle_input() {
let input: SyntaxLines = include_str!("../input.txt").parse().unwrap();
let result = input.part1();
assert_eq!(result, 392367);
}
+
+ #[test]
+ fn test_puzzle_input_part2() {
+ let input: SyntaxLines = include_str!("../input.txt").parse().unwrap();
+ let result = input.part2();
+ assert_eq!(result, 2192104158);
+ }
}