Add blog post about refactoring, with refactoring image and render source
[ndcode_site.git] / blog / 20220128 / factors.py
1 #!/usr/bin/env python3
2
3 import random
4
5 def prod(vec):
6   result = 1
7   for n in vec:
8     result *= n
9   return result
10
11 # 2 × (2 × 3 × 5) × 5 × (11 × 17) × 239 = 2 × 30 × 5 × 187 × 239 = 13407900
12 factors = [3, 11, 17, 19, 37] #[2, 3, 3, 5, 11, 17, 239]
13
14 done_segments = set()
15 for line in range(12):
16   while True:
17     segments = []
18     i = 0
19     while i < len(factors):
20       j = random.randint(1, len(factors) - i)
21       segments.append(j)
22       i += j
23     for i in range(len(segments) - 1):
24       j = random.randint(i, len(segments) - 1)
25       segments[i], segments[j] = segments[j], segments[i]
26     assert sum(segments) == len(factors)
27     if (
28       len(segments) >= 3 and
29         len(segments) < len(factors) and
30         tuple(segments) not in done_segments
31     ):
32       break
33   done_segments.add(tuple(segments))
34
35   long_form = []
36   short_form = []
37   i = 0
38   for j in segments:
39     factor = ' × '.join([str(k) for k in factors[i:i + j]])
40     if j > 1:
41       factor = '(' + factor + ')'
42     long_form.append(factor)
43     short_form.append(str(prod(factors[i:i + j])))
44     i += j
45   long_form = ' × '.join(long_form)
46   short_form = ' × '.join(short_form)
47   answer = str(prod(factors))
48
49   print(long_form + ' = ' + short_form + ' = ' + answer)