From b0e30b1726fcef5db753514d28967a2de94d04f4 Mon Sep 17 00:00:00 2001 From: logaritmisk Date: Wed, 21 Dec 2016 14:08:42 +0100 Subject: [PATCH] 2016/17 --- 2016/17/Cargo.lock | 81 ++++++++++++++++++++++++++ 2016/17/Cargo.toml | 7 +++ 2016/17/src/main.rs | 134 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 222 insertions(+) create mode 100644 2016/17/Cargo.lock create mode 100644 2016/17/Cargo.toml create mode 100644 2016/17/src/main.rs diff --git a/2016/17/Cargo.lock b/2016/17/Cargo.lock new file mode 100644 index 0000000..44f66e6 --- /dev/null +++ b/2016/17/Cargo.lock @@ -0,0 +1,81 @@ +[root] +name = "17" +version = "0.1.0" +dependencies = [ + "rust-crypto 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "gcc" +version = "0.3.40" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "kernel32-sys" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "libc" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "rand" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rust-crypto" +version = "0.2.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "gcc 0.3.40 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rustc-serialize" +version = "0.3.22" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "time" +version = "0.1.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "winapi" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "winapi-build" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[metadata] +"checksum gcc 0.3.40 (registry+https://github.com/rust-lang/crates.io-index)" = "872db9e59486ef2b14f8e8c10e9ef02de2bccef6363d7f34835dedb386b3d950" +"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" +"checksum libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "a51822fc847e7a8101514d1d44e354ba2ffa7d4c194dcab48870740e327cac70" +"checksum rand 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "022e0636ec2519ddae48154b028864bdce4eaf7d35226ab8e65c611be97b189d" +"checksum rust-crypto 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)" = "f76d05d3993fd5f4af9434e8e436db163a12a9d40e1a58a726f27a01dfd12a2a" +"checksum rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "237546c689f20bb44980270c73c3b9edd0891c1be49cc1274406134a66d3957b" +"checksum time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)" = "3c7ec6d62a20df54e07ab3b78b9a3932972f4b7981de295563686849eb3989af" +"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" +"checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" diff --git a/2016/17/Cargo.toml b/2016/17/Cargo.toml new file mode 100644 index 0000000..e51c7fc --- /dev/null +++ b/2016/17/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "17" +version = "0.1.0" +authors = ["logaritmisk "] + +[dependencies] +rust-crypto = "0.2" diff --git a/2016/17/src/main.rs b/2016/17/src/main.rs new file mode 100644 index 0000000..d54f108 --- /dev/null +++ b/2016/17/src/main.rs @@ -0,0 +1,134 @@ +extern crate crypto; + +use crypto::md5::Md5; +use crypto::digest::Digest; + + +pub fn is_open(input: &char) -> bool { + match *input { + 'b' ... 'f' => true, + _ => false + } +} + +pub fn generate(passcode: &str, path: &Vec) -> Vec { + let input = format!("{}{}", passcode, path.iter().map(|x| *x).collect::()); + + let mut md5 = Md5::new(); + + md5.input(input.as_bytes()); + + let hash = md5.result_str().chars().take(4).collect::>(); + + let mut directions = Vec::new(); + + if is_open(&hash[0]) { + directions.push('U'); + } + + if is_open(&hash[1]) { + directions.push('D'); + } + + if is_open(&hash[2]) { + directions.push('L'); + } + + if is_open(&hash[3]) { + directions.push('R'); + } + + directions +} + + +fn main() { + let passcode = "yjjvjgan"; + + let mut variants: Vec<(Vec, (usize, usize))> = Vec::new(); + + variants.push((vec![], (0, 0))); + + while !variants.is_empty() { + let (path, (x, y)) = variants.remove(0); + + if x == 3 && y == 3 { + let end_path = path.iter().map(|c| *c).collect::(); + + println!("{} -> {:?}", end_path.len(), end_path); + + continue; + } + + for m in generate(passcode, &path) { + match m { + 'U' => { + if y > 0 { + let mut m_path = path.clone(); + + m_path.push(m); + + variants.push((m_path, (x, y - 1))); + } + }, + 'D' => { + if y < 3 { + let mut m_path = path.clone(); + + m_path.push(m); + + variants.push((m_path, (x, y + 1))); + } + }, + 'L' => { + if x > 0 { + let mut m_path = path.clone(); + + m_path.push(m); + + variants.push((m_path, (x - 1, y))); + } + }, + 'R' => { + if x < 3 { + let mut m_path = path.clone(); + + m_path.push(m); + + variants.push((m_path, (x + 1, y))); + } + }, + _ => unreachable!() + } + } + } +} + + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_is_open() { + assert_eq!(true, is_open(&'c')); + assert_eq!(false, is_open(&'0')); + } + + #[test] + fn example_01() { + assert_eq!(vec!['U', 'D', 'L'], generate("hijkl", &vec![])); + } + + #[test] + fn example_02() { + assert_eq!(vec!['U', 'L', 'R'], generate("hijkl", &vec!['D'])); + } + + #[test] + fn example_03() { + let expected: Vec = vec![]; + + assert_eq!(expected, generate("hijkl", &vec!['D', 'R'])); + } +}