From 01e0b25f8202e975ca3a2264c86e61e388e135db Mon Sep 17 00:00:00 2001 From: Bert Peters Date: Thu, 15 Dec 2016 21:16:42 +0100 Subject: [PATCH] Add solutions for day 14. Much hash. Very memoize. --- 2016/day-14/Cargo.toml | 7 +++ 2016/day-14/src/main.rs | 130 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 137 insertions(+) create mode 100644 2016/day-14/Cargo.toml create mode 100644 2016/day-14/src/main.rs diff --git a/2016/day-14/Cargo.toml b/2016/day-14/Cargo.toml new file mode 100644 index 0000000..58bd76a --- /dev/null +++ b/2016/day-14/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "day-14" +version = "0.1.0" +authors = ["Bert Peters "] + +[dependencies] +rust-crypto = "^0.2" diff --git a/2016/day-14/src/main.rs b/2016/day-14/src/main.rs new file mode 100644 index 0000000..dd08e44 --- /dev/null +++ b/2016/day-14/src/main.rs @@ -0,0 +1,130 @@ +extern crate crypto; + +use crypto::md5::Md5; +use crypto::digest::Digest; +use std::collections::HashMap; + +const INPUT: &'static str = "ihaygndm"; + +fn get_hash(n: i32, sieve: &mut HashMap) -> String +{ + if !sieve.contains_key(&n) { + let mut hasher = Md5::new(); + hasher.input_str(INPUT); + hasher.input_str(&n.to_string()); + + let result = String::from(hasher.result_str()); + sieve.insert(n, result); + } + + return sieve[&n].clone(); +} + +fn contains_3(data: &str) -> Option +{ + let mut cur = 1; + let mut prev = '\0'; + for c in data.chars() { + if c == prev { + cur += 1; + if cur == 3 { + return Some(c); + } + } else { + prev = c; + cur = 1; + } + } + + return None; +} + +fn get_hash2(n: i32, sieve: &mut HashMap) -> String +{ + if !sieve.contains_key(&n) { + let mut cur = String::from(INPUT); + cur += &n.to_string(); + for _ in 0..2017 { + let mut hasher = Md5::new(); + hasher.input_str(&cur); + cur = String::from(hasher.result_str()); + } + sieve.insert(n, cur); + } + + return sieve[&n].clone(); +} + +fn part1() +{ + let mut n = 0; + let mut found = 0; + let mut sieve = HashMap::new(); + + loop { + let cur = get_hash(n, &mut sieve); + + match contains_3(&cur) { + Some(c) => { + let search: String = (0..5).map(|_| c).collect(); + for i in 1..1001 { + let opt = get_hash(n + i, &mut sieve); + + if opt.contains(&search) { + found += 1; + break; + } + } + + if found == 64 { + println!("Found 64 keys at index {}", n); + return; + } + + }, + _ => {}, + } + + n += 1; + } +} + +fn part2() +{ + let mut n = 0; + let mut found = 0; + let mut sieve = HashMap::new(); + + loop { + let cur = get_hash2(n, &mut sieve); + + match contains_3(&cur) { + Some(c) => { + let search: String = (0..5).map(|_| c).collect(); + for i in 1..1001 { + let opt = get_hash2(n + i, &mut sieve); + + if opt.contains(&search) { + found += 1; + break; + } + } + + if found == 64 { + println!("Found 64 keys at index {}", n); + return; + } + + }, + _ => {}, + } + + n += 1; + } +} + + +fn main() { + part1(); + part2(); +}