@@ -35,15 +35,53 @@ func calculateNextSecret(secret int) int {
35
35
return step3
36
36
}
37
37
38
+ type changesHash string
39
+
40
+ func hashChanges (changes []int ) changesHash {
41
+ return changesHash (fmt .Sprintf ("%v" , changes ))
42
+ }
43
+
38
44
func main () {
39
45
var sum int
46
+ var totalGain = make (map [changesHash ]int )
40
47
for _ , initialSecret := range readInitialSecrets () {
41
48
var secret = initialSecret
49
+ var changes []int
50
+ var buyerGain = make (map [changesHash ]int )
42
51
for i := 0 ; i < 2000 ; i ++ {
52
+ var oldPrice = secret % 10
43
53
secret = calculateNextSecret (secret )
54
+ var price = secret % 10
55
+ var change = price - oldPrice
56
+ if len (changes ) == 4 {
57
+ changes = changes [1 :4 ]
58
+ }
59
+ changes = append (changes , change )
60
+ var hash = hashChanges (changes )
61
+ if _ , ok := buyerGain [hash ]; ! ok {
62
+ buyerGain [hash ] = price
63
+ }
44
64
}
45
65
sum += secret
46
66
fmt .Printf ("%d: %d\n " , initialSecret , secret )
67
+ for hash , price := range buyerGain {
68
+ var totalPrice int
69
+ if oldTotalPrice , ok := totalGain [hash ]; ok {
70
+ totalPrice += oldTotalPrice
71
+ }
72
+ totalPrice += price
73
+ totalGain [hash ] = totalPrice
74
+ }
75
+ }
76
+ fmt .Printf ("sum of 2000th secrets: %d\n " , sum )
77
+
78
+ var maxHash changesHash
79
+ var maxPrice int
80
+ for hash , price := range totalGain {
81
+ if price > maxPrice {
82
+ maxHash = hash
83
+ maxPrice = price
84
+ }
47
85
}
48
- fmt .Printf ("sum of secrets: %d\n " , sum )
86
+ fmt .Printf ("max gain is %d for sequence %s \n " , maxPrice , maxHash )
49
87
}
0 commit comments