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
//! # Day 17: Spinlock
//!
//! Suddenly, whirling in the distance, you notice what looks like a massive, pixelated hurricane: a
//! deadly [spinlock]. This spinlock isn't just consuming computing power, but memory, too; vast,
//! digital mountains are being ripped from the ground and consumed by the vortex.
//!
//! If you don't move quickly, fixing that printer will be the least of your problems.
//!
//! This spinlock's algorithm is simple but efficient, quickly consuming everything in its path. It
//! starts with a circular buffer containing only the value `0`, which it marks as the **current
//! position**. It then steps forward through the circular buffer some number of steps (your puzzle
//! input) before inserting the first new value, `1`, after the value it stopped on. The inserted
//! value becomes the **current position**. Then, it steps forward from there the same number of
//! steps, and wherever it stops, inserts after it the second new value, `2`, and uses that as the
//! new **current position** again.
//!
//! It repeats this process of **stepping forward, inserting a new value**, and **using the location
//! of the inserted value as the new current position** a total of **`2017`** times, inserting
//! `2017` as its final operation, and ending with a total of `2018` values (including `0`) in the
//! circular buffer.
//!
//! For example, if the spinlock were to step `3` times per insert, the circular buffer would begin
//! to evolve like this (using parentheses to mark the current position after each iteration of the
//! algorithm):
//!
//! - `(0)`, the initial state before any insertions.
//! - `0 (1)`: the spinlock steps forward three times (`0`, `0`, `0`), and then inserts the first
//!   value, `1`, after it. `1` becomes the current position.
//! - `0 (2) 1`: the spinlock steps forward three times (`0`, `1`, `0`), and then inserts the second
//!   value, `2`, after it. `2` becomes the current position.
//! - `0  2 (3) 1`: the spinlock steps forward three times (`1`, `0`, `2`), and then inserts the
//!   third value, `3`, after it. `3` becomes the current position.
//!
//! And so on:
//!
//! - `0  2 (4) 3  1`
//! - `0 (5) 2  4  3  1`
//! - `0  5  2  4  3 (6) 1`
//! - `0  5 (7) 2  4  3  6  1`
//! - `0  5  7  2  4  3 (8) 6  1`
//! - `0 (9) 5  7  2  4  3  8  6  1`
//!
//! Eventually, after 2017 insertions, the section of the circular buffer near the last insertion
//! looks like this:
//!
//! ```txt
//! 1512  1134  151 (2017) 638  1513  851
//! ```
//!
//! Perhaps, if you can identify the value that will ultimately be **after** the last value written
//! (`2017`), you can short-circuit the spinlock. In this example, that would be `638`.
//!
//! **What is the value after `2017`** in your completed circular buffer?
//!
//! [spinlock]: https://en.wikipedia.org/wiki/Spinlock

use anyhow::Result;

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