AoC2020/src/day25.rs

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));
}
}