main.go (698B)
1 package main
2
3 import (
4 "fmt"
5 )
6
7 func main() {
8 input := []int{11, 0, 1, 10, 5, 19}
9 // 870
10 fmt.Println(part1(input))
11 // 9136
12 fmt.Println(part2(input))
13 }
14
15 func memoryGame(input []int, target int) int {
16 lastAppear := map[int]int{}
17 for i, v := range input[:len(input)-1] {
18 lastAppear[v] = i + 1
19 }
20 curr := input[len(input)-1]
21 for i := len(input); i < target; i++ {
22 prev := curr
23 if lastAppear[prev] == 0 {
24 curr = 0
25 } else {
26 curr = i - lastAppear[prev]
27 }
28 // Only update after we have the next number
29 lastAppear[prev] = i
30 }
31 return curr
32 }
33
34 func part1(input []int) int {
35 return memoryGame(input, 2020)
36 }
37
38 func part2(input []int) int {
39 return memoryGame(input, 30_000_000)
40 }