From 7cb548a8e5969121bf3d295c23bb650282772681 Mon Sep 17 00:00:00 2001 From: Bert Peters Date: Mon, 5 Dec 2016 23:54:19 +0100 Subject: [PATCH] Solution to day 5. --- 2016/day-05/Cargo.toml | 7 +++++ 2016/day-05/src/main.rs | 65 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 2016/day-05/Cargo.toml create mode 100644 2016/day-05/src/main.rs diff --git a/2016/day-05/Cargo.toml b/2016/day-05/Cargo.toml new file mode 100644 index 0000000..e6fa64e --- /dev/null +++ b/2016/day-05/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "day-05" +version = "0.1.0" +authors = ["Bert Peters "] + +[dependencies] +rust-crypto = "^0.2" diff --git a/2016/day-05/src/main.rs b/2016/day-05/src/main.rs new file mode 100644 index 0000000..bca2ecd --- /dev/null +++ b/2016/day-05/src/main.rs @@ -0,0 +1,65 @@ +extern crate crypto; + +use crypto::md5::Md5; +use crypto::digest::Digest; + +fn find_hash(word: &str, mut start: i32) -> (char, char, i32) +{ + let mut hasher = Md5::new(); + loop { + let num = start.to_string(); + hasher.reset(); + hasher.input_str(word); + hasher.input_str(&num); + + let hash = hasher.result_str(); + if &hash[0..5] == "00000" { + return (hash.chars().nth(5).unwrap(), hash.chars().nth(6).unwrap(), start); + } + + start += 1; + } +} + +fn valid_pos(c: char) -> bool +{ + '0' <= c && c <= '7' +} + +fn pos(c: char) -> i32 +{ + ((c as u8) - ('0' as u8)) as i32 +} + +fn main() { + let input = "cxdnnyjw"; + + let mut start = 0; + let mut password = ['-'; 8]; + let mut used = [false; 8]; + + let mut found = 0; + let mut printed = 0; + + while found < 8 { + let (c1, c2, num) = find_hash(input, start); + start = num + 1; + + if valid_pos(c1) { + let p = pos(c1) as usize; + if !used[p] { + found += 1; + password[p] = c2; + used[p] = true; + } + } + + if printed < 8 { + print!("{}", c1); + printed += 1; + } + } + + let result: String = password.iter().cloned().collect(); + println!("\n{}", result); +}