summary refs log tree commit diff
path: root/25/src/main.rs
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
}