-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpalindrome.py
89 lines (75 loc) · 2.88 KB
/
palindrome.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
"""
Palindrome for numbers
"""
def palindrome(start: int = 100, finish: int = 999, t_max: bool = False) -> str:
"""
Looking for palindrome between multiplication of all numbers in range:
:start: and :finish: take integers for range
:t_max: == False - looking for min palindrome
:t_max: == True - looking for max palindrome
"""
# remove negative numbers, also can add isNeg flag to show range with "-"
# start = -start if start < 0 else start
# finish = -finish if finish < 0 else finish
# function is only for absolutes and correct types
# start * finish == 0 instead of start < 0 or finish < 0
if type(start) != int or type(finish) != int or start < 0 or finish < 0:
return "Wrong input"
# preparing correct range
start, finish = (start, finish) if finish > start else (finish, start)
# num for max and min
final_num = (s_f := 0 if t_max else finish * finish + 1)
nums = [0, 0]
for counter, num1 in enumerate(range(start, finish + 1)[::-1] if t_max \
else range(start, finish + 1)):
# exit for less than max or more than min
if (num1 * finish < final_num and t_max) or \
(num1 * start > final_num and not t_max):
break
for num2 in (range(start, finish + 1 - counter)[::-1] if t_max else \
range(start + counter, finish + 1)):
# exit earlier
if ((num := num1 * num2) < final_num and t_max) or \
(num > final_num and not t_max):
break
# get palindrome
if (num_str := str(num)) == num_str[::-1] and \
((num > final_num and t_max) or \
(num < final_num and not t_max)):
final_num = num
nums[0], nums[1] = num1, num2
return f"No palindromes in range {start}-{finish}" \
if final_num == 0 or final_num == s_f \
else f"{'Max' if t_max else 'Min'}: {final_num} | {nums[0]}*{nums[1]}"
def max_palindrome(start: int = 100, finish: int = 999) -> str:
"""
Looking for max palindrome between multiplication of all numbers in range:
:start: and :finish: take integers for range
"""
fin_num = 0
nums = [0, 0]
for counter, num1 in enumerate(range(start, finish + 1)[::-1]):
if num1 * finish < fin_num:
break
for num2 in range(start, finish + 1 - counter)[::-1]:
if (num := num1 * num2) < fin_num:
break
if (num_str := str(num)) == num_str[::-1] and num > fin_num:
fin_num = num
nums[0], nums[1] = num1, num2
return f"No palindromes in range {start}-{finish}" if fin_num == 0 else \
f"{fin_num} | {nums[0]}*{nums[1]}"
if __name__ == "__main__":
# good results
print(palindrome(t_max=True))
print(palindrome())
print(palindrome(10, 10000, t_max=True))
print(palindrome(10, 10000))
# no palindromes
print(palindrome(15, 16, t_max=True))
print(palindrome(16, 15))
# failsafe wrong input
print(palindrome(-15, -17, t_max=True))
print(palindrome(-17, 15))
# max_palindrome function
print(max_palindrome())