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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
//! # Day 25: The Halting Problem
//!
//! Following the twisty passageways deeper and deeper into the CPU, you finally reach the core of
//! the computer. Here, in the expansive central chamber, you find a grand apparatus that fills the
//! entire room, suspended nanometers above your head.
//!
//! You had always imagined CPUs to be noisy, chaotic places, bustling with activity. Instead, the
//! room is quiet, motionless, and dark.
//!
//! Suddenly, you and the CPU's **garbage collector** startle each other. "It's not often we get
//! many visitors here!", he says. You inquire about the stopped machinery.
//!
//! "It stopped milliseconds ago; not sure why. I'm a garbage collector, not a doctor." You ask what
//! the machine is for.
//!
//! "Programs these days, don't know their origins. That's the **Turing machine**! It's what makes
//! the whole computer work." You try to explain that Turing machines are merely models of
//! computation, but he cuts you off. "No, see, that's just what they **want** you to think.
//! Ultimately, inside every CPU, there's a Turing machine driving the whole thing! Too bad this
//! one's broken. [We're doomed!]"
//!
//! You ask how you can help. "Well, unfortunately, the only way to get the computer running again
//! would be to create a whole new Turing machine from scratch, but there's no **way** you can-" He
//! notices the look on your face, gives you a curious glance, shrugs, and goes back to sweeping the
//! floor.
//!
//! You find the **Turing machine blueprints** (your puzzle input) on a tablet in a nearby pile of
//! debris. Looking back up at the broken Turing machine above, you can start to identify its parts:
//!
//! - A **tape** which contains `0` repeated infinitely to the left and right.
//! - A **cursor**, which can move left or right along the tape and read or write values at its
//!   current position.
//! - A set of **states**, each containing rules about what to do based on the current value under
//!   the cursor.
//!
//! Each slot on the tape has two possible values: `0` (the starting value for all slots) and `1`.
//! Based on whether the cursor is pointing at a `0` or a `1`, the current state says **what value
//! to write** at the current position of the cursor, whether to **move the cursor** left or right
//! one slot, and **which state to use next**.
//!
//! For example, suppose you found the following blueprint:
//!
//! ```txt
//! Begin in state A.
//! Perform a diagnostic checksum after 6 steps.
//!
//! In state A:
//!   If the current value is 0:
//!     - Write the value 1.
//!     - Move one slot to the right.
//!     - Continue with state B.
//!   If the current value is 1:
//!     - Write the value 0.
//!     - Move one slot to the left.
//!     - Continue with state B.
//!
//! In state B:
//!   If the current value is 0:
//!     - Write the value 1.
//!     - Move one slot to the left.
//!     - Continue with state A.
//!   If the current value is 1:
//!     - Write the value 1.
//!     - Move one slot to the right.
//!     - Continue with state A.
//! ```
//!
//! Running it until the number of steps required to take the listed **diagnostic checksum** would
//! result in the following tape configurations (with the **cursor** marked in square brackets):
//!
//! ```txt
//! ... 0  0  0 [0] 0  0 ... (before any steps; about to run state A)
//! ... 0  0  0  1 [0] 0 ... (after 1 step;     about to run state B)
//! ... 0  0  0 [1] 1  0 ... (after 2 steps;    about to run state A)
//! ... 0  0 [0] 0  1  0 ... (after 3 steps;    about to run state B)
//! ... 0 [0] 1  0  1  0 ... (after 4 steps;    about to run state A)
//! ... 0  1 [1] 0  1  0 ... (after 5 steps;    about to run state B)
//! ... 0  1  1 [0] 1  0 ... (after 6 steps;    about to run state A)
//! ```
//!
//! The CPU can confirm that the Turing machine is working by taking a **diagnostic checksum** after
//! a specific number of steps (given in the blueprint). Once the specified number of steps have
//! been executed, the Turing machine should pause; once it does, count the number of times `1`
//! appears on the tape. In the above example, the **diagnostic checksum** is **`3`**.
//!
//! Recreate the Turing machine and save the computer! **What is the diagnostic checksum** it
//! produces once it's working again?
//!
//! [We're doomed!]: https://www.youtube.com/watch?v=cTwZZz0HV8I

use anyhow::Result;

pub const INPUT: &str = include_str!("d25.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() {}
}