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
//! # Day 23: Safe Cracking
//!
//! This is one of the top floors of the nicest tower in EBHQ. The Easter Bunny's private office is
//! here, complete with a safe hidden behind a painting, and who **wouldn't** hide a star in a safe
//! behind a painting?
//!
//! The safe has a digital screen and keypad for code entry. A sticky note attached to the safe has
//! a password hint on it: "eggs". The painting is of a large rabbit coloring some eggs. You see
//! `7`.
//!
//! When you go to type the code, though, nothing appears on the display; instead, the keypad comes
//! apart in your hands, apparently having been smashed. Behind it is some kind of socket - one that
//! matches a connector in your [prototype computer]! You pull apart the smashed keypad and extract
//! the logic circuit, plug it into your computer, and plug your computer into the safe.
//!
//! Now, you just need to figure out what output the keypad would have sent to the safe. You extract
//! the [assembunny code] from the logic chip (your puzzle input).
//!
//! The code looks like it uses **almost** the same architecture and instruction set that the
//! [monorail computer] used! You should be able to **use the same assembunny interpreter** for this
//! as you did there, but with one new instruction:
//!
//! `tgl x` **toggles** the instruction `x` away (pointing at instructions like `jnz` does: positive
//! means forward; negative means backward):
//!
//! - For **one-argument** instructions, `inc` becomes `dec`, and all other one-argument
//! instructions become `inc`.
//! - For **two-argument** instructions, `jnz` becomes `cpy`, and all other two-instructions become
//! `jnz`.
//! - The arguments of a toggled instruction are **not affected**.
//! - If an attempt is made to toggle an instruction outside the program, **nothing happens**.
//! - If toggling produces an **invalid instruction** (like `cpy 1 2`) and an attempt is later made
//! to execute that instruction, **skip it instead**.
//! - If `tgl` toggles **itself** (for example, if `a` is `0`, `tgl a` would target itself and
//! become `inc a`), the resulting instruction is not executed until the next time it is reached.
//!
//! For example, given this program:
//!
//! ```txt
//! cpy 2 a
//! tgl a
//! tgl a
//! tgl a
//! cpy 1 a
//! dec a
//! dec a
//! ```
//!
//! - `cpy 2 a` initializes register `a` to `2`.
//! - The first `tgl a` toggles an instruction `a` (`2`) away from it, which changes the third
//! `tgl a` into `inc a`.
//! - The second `tgl a` also modifies an instruction `2` away from it, which changes the `cpy 1 a`
//! into `jnz 1 a`.
//! - The fourth line, which is now `inc a`, increments `a` to `3`.
//! - Finally, the fifth line, which is now `jnz 1 a`, jumps `a` (`3`) instructions ahead, skipping
//! the `dec a` instructions.
//!
//! In this example, the final value in register `a` is `3`.
//!
//! The rest of the electronics seem to place the keypad entry (the number of eggs, `7`) in register
//! `a`, run the code, and then send the value left in register `a` to the safe.
//!
//! **What value** should be sent to the safe?
//!
//! [prototype computer]: super::d11
//! [assembunny code]: super::d12
//! [monorail computer]: super::d12
use anyhow::Result;
pub const INPUT: &str = include_str!("d23.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() {}
}