aboutsummaryrefslogtreecommitdiff
path: root/challenge-054/paulo-custodio/python/ch-2.py
diff options
context:
space:
mode:
Diffstat (limited to 'challenge-054/paulo-custodio/python/ch-2.py')
-rw-r--r--challenge-054/paulo-custodio/python/ch-2.py58
1 files changed, 58 insertions, 0 deletions
diff --git a/challenge-054/paulo-custodio/python/ch-2.py b/challenge-054/paulo-custodio/python/ch-2.py
new file mode 100644
index 0000000000..860174b483
--- /dev/null
+++ b/challenge-054/paulo-custodio/python/ch-2.py
@@ -0,0 +1,58 @@
+#!/usr/bin/env python3
+
+# Challenge 054
+#
+# TASK #2
+# Collatz Conjecture
+# Contributed by Ryan Thompson
+# It is thought that the following sequence will always reach 1:
+#
+# $n = $n / 2 when $n is even
+# $n = 3*$n + 1 when $n is odd
+# For example, if we start at 23, we get the following sequence:
+#
+# 23 -> 70 -> 35 -> 106 -> 53 -> 160 -> 80 -> 40 -> 20 -> 10 -> 5 -> 16 -> 8
+# -> 4 -> 2 -> 1
+#
+# Write a function that finds the Collatz sequence for any positive integer.
+# Notice how the sequence itself may go far above the original starting number.
+#
+# Extra Credit
+# Have your script calculate the sequence length for all starting numbers up to
+# 1000000 (1e6), and output the starting number and sequence length for the
+# longest 20 sequences.
+
+import sys
+
+def collatz_seq(n):
+ out = [n]
+ while n != 1:
+ if n % 2 == 0:
+ n = int(n/2)
+ else:
+ n = 3*n + 1
+ out.append(n)
+ return out
+
+def print_longest():
+ longest = []
+ for n in range(1, int(1e6)+1):
+ count = len(collatz_seq(n))
+ longest.append([n, count])
+ longest.sort(key=lambda x:x[0])
+ longest = longest[::-1]
+ longest.sort(key=lambda x:x[1])
+ longest = longest[::-1]
+ if len(longest) > 20:
+ longest.pop()
+
+ for i in longest:
+ print(str(i[0])+" "+str(i[1]))
+
+
+if sys.argv[1] == "-l":
+ print_longest()
+else:
+ n = int(sys.argv[1])
+ seq = collatz_seq(n)
+ print(" -> ".join([str(x) for x in seq]))