diff options
-rw-r--r-- | 2017/input/day13.txt | 43 | ||||
-rw-r--r-- | 2017/src/bin/day13.rs | 68 |
2 files changed, 111 insertions, 0 deletions
diff --git a/2017/input/day13.txt b/2017/input/day13.txt new file mode 100644 index 0000000..37916d9 --- /dev/null +++ b/2017/input/day13.txt @@ -0,0 +1,43 @@ +0: 3 +1: 2 +2: 4 +4: 4 +6: 5 +8: 6 +10: 6 +12: 8 +14: 6 +16: 6 +18: 9 +20: 8 +22: 8 +24: 8 +26: 12 +28: 8 +30: 12 +32: 12 +34: 12 +36: 10 +38: 14 +40: 12 +42: 10 +44: 8 +46: 12 +48: 14 +50: 12 +52: 14 +54: 14 +56: 14 +58: 12 +62: 14 +64: 12 +66: 12 +68: 14 +70: 14 +72: 14 +74: 17 +76: 14 +78: 18 +84: 14 +90: 20 +92: 14 \ No newline at end of file diff --git a/2017/src/bin/day13.rs b/2017/src/bin/day13.rs new file mode 100644 index 0000000..360e266 --- /dev/null +++ b/2017/src/bin/day13.rs @@ -0,0 +1,68 @@ +use std::io::{self, Read}; + +#[derive(Debug, Clone, Copy)] +struct Layer { + range: i32, + scanner: i32, + direction: i32, +} + +impl Layer { + fn new(range: i32) -> Self { + Layer { range, scanner: 0, direction: 1 } + } + + fn step(&mut self) { + if self.scanner == 0 { + self.direction = 1; + } else if self.scanner == self.range - 1 { + self.direction = -1; + } + self.scanner += self.direction; + } +} + +fn solve1(input: &str) -> usize { + let mut layers = vec![]; + for line in input.lines() { + let mut iter = line.split(": "); + let index: usize = iter.next().unwrap().parse().unwrap(); + let range = iter.next().unwrap().parse().unwrap(); + layers.resize(index + 1, None); + layers[index] = Some(Layer::new(range)); + } + + let mut severity = 0; + for i in 0..layers.len() { + if let Some(ref layer) = layers[i] { + if layer.scanner == 0 { + severity += i * layer.range as usize; + } + } + + for layer in &mut layers { + layer.as_mut().map(Layer::step); + } + } + + severity +} + +fn main() { + let mut input = String::new(); + io::stdin().read_to_string(&mut input).unwrap(); + + println!("Part 1: {}", solve1(&input)); +} + +#[test] +fn part1() { + assert_eq!(24, solve1( +"\ +0: 3 +1: 2 +4: 4 +6: 4 +" + )); +} |