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
//! # Day 25: Combo Breaker
//!
//! You finally reach the check-in desk. Unfortunately, their registration systems are currently
//! offline, and they cannot check you in. Noticing the look on your face, they quickly add that
//! tech support is already on the way! They even created all the room keys this morning; you can
//! take yours now and give them your room deposit once the registration system comes back online.
//!
//! The room key is a small [RFID] card. Your room is on the 25th floor and the elevators are also
//! temporarily out of service, so it takes what little energy you have left to even climb the
//! stairs and navigate the halls. You finally reach the door to your room, swipe your card, and -
//! **beep** - the light turns red.
//!
//! Examining the card more closely, you discover a phone number for tech support.
//!
//! "Hello! How can we help you today?" You explain the situation.
//!
//! "Well, it sounds like the card isn't sending the right command to unlock the door. If you go
//! back to the check-in desk, surely someone there can reset it for you." Still catching your
//! breath, you describe the status of the elevator and the exact number of stairs you just had to
//! climb.
//!
//! "I see! Well, your only other option would be to reverse-engineer the cryptographic handshake
//! the card does with the door and then inject your own commands into the data stream, but that's
//! definitely impossible." You thank them for their time.
//!
//! Unfortunately for the door, you know a thing or two about cryptographic handshakes.
//!
//! The handshake used by the card and the door involves an operation that **transforms** a
//! **subject number**. To transform a subject number, start with the value `1`. Then, a number of
//! times called the **loop size**, perform the following steps:
//!
//! - Set the value to itself multiplied by the **subject number**.
//! - Set the value to the remainder after dividing the value by **`20201227`**.
//!
//! The card always uses a specific, secret **loop size** when it transforms a subject number. The
//! door always uses a different, secret loop size.
//!
//! The cryptographic handshake works like this:
//!
//! - The **card** transforms the subject number of **`7`** according to the **card's** secret loop
//! size. The result is called the **card's public key**.
//! - The **door** transforms the subject number of **`7`** according to the **door's** secret loop
//! size. The result is called the **door's public key**.
//! - The card and door use the wireless RFID signal to transmit the two public keys (your puzzle
//! input) to the other device. Now, the **card** has the **door's** public key, and the **door**
//! has the **card's** public key. Because you can eavesdrop on the signal, you have both public
//! keys, but neither device's loop size.
//! - The **card** transforms the subject number of **the door's public key** according to the
//! **card's** loop size. The result is the **encryption key**.
//! - The **door** transforms the subject number of **the card's public key** according to the
//! **door's** loop size. The result is the same **encryption key** as the **card** calculated.
//!
//! If you can use the two public keys to determine each device's loop size, you will have enough
//! information to calculate the secret **encryption key** that the card and door use to
//! communicate; this would let you send the `unlock` command directly to the door!
//!
//! For example, suppose you know that the card's public key is `5764801`. With a little trial and
//! error, you can work out that the card's loop size must be **`8`**, because transforming the
//! initial subject number of `7` with a loop size of `8` produces `5764801`.
//!
//! Then, suppose you know that the door's public key is `17807724`. By the same process, you can
//! determine that the door's loop size is **`11`**, because transforming the initial subject number
//! of `7` with a loop size of `11` produces `17807724`.
//!
//! At this point, you can use either device's loop size with the other device's public key to
//! calculate the **encryption key**. Transforming the subject number of `17807724` (the door's
//! public key) with a loop size of `8` (the card's loop size) produces the encryption key,
//! **`14897079`**. (Transforming the subject number of `5764801` (the card's public key) with a
//! loop size of `11` (the door's loop size) produces the same encryption key: **`14897079`**.)
//!
//! **What encryption key is the handshake trying to establish?**
//!
//! [RFID]: https://en.wikipedia.org/wiki/Radio-frequency_identification
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() {}
}