main.go (944B)
1 package main
2
3 import (
4 "bufio"
5 "fmt"
6 "os"
7 "strconv"
8 )
9
10 func readInput(filename string) (pubCard, pubDoor int64) {
11 file, _ := os.Open(filename)
12 defer file.Close()
13
14 scanner := bufio.NewScanner(file)
15 pubKeys := []int64{}
16 for scanner.Scan() {
17 key, _ := strconv.ParseInt(scanner.Text(), 10, 64)
18 pubKeys = append(pubKeys, key)
19 }
20 return pubKeys[0], pubKeys[1]
21 }
22
23 func main() {
24 pubCard, pubDoor := readInput("./input.txt")
25 // 17032383
26 fmt.Println(part1(pubCard, pubDoor))
27 }
28
29 func decodeLoopSize(val, subject, modulus, pubKey int64) (loopSize int) {
30 for val != pubKey {
31 loopSize += 1
32 val = (val * subject) % modulus
33 }
34 return
35 }
36
37 func part1(pubCard, pubDoor int64) (endKey int64) {
38 var (
39 val int64 = 1
40 subject int64 = 7
41 modulus int64 = 20201227
42 )
43 cardLoopSize := decodeLoopSize(val, subject, modulus, pubCard)
44 subject = pubDoor
45 for i := 0; i < cardLoopSize; i++ {
46 val = (val * subject) % modulus
47 }
48 return val
49 }