Created
April 7, 2025 12:42
-
-
Save ig-rudenko/f515c6cc1c43748179e2a0f56bb10d1e to your computer and use it in GitHub Desktop.
Определение категории номера
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import re | |
from collections import Counter | |
def check_diamond_number(num: str) -> bool: | |
"""Бриллиант""" | |
return bool(re.search(r"(\d)\1{4}", num)) | |
def check_platinum_number(num: str) -> bool: | |
"""Платина""" | |
if re.search(r'(\d)\1{3}', num): # четыре подряд | |
if re.search(r'(\d)(\d)\1\2', num) or re.search(r'(\d)(\d)\2\1', num): # зеркальные пары | |
return True | |
# цифры, идущие в арифметическом порядке по возрастанию/уменьшению | |
last = int(num[0]) | |
count = 0 | |
order = "" | |
for i in num[1:]: | |
if count == 0: | |
order = "desc" if int(i) < last else "asc" | |
count = 2 | |
last = int(i) | |
continue | |
if int(i) < last and order != "desc": | |
break | |
if int(i) > last and order == "desc": | |
break | |
count += 1 | |
last = int(i) | |
return count == len(num) | |
def check_emerald_number(num: str) -> bool: | |
"""Изумруд""" | |
# В номере содержится 2 тройки одинаковых цифр | |
return len(re.findall(r'(\d)\1{2}', num)) >= 2 | |
def check_gold_number(num: str) -> bool: | |
"""Золото""" | |
if re.search(r'(\d)\1{2}', num): # три подряд | |
return True | |
for i in range(len(num) - 5): | |
if num[i:i + 3] == num[i + 3:i + 6][::-1]: # 254-452-0 | |
return True | |
if num[i:i + 3] == num[-3:][::-1]: # 254-0-452 | |
return True | |
return False | |
def check_ruby_number(num: str) -> bool: | |
"""Рубин""" | |
return bool(re.search(r'(\d)(\d)\1\2', num) or re.search(r'(\d)(\d)\2\1', num)) # зеркальные пары | |
def check_silver_number(num: str) -> bool: | |
"""Серебряный номер""" | |
# 1. Повторяющиеся пары (с промежутками) | |
# Например: AB-C-D-AB или AB-X-AB | |
# +7-978 25-44-9-44 | |
for i in range(len(num) - 1): | |
pair = num[i:i + 2] | |
for j in range(i + 2, len(num) - 1): | |
if num[j:j + 2] == pair: | |
return True | |
# 2. Возрастающая / убывающая пара через 1 | |
# ABC-DE-DD (+7-978-254-89-88). | |
for i in range(len(num) - 3): | |
a, b = int(num[i:i + 2]), int(num[i + 2: i + 4]) | |
if abs(a - b) == 1: | |
return True | |
return False | |
def check_bronze_number(num: str) -> bool: | |
"""Бронзовый номер""" | |
# — 3 и более одинаковых цифры, через один символ | |
for d in set(num): | |
positions = [i for i, c in enumerate(num) if c == d] | |
# Ищем, есть ли три таких, чтобы между ними был ровно 1 символ (индексы с шагом 2) | |
for i in range(len(positions) - 2): | |
if positions[i + 1] - positions[i] == 2 and positions[i + 2] - positions[i + 1] == 2: | |
return True | |
return False | |
def check_jade_number(num: str) -> bool: | |
"""Нефритовый номер""" | |
# ровно одна тройка | |
counts = Counter(num) | |
triple_digits = [d for d, c in counts.items() if c == 3] | |
over_triple = any(c > 3 for c in counts.values()) | |
if len(triple_digits) == 1 and not over_triple: | |
return True | |
return False | |
def categorize_number(phone_number: str) -> str: | |
if not re.fullmatch(r"7978\d{7}", phone_number): | |
return "Некорректный номер" | |
num = phone_number[4:] # последние 7 цифр | |
if check_diamond_number(num): | |
return "Бриллиантовый" | |
if check_platinum_number(num): | |
return "Платиновый" | |
if check_emerald_number(num): | |
return "Изумрудный" | |
if check_gold_number(num): | |
return "Золотой" | |
if check_ruby_number(num): | |
return "Рубиновый" | |
if check_silver_number(num): | |
return "Серебряный" | |
if check_bronze_number(num): | |
return "Бронзовый" | |
if check_jade_number(num): | |
return "Нефритовый" | |
return "Обычный" | |
print("79782538988", categorize_number("79782538988")) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
«Нефритовый номер» - в номере содержится 3 одинаковых цифры
«Бронзовый номер» - в номере содержится от 3 и более одинаковых цифр, расположенных парно или через другой символ.
Например,
AB-C-BC-EC
(+7-978-254-04-74
),AB-CC-AA-D
(+7-978-25-44-22-8
).«Серебряный номер» - в номере содержится созвучная пара или пары, расположенные по уменьшению/возрастанию. Например,
AB-CC-D-CC
(+7-978 25-44-9-44
),ABC-DE-DD
(+7-978-254-89-88
).«Рубиновый номер» - в номере содержится 2 пары одинаковых и/или зеркальных чисел
+7978 AAA BCBC
,+7978 AAA BCCB
«Золотой номер» - в номере содержится 3 одинаковых цифры, идущие подряд или пара из 3 одинаковых символов, расположенных по порядку или зеркально. Например:
ABC-DDD-A
(+7-978 254-000-2
),ABC-D-CBA
(+7-978 254-0-452
).«Изумрудный номер» - в номере содержится 2 тройки одинаковых цифры
+7 978 AAA?BBB
,7978?AAABBB
,+7978 333 2 XXX
,+7978 3888ХХХ
«Платиновый номер» - в номере содержится 4 одинаковых цифры, идущих подряд, пара из 2 одинаковых цифр, расположенных по порядку/зеркально или цифры, идущие в арифметическом порядке по возрастанию/уменьшению.
Например:
+7978 ?(AAAA)?
,+7978 (AAA AB AB)
,+7978 ?(AAA AB BA)
+7 978 300 0X X0
,+7 978 333 3X X3
,+7 978 444 4X X4
«Бриллиантовый номер» в номере в номере содержится 5 и более одинаковых цифр Пример:
+7978 ?(AAAAA)?
7978 300 00 0X
,7978 333 33 3X
,7 978 388 88 8X
,7 978 444 44 4X
Итого: 50 номеров