From a696b158cacf9b760f70d3d493ae146e580cceee Mon Sep 17 00:00:00 2001 From: Curtis McEnroe Date: Thu, 14 Dec 2017 22:05:16 -0500 Subject: Day 9 I was really sick at the start of the week, okay? --- 2017/src/bin/day09.rs | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 2017/src/bin/day09.rs (limited to '2017/src/bin') diff --git a/2017/src/bin/day09.rs b/2017/src/bin/day09.rs new file mode 100644 index 0000000..a8492d0 --- /dev/null +++ b/2017/src/bin/day09.rs @@ -0,0 +1,61 @@ +use std::io::{self, Read}; + +#[derive(Debug, Clone, Copy)] +enum State { + Group, + Garbage, + Ignore, +} + +use self::State::*; + +#[derive(Debug, Clone, Copy)] +struct Machine(State, u32); + +impl Machine { + fn next(self, input: char) -> Self { + match (self.0, input) { + (Ignore, _) => Machine(Garbage, self.1), + (Garbage, '!') => Machine(Ignore, self.1), + (Garbage, '>') => Machine(Group, self.1), + (Garbage, _) => self, + (Group, '<') => Machine(Garbage, self.1), + (Group, '{') => Machine(Group, self.1 + 1), + (Group, '}') => Machine(Group, self.1 - 1), + (Group, ',') => self, + _ => unimplemented!(), + } + } +} + +fn solve1(input: &str) -> u32 { + let mut score = 0; + let mut state = Machine(Group, 0); + for c in input.chars() { + let next = state.next(c); + if next.1 > state.1 { + score += next.1; + } + state = next; + } + score +} + +fn main() { + let mut input = String::new(); + io::stdin().read_to_string(&mut input).unwrap(); + + println!("Part 1: {}", solve1(input.trim())); +} + +#[test] +fn part1() { + assert_eq!(1, solve1("{}")); + assert_eq!(6, solve1("{{{}}}")); + assert_eq!(5, solve1("{{},{}}")); + assert_eq!(16, solve1("{{{},{},{{}}}}")); + assert_eq!(1, solve1("{,,,}")); + assert_eq!(9, solve1("{{},{},{},{}}")); + assert_eq!(9, solve1("{{},{},{},{}}")); + assert_eq!(3, solve1("{{},{},{},{}}")); +} -- cgit 1.4.1