mirror of
https://github.com/bertptrs/adventofcode.git
synced 2025-12-25 21:00:31 +01:00
Add solutions for day 14.
Much hash. Very memoize.
This commit is contained in:
7
2016/day-14/Cargo.toml
Normal file
7
2016/day-14/Cargo.toml
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
[package]
|
||||||
|
name = "day-14"
|
||||||
|
version = "0.1.0"
|
||||||
|
authors = ["Bert Peters <bert.ljpeters@gmail.com>"]
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
rust-crypto = "^0.2"
|
||||||
130
2016/day-14/src/main.rs
Normal file
130
2016/day-14/src/main.rs
Normal file
@@ -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<i32, String>) -> 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<char>
|
||||||
|
{
|
||||||
|
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<i32, String>) -> 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();
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user