51 lines
1.2 KiB
Rust
51 lines
1.2 KiB
Rust
use std::io::BufRead;
|
|
|
|
const MOD: usize = 20201227;
|
|
|
|
fn tranform(subject: usize, loop_size: usize) -> usize {
|
|
let mut value = 1;
|
|
for _ in 0..loop_size {
|
|
value *= subject;
|
|
value %= MOD;
|
|
}
|
|
value
|
|
}
|
|
|
|
fn bruteforce_key(subject: usize, public_key: usize) -> usize {
|
|
let mut res_value = 1;
|
|
let mut loop_size = 0;
|
|
while res_value != public_key {
|
|
loop_size += 1;
|
|
res_value *= subject;
|
|
res_value %= MOD;
|
|
}
|
|
loop_size
|
|
}
|
|
|
|
pub fn part1<F: BufRead> (input: F) {
|
|
let keys: Vec<_> = input.lines().map(|l| l.unwrap().parse::<usize>().unwrap()).collect();
|
|
|
|
let card_private_key = bruteforce_key(7, keys[0]);
|
|
println!("card private key {}", card_private_key);
|
|
let door_private_key = bruteforce_key(7, keys[1]);
|
|
println!("door private key {}", door_private_key);
|
|
let encryption_key = tranform(keys[0], door_private_key);
|
|
|
|
println!("encryption key {}", encryption_key);
|
|
}
|
|
|
|
pub fn part2<F: BufRead> (_input: F) {
|
|
println!("There is no puzzle for part 2 :p");
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod test {
|
|
use super::*;
|
|
|
|
#[test]
|
|
fn test_bruteforce() {
|
|
assert_eq!(8, bruteforce_key(7, 5764801));
|
|
assert_eq!(11, bruteforce_key(7, 17807724));
|
|
}
|
|
}
|