Skip to content

Instantly share code, notes, and snippets.

@ig-rudenko
Created April 7, 2025 12:42
Show Gist options
  • Save ig-rudenko/f515c6cc1c43748179e2a0f56bb10d1e to your computer and use it in GitHub Desktop.
Save ig-rudenko/f515c6cc1c43748179e2a0f56bb10d1e to your computer and use it in GitHub Desktop.
Определение категории номера
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"))
@ig-rudenko
Copy link
Author

  • «Нефритовый номер» - в номере содержится 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 номеров

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment