Advertisement
Guest User

Untitled

a guest
Dec 14th, 2016
780
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 1.29 KB | None | 0 0
  1. extern crate crypto;
  2. extern crate iterslide;
  3.  
  4. use crypto::digest::Digest;
  5. use crypto::md5::Md5;
  6. use iterslide::SlideIterator;
  7.  
  8. const SALT: &'static str = "ahsbgdzn";
  9.  
  10. fn hash(salt: &str, n: u32, loops: usize) -> String {
  11.    let mut md5 = Md5::new();
  12.    md5.input_str(salt);
  13.    md5.input_str(&n.to_string());
  14.    let mut result = md5.result_str();
  15.    for _ in 0..loops {
  16.        md5.reset();
  17.        md5.input_str(&result);
  18.        result = md5.result_str();
  19.    }
  20.    result
  21. }
  22.  
  23. fn threes(s: &str) -> Option<char> {
  24.    s.chars().slide(3).find(|ss| ss[0] == ss[1] && ss[1] == ss[2]).map(|ss| ss[0])
  25. }
  26.  
  27. fn has_five(s: &str, c: char) -> bool {
  28.    s.chars().slide(5).any(|ss| ss.iter().all(|cc| c == *cc))
  29. }
  30.  
  31. fn p14(salt: &str, mut index: u32, loops: usize) -> u32 {
  32.    for v in (0..100000).map(|n| {
  33.        let s = hash(salt, n, loops);
  34.        (s, n)
  35.    }).slide(1001).filter(|v| {
  36.        if let Some(c) = threes(&v[0].0) {
  37.            v.iter().skip(1).any(|&(ref k, _)| has_five(&k, c))
  38.        } else {
  39.            false
  40.        }
  41.    }) {
  42.        if index == 0 {
  43.            return v[0].1;
  44.        } else {
  45.            index -= 1;
  46.        }
  47.    }
  48.    0
  49. }
  50.  
  51. fn main() {
  52.    println!("P1 = {}", p14(SALT, 63, 0));
  53.    println!("P2 = {}", p14(SALT, 63, 2016));
  54. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement