diff --git a/data/day25/input b/data/day25/input new file mode 100644 index 0000000..ca12768 --- /dev/null +++ b/data/day25/input @@ -0,0 +1,2 @@ +14012298 +74241 diff --git a/src/bin/day25.rs b/src/bin/day25.rs new file mode 100644 index 0000000..fe8afad --- /dev/null +++ b/src/bin/day25.rs @@ -0,0 +1,44 @@ +const INPUT: &str = include_str!("../../data/day25/input"); + +const MOD: u32 = 20201227; + +// transform(subject, key) = (subject ** key) mod 20201227 +// +// public_key := transform(7, private_key) +// shared_secret := transform(peer_public_key, local_private_key) + +fn transform(subject: u32, key: u32) -> u32 { + let mut value = 1u64; + let subject = subject as u64; + for _ in 0..key { + value = (value * subject) % (MOD as u64); + } + value as u32 +} + +fn find_key(subject: u32, transformed: u32) -> u32 { + let mut value = 1u64; + let mut key = 0; + let subject = subject as u64; + let transformed = transformed as u64; + while value != transformed { + value = (value * subject) % (MOD as u64); + key += 1; + } + key +} + +fn main() { + let card_pub_key; + let door_pub_key; + { + let mut lines = INPUT.lines(); + card_pub_key = lines.next().unwrap().parse::().unwrap(); + door_pub_key = lines.next().unwrap().parse::().unwrap(); + assert!(lines.next().is_none()); + } + let card_priv_key = find_key(7, card_pub_key); + println!("Card private key: {}", card_priv_key); + let shared_secret = transform(door_pub_key, card_priv_key); + println!("Shared secret: {}", shared_secret); +}