main.go (1545B)
1 package main
2
3 import (
4 "fmt"
5 )
6
7 func main() {
8 input := []int{3, 6, 8, 1, 9, 5, 7, 4, 2}
9 // 95648732
10 fmt.Println(part1(input))
11 // 192515314252
12 fmt.Println(part2(input))
13 }
14
15 func playMixCup(curr int, cups []int, steps int) []int {
16 min, max := 1, len(cups)-1 // Assumption based on input.
17 for i := 0; i < steps; i++ {
18 nextThree := cups[curr]
19 cups[curr] = cups[cups[cups[nextThree]]]
20 destVal := curr
21 for inNextThree := true; inNextThree; {
22 destVal -= 1
23 if destVal < min {
24 destVal = max
25 }
26 inNextThree = destVal == nextThree ||
27 destVal == cups[nextThree] ||
28 destVal == cups[cups[nextThree]]
29 }
30 destNext := cups[destVal]
31 cups[destVal] = nextThree
32 cups[cups[cups[nextThree]]] = destNext
33 curr = cups[curr]
34 }
35 return cups
36 }
37
38 func part1(input []int) (res string) {
39 // Represent the ring with slice, where cups[i] = number after i.
40 cups := make([]int, len(input)+1) // +1 to make indexing easier.
41 cups[input[len(input)-1]] = input[0]
42 for i, v := range input[:len(input)-1] {
43 cups[v] = input[i+1]
44 }
45 cups = playMixCup(input[0], cups, 100)
46 for i := cups[1]; i != 1; i = cups[i] {
47 res += string('0' + i)
48 }
49 return
50 }
51
52 func part2(input []int) (res int64) {
53 maxLen := 1000000
54 cups := make([]int, maxLen+1)
55 cups[maxLen] = input[0]
56 for i, v := range input[:len(input)-1] {
57 cups[v] = input[i+1]
58 }
59 cups[input[len(input)-1]] = len(input) + 1
60 for i := len(input) + 1; i < maxLen; i++ {
61 cups[i] = i + 1
62 }
63 cups = playMixCup(input[0], cups, 10000000)
64 return int64(cups[1]) * int64(cups[cups[1]])
65 }