blob: 1fd014975967a674d76243966dfb17296b7d2a55 (
plain)
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
|
use advent_lib::prelude::*;
//use std::collections::BTreeSet;
//use std::convert::TryFrom;
fn main() -> Result<()> {
let mut args = std::env::args();
if args.len() != 2 {
eprintln!("Usage: advent input");
}
let _ = args.next();
let filename = args.next().unwrap();
let input = advent_lib::read_lines_file(&filename)?;
let card_public = input[0].parse::<i64>().unwrap();
let door_public = input[1].parse::<i64>().unwrap();
let subject: i64 = 7;
let mut i = 0;
let mut value = 1;
let mut card_loop_size = None;
let mut door_loop_size = None;
loop {
value = iterate(value, subject);
i += 1;
if card_loop_size.is_none() {
if value == card_public {
card_loop_size = Some(i);
}
}
if door_loop_size.is_none() {
if value == door_public {
door_loop_size = Some(i);
}
}
if card_loop_size.is_some() && door_loop_size.is_some() {
break;
}
}
let key = transform(door_public, card_loop_size.unwrap());
println!("{}", key);
Ok(())
}
fn iterate(input: i64, subject: i64) -> i64 {
let mut output = input * subject;
output %= 20201227;
output
}
fn transform(subject: i64, loop_count: usize) -> i64 {
let mut value = 1;
for _ in 0 .. loop_count {
value = iterate(value, subject);
}
value
}
|