From 34f5a96e1ecb01e40605fca13cb761367bcfcda0 Mon Sep 17 00:00:00 2001 From: logaritmisk Date: Wed, 21 Dec 2016 14:32:08 +0100 Subject: [PATCH] 2016/18 --- 2016/18/Cargo.lock | 4 ++ 2016/18/Cargo.toml | 6 +++ 2016/18/src/main.rs | 101 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 111 insertions(+) create mode 100644 2016/18/Cargo.lock create mode 100644 2016/18/Cargo.toml create mode 100644 2016/18/src/main.rs diff --git a/2016/18/Cargo.lock b/2016/18/Cargo.lock new file mode 100644 index 0000000..5b16d80 --- /dev/null +++ b/2016/18/Cargo.lock @@ -0,0 +1,4 @@ +[root] +name = "18" +version = "0.1.0" + diff --git a/2016/18/Cargo.toml b/2016/18/Cargo.toml new file mode 100644 index 0000000..8659fc6 --- /dev/null +++ b/2016/18/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "18" +version = "0.1.0" +authors = ["logaritmisk "] + +[dependencies] diff --git a/2016/18/src/main.rs b/2016/18/src/main.rs new file mode 100644 index 0000000..b3dde43 --- /dev/null +++ b/2016/18/src/main.rs @@ -0,0 +1,101 @@ +fn is_safe(l: char, c: char, r: char) -> bool { + // Rule #1. + if l == '^' && c == '^' && r == '.' { + return false; + } + + // Rule #2. + if l == '.' && c == '^' && r == '^' { + return false; + } + + // Rule #3. + if l == '^' && c == '.' && r == '.' { + return false; + } + + // Rule #4. + if l == '.' && c == '.' && r == '^' { + return false; + } + + true +} + +pub fn evaluate(input: &str) -> String { + let input = input.chars().collect::>(); + let mut output = String::new(); + + for i in 0..input.len() { + let c = if i == 0 { + if is_safe('.', input[i], input[i + 1]) { + '.' + } else { + '^' + } + } else if i == input.len() - 1 { + if is_safe(input[i - 1], input[i], '.') { + '.' + } else { + '^' + } + } else { + if is_safe(input[i - 1], input[i], input[i + 1]) { + '.' + } else { + '^' + } + }; + + output.push(c); + } + + output +} + +fn main() { + let mut map = Vec::new(); + + map.push(".^^^^^.^^.^^^.^...^..^^.^.^..^^^^^^^^^^..^...^^.^..^^^^..^^^^...^.^.^^^^^^^^....^..^^^^^^.^^^.^^^.^^".to_owned()); + + while map.len() < 400000 { + let next = { + let last = map.last().unwrap(); + + evaluate(last) + }; + + map.push(next); + } + + let count: usize = map.iter() + .map(|row| { + row.chars() + .filter(|c| *c == '.') + .count() + }) + .sum(); + + println!("safe_tiles={}", count); +} + + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn example_01() { + assert_eq!(".^^^^".to_owned(), evaluate("..^^.")); + } + + #[test] + fn example_02() { + assert_eq!("^^..^".to_owned(), evaluate(".^^^^")); + } + + #[test] + fn example_03() { + assert_eq!("^^^...^..^".to_owned(), evaluate(".^^.^.^^^^")); + } +}