From 1ed2085a2c664f86e5e9ac89056fb299b6e8cf30 Mon Sep 17 00:00:00 2001 From: Anders Olsson Date: Sat, 1 Dec 2018 09:44:29 +0100 Subject: [PATCH] 2017/13 --- 2017/13/Cargo.lock | 4 +++ 2017/13/Cargo.toml | 6 ++++ 2017/13/input.txt | 43 +++++++++++++++++++++++++++++ 2017/13/src/main.rs | 67 +++++++++++++++++++++++++++++++++++++++++++++ 2017/13/test.txt | 4 +++ 5 files changed, 124 insertions(+) create mode 100644 2017/13/Cargo.lock create mode 100644 2017/13/Cargo.toml create mode 100644 2017/13/input.txt create mode 100644 2017/13/src/main.rs create mode 100644 2017/13/test.txt diff --git a/2017/13/Cargo.lock b/2017/13/Cargo.lock new file mode 100644 index 0000000..ba26201 --- /dev/null +++ b/2017/13/Cargo.lock @@ -0,0 +1,4 @@ +[[package]] +name = "day-13" +version = "0.1.0" + diff --git a/2017/13/Cargo.toml b/2017/13/Cargo.toml new file mode 100644 index 0000000..3a78d08 --- /dev/null +++ b/2017/13/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "day-13" +version = "0.1.0" +authors = ["Anders Olsson "] + +[dependencies] diff --git a/2017/13/input.txt b/2017/13/input.txt new file mode 100644 index 0000000..ac7af71 --- /dev/null +++ b/2017/13/input.txt @@ -0,0 +1,43 @@ +0: 5 +1: 2 +2: 3 +4: 4 +6: 6 +8: 4 +10: 6 +12: 10 +14: 6 +16: 8 +18: 6 +20: 9 +22: 8 +24: 8 +26: 8 +28: 12 +30: 12 +32: 8 +34: 8 +36: 12 +38: 14 +40: 12 +42: 10 +44: 14 +46: 12 +48: 12 +50: 24 +52: 14 +54: 12 +56: 12 +58: 14 +60: 12 +62: 14 +64: 12 +66: 14 +68: 14 +72: 14 +74: 14 +80: 14 +82: 14 +86: 14 +90: 18 +92: 17 diff --git a/2017/13/src/main.rs b/2017/13/src/main.rs new file mode 100644 index 0000000..6411a4d --- /dev/null +++ b/2017/13/src/main.rs @@ -0,0 +1,67 @@ +use std::io::{self, BufRead}; + +#[derive(Debug)] +struct Layer { + depth: usize, + range: usize, +} + +impl Layer { + fn new(depth: usize, range: usize) -> Layer { + Layer { depth, range } + } + + fn is_scanner_at(&self, delta: usize, index: usize) -> bool { + let time = self.depth + delta; + let c = (self.range - 1) * 2; + + time % c == index || time % c == (c - index) + } + + fn severity(&self) -> usize { + self.depth * self.range + } +} + +fn main() { + let stdin = io::stdin(); + + let firewall = stdin + .lock() + .lines() + .filter_map(Result::ok) + .map(|line| { + let digits = line + .split(": ") + .map(|digit| digit.parse::().expect("failed to parse digit")) + .collect::>(); + + Layer::new(digits[0], digits[1]) + }).collect::>(); + + let mut severity = 0; + + for layer in &firewall { + if layer.is_scanner_at(0, 0) { + severity += layer.severity(); + } + } + + println!("part.one={}", severity); + + let mut delta = 0; + + 'iteration: loop { + for layer in &firewall { + if layer.is_scanner_at(delta, 0) { + delta += 1; + + continue 'iteration; + } + } + + break; + } + + println!("part.two={}", delta); +} diff --git a/2017/13/test.txt b/2017/13/test.txt new file mode 100644 index 0000000..0239024 --- /dev/null +++ b/2017/13/test.txt @@ -0,0 +1,4 @@ +0: 3 +1: 2 +4: 4 +6: 4