17
17
ODD_DIGITS = [1 , 3 , 5 , 7 , 9 ]
18
18
19
19
20
- def reversible_numbers (
20
+ def slow_reversible_numbers (
21
21
remaining_length : int , remainder : int , digits : list [int ], length : int
22
22
) -> int :
23
23
"""
24
24
Count the number of reversible numbers of given length.
25
25
Iterate over possible digits considering parity of current sum remainder.
26
- >>> reversible_numbers (1, 0, [0], 1)
26
+ >>> slow_reversible_numbers (1, 0, [0], 1)
27
27
0
28
- >>> reversible_numbers (2, 0, [0] * 2, 2)
28
+ >>> slow_reversible_numbers (2, 0, [0] * 2, 2)
29
29
20
30
- >>> reversible_numbers (3, 0, [0] * 3, 3)
30
+ >>> slow_reversible_numbers (3, 0, [0] * 3, 3)
31
31
100
32
32
"""
33
33
if remaining_length == 0 :
@@ -51,7 +51,7 @@ def reversible_numbers(
51
51
result = 0
52
52
for digit in range (10 ):
53
53
digits [length // 2 ] = digit
54
- result += reversible_numbers (
54
+ result += slow_reversible_numbers (
55
55
0 , (remainder + 2 * digit ) // 10 , digits , length
56
56
)
57
57
return result
@@ -67,7 +67,7 @@ def reversible_numbers(
67
67
68
68
for digit2 in other_parity_digits :
69
69
digits [(length - remaining_length ) // 2 ] = digit2
70
- result += reversible_numbers (
70
+ result += slow_reversible_numbers (
71
71
remaining_length - 2 ,
72
72
(remainder + digit1 + digit2 ) // 10 ,
73
73
digits ,
@@ -76,6 +76,42 @@ def reversible_numbers(
76
76
return result
77
77
78
78
79
+ def slow_solution (max_power : int = 9 ) -> int :
80
+ """
81
+ To evaluate the solution, use solution()
82
+ >>> slow_solution(3)
83
+ 120
84
+ >>> slow_solution(6)
85
+ 18720
86
+ >>> slow_solution(7)
87
+ 68720
88
+ """
89
+ result = 0
90
+ for length in range (1 , max_power + 1 ):
91
+ result += slow_reversible_numbers (length , 0 , [0 ] * length , length )
92
+ return result
93
+
94
+
95
+ def reversible_numbers (
96
+ remaining_length : int , remainder : int , digits : list [int ], length : int
97
+ ) -> int :
98
+ """
99
+ Count the number of reversible numbers of given length.
100
+ Iterate over possible digits considering parity of current sum remainder.
101
+ >>> reversible_numbers(1, 0, [0], 1)
102
+ 0
103
+ >>> reversible_numbers(2, 0, [0] * 2, 2)
104
+ 20
105
+ >>> reversible_numbers(3, 0, [0] * 3, 3)
106
+ 100
107
+ """
108
+ # There exist no reversible 1, 5, 9, 13 (ie. 4k+1) digit numbers
109
+ if (length - 1 ) % 4 == 0 :
110
+ return 0
111
+
112
+ return slow_reversible_numbers (length , 0 , [0 ] * length , length )
113
+
114
+
79
115
def solution (max_power : int = 9 ) -> int :
80
116
"""
81
117
To evaluate the solution, use solution()
@@ -92,5 +128,25 @@ def solution(max_power: int = 9) -> int:
92
128
return result
93
129
94
130
131
+ def benchmark () -> None :
132
+ """
133
+ Benchmarks
134
+ """
135
+ # Running performance benchmarks...
136
+ # slow_solution : 292.9300301000003
137
+ # solution : 54.90970860000016
138
+
139
+ from timeit import timeit
140
+
141
+ print ("Running performance benchmarks..." )
142
+
143
+ print (f"slow_solution : { timeit ('slow_solution()' , globals = globals (), number = 10 )} " )
144
+ print (f"solution : { timeit ('solution()' , globals = globals (), number = 10 )} " )
145
+
146
+
95
147
if __name__ == "__main__" :
96
- print (f"{ solution () = } " )
148
+ print (f"Solution : { solution ()} " )
149
+ benchmark ()
150
+
151
+ # for i in range(1, 15):
152
+ # print(f"{i}. {reversible_numbers(i, 0, [0]*i, i)}")
0 commit comments