-
Notifications
You must be signed in to change notification settings - Fork 0
/
61_Cyclical_Figurate_Numbers.py
153 lines (122 loc) · 3.93 KB
/
61_Cyclical_Figurate_Numbers.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
'''
Created on Dec 5, 2023
Triangle, square, pentagonal, hexagonal, heptagonal, and octagonal numbers are all figurate (polygonal)
numbers and are generated by the following formulae:
Triangle
P3,n = n(n+1)/2 1, 3, 6, 10, 15, ...
Square
P4,n = n^2 1, 4, 9, 16, 25, ...
Pentagonal
P5,n = n(3n-1)/2 1, 5, 12, 22, 35, ...
Hexagonal
P6,n = 2(2n-1) 1, 6, 15, 28, 45, ...
Heptagonal
P7,n = n(5n-3)/2 1, 7, 18, 34, 55, ...
Octagonal
P8,n = n(3n-2) 1, 8, 21, 40, 64
The ordered set of three-digit numbers: 8128, 2882, 8281, has three interesting properties.
1. The set is cyclic, in that the last two digits of each number is the first two digits of the
next number (including the last number with the first).
2. Each polygonal type: triangle (P3,127 = 8128), square (P4,91 = 8281), and pentagonal (P5,44 = 2882),
is represented by a different number in the set.
3. This is the only set of 4-digit numbers with this property.
Find the sum of the only ordered set of six cyclic 4-digit numbers for which each polygonal
type: triangle, square, pentagonal, hexagonal, heptagonal, and octagonal, is represented by a
different number in the set.
'''
from datetime import datetime
from itertools import permutations
from tqdm import tqdm
def make_triangles(max_n):
x = 0
n = 1
num_list = []
while x < max_n:
x = n * (n+1) // 2
num_list.append(x)
n += 1
return num_list
def make_squares(max_n):
x = 0
n = 1
num_list = []
while x < max_n:
x = n * n
num_list.append(x)
n += 1
return num_list
def make_pentagons(max_n):
x = 0
n = 1
num_list = []
while x < max_n:
x = n * (3*n-1) // 2
num_list.append(x)
n += 1
return num_list
def make_hexagons(max_n):
x = 0
n = 1
num_list = []
while x < max_n:
x = n * (2*n-1)
num_list.append(x)
n += 1
return num_list
def make_heptagons(max_n):
x = 0
n = 1
num_list = []
while x < max_n:
x = n * (5*n-3) // 2
num_list.append(x)
n += 1
return num_list
def make_octagons(max_n):
x = 0
n = 1
num_list = []
while x < max_n:
x = n * (3*n-2)
num_list.append(x)
n += 1
return num_list
if __name__ == '__main__':
start = datetime.now()
max_val = 10_000
# Construct figurate number lists
figurate_nums = {
3: make_triangles(max_val),
4: make_squares(max_val),
5: make_pentagons(max_val),
6: make_hexagons(max_val),
7: make_heptagons(max_val),
8: make_octagons(max_val),
}
# Grab only 4-digit numbers
figurate_nums = {
k: [i for i in v if len(str(i)) == 4]
for k, v in figurate_nums.items()
}
side_perms = list(permutations(range(4, 9)))
pbar = tqdm(side_perms)
k1 = 3
for side_perm in pbar:
k2, k3, k4, k5, k6 = side_perm
for v1 in figurate_nums[k1]:
for v2 in figurate_nums[k2]:
if v1 % 100 == v2 // 100:
for v3 in figurate_nums[k3]:
if v2 % 100 == v3 // 100:
for v4 in figurate_nums[k4]:
if v3 % 100 == v4 // 100:
for v5 in figurate_nums[k5]:
if v4 % 100 == v5 // 100:
for v6 in figurate_nums[k6]:
if v5 % 100 == v6 // 100:
if v6 % 100 == v1 // 100:
pbar.write(f'{k1, k2, k3, k4, k5, k6}')
pbar.write(f'{v1, v2, v3, v4, v5, v6}')
pbar.write(f'{sum([v1, v2, v3, v4, v5, v6])}')
end = datetime.now()
print(f'\nruntime = {end - start}')