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
//! # Day 18: Duet
//!
//! You discover a tablet containing some strange assembly code labeled simply "[Duet]". Rather than
//! bother the sound card with it, you decide to run the code yourself. Unfortunately, you don't see
//! any documentation, so you're left to figure out what the instructions mean on your own.
//!
//! It seems like the assembly is meant to operate on a set of **registers** that are each named
//! with a single letter and that can each hold a single [integer]. You suppose each register should
//! start with a value of `0`.
//!
//! There aren't that many instructions, so it shouldn't be hard to figure out what they do. Here's
//! what you determine:
//!
//! - `snd X` **plays a sound** with a frequency equal to the value of `X`.
//! - `set X Y` **sets** register `X` to the value of `Y`.
//! - `add X Y` **increases** register `X` by the value of `Y`.
//! - `mul X Y` sets register `X` to the result of **multiplying** the value contained in register
//!   `X` by the value of `Y`.
//! - `mod X Y` sets register `X` to the **remainder** of dividing the value contained in register
//!   `X` by the value of `Y` (that is, it sets `X` to the result of `X` [modulo] `Y`).
//! - `rcv X` **recovers** the frequency of the last sound played, but only when the value of `X` is
//!   not zero. (If it is zero, the command does nothing.)
//! - `jgz X Y` **jumps** with an offset of the value of `Y`, but only if the value of `X` is
//!   **greater than zero**. (An offset of `2` skips the next instruction, an offset of `-1` jumps
//!   to the previous instruction, and so on.)
//!
//! Many of the instructions can take either a register (a single letter) or a number. The value of
//! a register is the integer it contains; the value of a number is that number.
//!
//! After each **jump** instruction, the program continues with the instruction to which the
//! **jump** jumped. After any other instruction, the program continues with the next instruction.
//! Continuing (or jumping) off either end of the program terminates it.
//!
//! For example:
//!
//! ```txt
//! set a 1
//! add a 2
//! mul a a
//! mod a 5
//! snd a
//! set a 0
//! rcv a
//! jgz a -1
//! set a 1
//! jgz a -2
//! ```
//!
//! - The first four instructions set `a` to `1`, add `2` to it, square it, and then set it to
//!   itself modulo `5`, resulting in a value of `4`.
//! - Then, a sound with frequency `4` (the value of `a`) is played.
//! - After that, `a` is set to `0`, causing the subsequent `rcv` and `jgz` instructions to both be
//!   skipped (`rcv` because `a` is `0`, and `jgz` because `a` is not greater than `0`).
//! - Finally, `a` is set to `1`, causing the next `jgz` instruction to activate, jumping back two
//!   instructions to another jump, which jumps again to the `rcv`, which ultimately triggers the
//!   **recover** operation.
//!
//! At the time the **recover** operation is executed, the frequency of the last sound played is
//! `4`.
//!
//! **What is the value of the recovered frequency** (the value of the most recently played sound)
//! the **first** time a `rcv` instruction is executed with a non-zero value?
//!
//! [Duet]: https://en.wikipedia.org/wiki/Duet
//! [integer]: https://en.wikipedia.org/wiki/Integer
//! [modulo]: https://en.wikipedia.org/wiki/Modulo_operation

use anyhow::Result;

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