Created
January 30, 2026 01:44
-
-
Save icub3d/1760262897c0b480a44f7b3448f2c9b9 to your computer and use it in GitHub Desktop.
Solution for Advent of Code 2017 Day 9
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| use std::time::Instant; | |
| const INPUT: &str = include_str!("inputs/day09.txt"); | |
| fn parse(input: &str) -> &str { | |
| input.trim() | |
| } | |
| fn p1(input: &str) -> usize { | |
| let input = parse(input); | |
| let mut score = 0; | |
| let mut depth = 0; | |
| let mut skip = false; | |
| let mut garbage = false; | |
| for c in input.chars() { | |
| match (skip, garbage, c) { | |
| (true, _, _) => skip = false, // should we skip | |
| (_, _, '!') => skip = true, // turn on skip | |
| (_, true, '>') => garbage = false, // leaving garbage | |
| (_, true, _) => {} // ignore in garbage | |
| (_, _, '<') => garbage = true, // entering garbage | |
| (_, _, '{') => { | |
| // new group | |
| depth += 1; | |
| score += depth | |
| } | |
| (_, _, '}') => depth -= 1, // leaving group | |
| _ => {} | |
| } | |
| } | |
| score | |
| } | |
| fn p2(input: &str) -> usize { | |
| let input = parse(input); | |
| let mut skip = false; | |
| let mut garbage = false; | |
| let mut count = 0; | |
| for c in input.chars() { | |
| match (skip, garbage, c) { | |
| (true, _, _) => skip = false, // should we skip | |
| (_, _, '!') => skip = true, // turn on skip | |
| (_, true, '>') => garbage = false, // leaving garbage | |
| (_, true, _) => count += 1, // count garbage | |
| (_, _, '<') => garbage = true, // entering garbage | |
| _ => {} | |
| } | |
| } | |
| count | |
| } | |
| fn main() { | |
| let now = Instant::now(); | |
| let solution = p1(INPUT); | |
| println!("p1 {:?} {}", now.elapsed(), solution); | |
| let now = Instant::now(); | |
| let solution = p2(INPUT); | |
| println!("p2 {:?} {}", now.elapsed(), solution); | |
| } | |
| #[cfg(test)] | |
| mod tests { | |
| use super::*; | |
| #[test] | |
| fn test_p1() { | |
| let inputs = [ | |
| ("{}", 1), | |
| ("{{{}}},", 6), | |
| ("{{},{}},", 5), | |
| ("{{{},{},{{}}}},", 16), | |
| ("{<a>,<a>,<a>,<a>},", 1), | |
| ("{{<ab>},{<ab>},{<ab>},{<ab>}},", 9), | |
| ("{{<!!>},{<!!>},{<!!>},{<!!>}},", 9), | |
| ("{{<a!>},{<a!>},{<a!>},{<ab>}},", 3), | |
| ]; | |
| inputs.iter().for_each(|(s, v)| assert_eq!(p1(s), *v)); | |
| } | |
| #[test] | |
| fn test_p2() { | |
| let inputs = [ | |
| ("{}", 0), | |
| ("{{{}}},", 0), | |
| ("{{},{}},", 0), | |
| ("{{{},{},{{}}}},", 0), | |
| ("{<a>,<a>,<a>,<a>},", 4), | |
| ("{{<ab>},{<ab>},{<ab>},{<ab>}},", 8), | |
| ("{{<!!>},{<!!>},{<!!>},{<!!>}},", 0), | |
| ]; | |
| inputs.iter().for_each(|(s, v)| assert_eq!(p2(s), *v)); | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment