Add blog post about refactoring, with refactoring image and render source
[ndcode_site.git] / blog / 20220128 / factors.py
diff --git a/blog/20220128/factors.py b/blog/20220128/factors.py
new file mode 100755 (executable)
index 0000000..641432d
--- /dev/null
@@ -0,0 +1,49 @@
+#!/usr/bin/env python3
+
+import random
+
+def prod(vec):
+  result = 1
+  for n in vec:
+    result *= n
+  return result
+
+# 2 × (2 × 3 × 5) × 5 × (11 × 17) × 239 = 2 × 30 × 5 × 187 × 239 = 13407900
+factors = [3, 11, 17, 19, 37] #[2, 3, 3, 5, 11, 17, 239]
+
+done_segments = set()
+for line in range(12):
+  while True:
+    segments = []
+    i = 0
+    while i < len(factors):
+      j = random.randint(1, len(factors) - i)
+      segments.append(j)
+      i += j
+    for i in range(len(segments) - 1):
+      j = random.randint(i, len(segments) - 1)
+      segments[i], segments[j] = segments[j], segments[i]
+    assert sum(segments) == len(factors)
+    if (
+      len(segments) >= 3 and
+        len(segments) < len(factors) and
+        tuple(segments) not in done_segments
+    ):
+      break
+  done_segments.add(tuple(segments))
+
+  long_form = []
+  short_form = []
+  i = 0
+  for j in segments:
+    factor = ' × '.join([str(k) for k in factors[i:i + j]])
+    if j > 1:
+      factor = '(' + factor + ')'
+    long_form.append(factor)
+    short_form.append(str(prod(factors[i:i + j])))
+    i += j
+  long_form = ' × '.join(long_form)
+  short_form = ' × '.join(short_form)
+  answer = str(prod(factors))
+
+  print(long_form + ' = ' + short_form + ' = ' + answer)