|
|
@@ -0,0 +1,40 @@
|
|
|
+package main
|
|
|
+
|
|
|
+import "fmt"
|
|
|
+
|
|
|
+var chainLengths = make(map[int]int)
|
|
|
+
|
|
|
+func main() {
|
|
|
+ var maxChainLength int
|
|
|
+ var maxStarting int
|
|
|
+ for i := 1; i < 1e6; i++ {
|
|
|
+ l := ChainLength(i)
|
|
|
+ if l > maxChainLength {
|
|
|
+ maxChainLength = l
|
|
|
+ maxStarting = i
|
|
|
+ }
|
|
|
+ }
|
|
|
+ fmt.Println(maxStarting)
|
|
|
+}
|
|
|
+
|
|
|
+func Collatz(n int) int {
|
|
|
+ if n%2 == 0 {
|
|
|
+ return n / 2
|
|
|
+ } else {
|
|
|
+ return 3*n + 1
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func ChainLength(n int) int {
|
|
|
+ l := 0
|
|
|
+ for n != 1 {
|
|
|
+ i, ok := chainLengths[n]
|
|
|
+ if ok {
|
|
|
+ return l + i
|
|
|
+ }
|
|
|
+ n = Collatz(n)
|
|
|
+ l++
|
|
|
+ }
|
|
|
+ chainLengths[n] = l
|
|
|
+ return l + 1
|
|
|
+}
|