The final day!!
This commit is contained in:
51
src/bin/combo_breaker.rs
Normal file
51
src/bin/combo_breaker.rs
Normal file
@@ -0,0 +1,51 @@
|
||||
use advent2020::errors::TopLevelError;
|
||||
|
||||
fn round(x: usize, subject_number: usize) -> usize {
|
||||
(x * subject_number) % 20201227
|
||||
}
|
||||
|
||||
fn find_rounds(subject_number: usize, target: usize) -> usize {
|
||||
let mut round_no = 1;
|
||||
let mut value = subject_number;
|
||||
|
||||
while value != target {
|
||||
value = round(value, subject_number);
|
||||
round_no += 1;
|
||||
}
|
||||
|
||||
round_no
|
||||
}
|
||||
|
||||
fn compute_key(rounds: usize, subject_number: usize) -> usize {
|
||||
let mut value = 1;
|
||||
|
||||
for _ in 0..rounds {
|
||||
value = round(value, subject_number);
|
||||
}
|
||||
|
||||
value
|
||||
}
|
||||
|
||||
fn compute_encryption_key(card_public: usize, door_public: usize) -> usize {
|
||||
println!("Computing encryption key for CARD {} / DOOR {}", card_public, door_public);
|
||||
let card_rounds = find_rounds(7, card_public);
|
||||
let door_rounds = find_rounds(7, door_public);
|
||||
println!(" card rounds: {}", card_rounds);
|
||||
println!(" door rounds: {}", door_rounds);
|
||||
let card_key = compute_key(card_rounds, door_public);
|
||||
let door_key = compute_key(door_rounds, card_public);
|
||||
println!(" card key: {}", card_key);
|
||||
println!(" door key: {}", door_key);
|
||||
assert_eq!(card_key, door_key);
|
||||
card_key
|
||||
}
|
||||
|
||||
fn main() -> Result<(), TopLevelError> {
|
||||
println!("---- TEST CASE ----");
|
||||
let test_key = compute_encryption_key(5764801, 17807724);
|
||||
println!();
|
||||
println!("---- REAL INPUT ----");
|
||||
let real_key = compute_encryption_key(12090988, 240583);
|
||||
println!();
|
||||
Ok(())
|
||||
}
|
||||
Reference in New Issue
Block a user