1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
//! # Day 14: One-Time Pad
//!
//! In order to communicate securely with Santa while you're on this mission, you've been using a
//! [one-time pad] that you [generate] using a pre-agreed algorithm. Unfortunately, you've run out
//! of keys in your one-time pad, and so you need to generate some more.
//!
//! To generate keys, you first get a stream of random data by taking the [MD5] of a pre-arranged
//! [salt] (your puzzle input) and an increasing integer index (starting with `0`, and represented
//! in decimal); the resulting MD5 hash should be represented as a string of **lowercase**
//! hexadecimal digits.
//!
//! However, not all of these MD5 hashes are **keys**, and you need `64` new keys for your one-time
//! pad. A hash is a key **only if**:
//!
//! - It contains **three** of the same character in a row, like `777`. Only consider the first such
//!   triplet in a hash.
//! - One of the next `1000` hashes in the stream contains that same character **five** times in a
//!   row, like `77777`.
//!
//! Considering future hashes for five-of-a-kind sequences does not cause those hashes to be
//! skipped; instead, regardless of whether the current hash is a key, always resume testing for
//! keys starting with the very next hash.
//!
//! For example, if the pre-arranged salt is `abc`:
//!
//! - The first index which produces a triple is `18`, because the MD5 hash of `abc18` contains
//!   `...cc38887a5....` However, index `18` does not count as a key for your one-time pad, because
//!   none of the next thousand hashes (index `19` through index `1018`) contain `88888`.
//! - The next index which produces a triple is `39`; the hash of `abc39` contains `eee`. It is also
//!   the first key: one of the next thousand hashes (the one at index 816) contains `eeeee`.
//! - None of the next six triples are keys, but the one after that, at index `92`, is: it contains
//!   `999` and index `200` contains `99999`.
//! - Eventually, index `22728` meets all of the criteria to generate the `64`th key.
//!
//! So, using our example salt of `abc`, index `22728` produces the `64`th key.
//!
//! Given the actual salt in your puzzle input, **what index** produces your `64`th one-time pad
//! key?
//!
//! [one-time pad]: https://en.wikipedia.org/wiki/One-time_pad
//! [generate]: https://en.wikipedia.org/wiki/Security_through_obscurity
//! [MD5]: https://en.wikipedia.org/wiki/MD5
//! [salt]: https://en.wikipedia.org/wiki/Salt_(cryptography)

use anyhow::Result;

pub const INPUT: &str = include_str!("d14.txt");

pub fn solve_part_one(input: &str) -> Result<i64> {
    Ok(0)
}

pub fn solve_part_two(input: &str) -> Result<i64> {
    Ok(0)
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn part_one() {}

    #[test]
    fn part_two() {}
}