Решение на Телефонна любов от Стилиян Иванов

Обратно към всички решения

Към профила на Стилиян Иванов

Резултати

  • 10 точки от тестове
  • 0 бонус точки
  • 10 точки общо
  • 37 успешни тест(а)
  • 0 неуспешни тест(а)

Код

letters_nums_mapping = {
"a": (2, 1), "b": (2, 2), "c": (2, 3),
"d": (3, 1), "e": (3, 2), "f": (3, 3),
"g": (4, 1), "h": (4, 2), "i": (4, 3),
"j": (5, 1), "k": (5, 2), "l": (5, 3),
"m": (6, 1), "n": (6, 2), "o": (6, 3),
"p": (7, 1), "q": (7, 2), "r": (7, 3), "s": (7, 4),
"t": (8, 1), "u": (8, 2), "v": (8, 3),
"w": (9, 1), "x": (9, 2), "y": (9, 3), "z": (9, 4),
" ": (0, 1)
}
nums_letters_mapping = dict((value, key) for key, value in letters_nums_mapping.items())
def normal_count(num, count):
group_size = 4 if num in [7, 9] else 3
count = count % group_size
if count == 0:
count += group_size
return count
def nums_to_text(nums):
text = ""
count_letter = 1
for index, num in enumerate(nums):

Този цикъл има доста разклонения в себе си. Предполагам, че с малко усилия би могъл да го опростиш. Няма да те лъжа - не мога да го асимилирам с един поглед, а не искам да вниквам в логиката по-надълбоко, защото ще ми отнеме време да го разбера.

if num == 1:
nums[index] = -1
if index == 0:
if len(nums) == 1:
if num not in [-1, 1]:
text += nums_letters_mapping[num, 1]
break
continue
elif num == nums[index - 1]:
count_letter += 1
if index == len(nums) - 1 and num not in [-1, 0]:
text += nums_letters_mapping[
num,
normal_count(num, count_letter)
]
if index == len(nums) - 1 and num == 0:
for i in range(count_letter):
text += " "
else:
previous_num = nums[index - 1]
if previous_num not in [-1, 0]:
text += nums_letters_mapping[
previous_num,
normal_count(previous_num, count_letter)
]
if previous_num == 0:
for i in range(count_letter):
text += " "
if index == len(nums) - 1 and num not in [-1, 0]:
text += nums_letters_mapping[num, 1]
break
if index == len(nums) - 1 and num == 0:
text += " "
count_letter = 1
return text
def text_to_nums(text):
numbers = []
text_lower = text.lower()
for index, letter in enumerate(text_lower):
digit, count = letters_nums_mapping[letter]
digit_previous = letters_nums_mapping[text_lower[index - 1]][0]
if index > 0 and digit == digit_previous:
numbers.append(-1)
numbers.extend([digit] * count)
return numbers
def nums_to_angle(nums):
angle = 0
for num in nums:
angle += 300 if num == 0 else num * 30
return angle % 360
def custom_round(num):
import math

Това е функция, която извикваш многократно, което значи, че ще импортираш модула многократно. Почти винаги импортирането на модулите стои в началото на файла. За този конкретен случай няма две мнения по въпроса - трябва да е на ред номер 1 :)

return math.ceil(num - 0.5)
def angles_to_nums(angles):
nums = []
for angle in angles:
number = custom_round(angle % 360 / 30)
if number > 0 and number <= 10:
nums.append(number % 10)
return nums
def is_phone_tastic(text):
if len(text) > 0:
return nums_to_angle(text_to_nums(text)) % len(text) == 0
return False

Лог от изпълнението

.....................................
----------------------------------------------------------------------
Ran 37 tests in 0.322s

OK

История (2 версии и 5 коментара)

Стилиян обнови решението на 31.10.2022 15:55 (преди над 1 година)

+letters_nums_mapping = {
+ "a": (2, 1), "b": (2, 2), "c": (2, 3),
+ "d": (3, 1), "e": (3, 2), "f": (3, 3),
+ "g": (4, 1), "h": (4, 2), "i": (4, 3),
+ "j": (5, 1), "k": (5, 2), "l": (5, 3),
+ "m": (6, 1), "n": (6, 2), "o": (6, 3),
+ "p": (7, 1), "q": (7, 2), "r": (7, 3), "s": (7, 4),
+ "t": (8, 1), "u": (8, 2), "v": (8, 3),
+ "w": (9, 1), "x": (9, 2), "y": (9, 3), "z": (9, 4),
+ " ": (0, 1)
+ }
+
+nums_letters_mapping = dict((value, key) for key, value in letters_nums_mapping.items())
+
+def normal_count(num, count):
+ group_size = 4 if num in [7, 9] else 3
+ count = count % group_size
+ if count == 0:
+ count += group_size
+ return count
+
+def nums_to_text(nums):
+ text = ""
+ count_letter = 1
+ for index, num in enumerate(nums):

Този цикъл има доста разклонения в себе си. Предполагам, че с малко усилия би могъл да го опростиш. Няма да те лъжа - не мога да го асимилирам с един поглед, а не искам да вниквам в логиката по-надълбоко, защото ще ми отнеме време да го разбера.

+ if index == 0:
+ if len(nums) == 1:
+ text += nums_letters_mapping[num, 1]
+ break
+ continue
+ elif num == nums[index - 1]:
+ count_letter += 1
+ if index == len(nums) - 1 and num != -1:
+ text += nums_letters_mapping[
+ num,
+ normal_count(num, count_letter)
+ ]
+ else:
+ previous_num = nums[index - 1]
+ if previous_num != -1:
+ text += nums_letters_mapping[
+ previous_num,
+ normal_count(previous_num, count_letter)
+ ]
+ if index == len(nums) - 1 and num != -1:
+ text += nums_letters_mapping[num, 1]
+ break
+ count_letter = 1
+ return text
+
+def text_to_nums(text):
+ numbers = []
+ text_lower = text.lower()
+ for index, letter in enumerate(text_lower):
+ digit, count = letters_nums_mapping[letter]
+ digit_previous = letters_nums_mapping[text_lower[index - 1]][0]
+ if index > 0 and digit == digit_previous:
+ numbers.append(-1)
+ numbers.extend([digit] * count)
+ return numbers
+
+def nums_to_angle(nums):
+ angle = 0
+ for num in nums:
+ angle += 300 if num == 0 else num * 30
+ return angle % 360
+
+def custom_round(num):
+ import math

Това е функция, която извикваш многократно, което значи, че ще импортираш модула многократно. Почти винаги импортирането на модулите стои в началото на файла. За този конкретен случай няма две мнения по въпроса - трябва да е на ред номер 1 :)

+ return math.ceil(num - 0.5)
+
+def angles_to_nums(angles):
+ nums = []
+ for angle in angles:
+ number = custom_round(angle % 360 / 30)
+ if number > 0 and number <= 10:
+ nums.append(number % 10)
+ return nums
+
+def is_phone_tastic(text):
+ return nums_to_angle(text_to_nums(text)) % len(text) == 0

Добро решение. Единствено първата функция ми дойде в повече. Да, тя е с най-сложния алгоритъм, но точно затова трябва да се адресира най-внимателно. Не е нужно да рефакторираш за ново решение. Просто коментар, който да вземеш предвид за следващи задачи.

Стилиян обнови решението на 03.11.2022 16:16 (преди над 1 година)

letters_nums_mapping = {
"a": (2, 1), "b": (2, 2), "c": (2, 3),
"d": (3, 1), "e": (3, 2), "f": (3, 3),
"g": (4, 1), "h": (4, 2), "i": (4, 3),
"j": (5, 1), "k": (5, 2), "l": (5, 3),
"m": (6, 1), "n": (6, 2), "o": (6, 3),
"p": (7, 1), "q": (7, 2), "r": (7, 3), "s": (7, 4),
"t": (8, 1), "u": (8, 2), "v": (8, 3),
"w": (9, 1), "x": (9, 2), "y": (9, 3), "z": (9, 4),
" ": (0, 1)
}
nums_letters_mapping = dict((value, key) for key, value in letters_nums_mapping.items())
def normal_count(num, count):
group_size = 4 if num in [7, 9] else 3
count = count % group_size
if count == 0:
count += group_size
return count
def nums_to_text(nums):
text = ""
count_letter = 1
for index, num in enumerate(nums):
+ if num == 1:
+ nums[index] = -1
if index == 0:
if len(nums) == 1:
- text += nums_letters_mapping[num, 1]
+ if num not in [-1, 1]:
+ text += nums_letters_mapping[num, 1]
break
continue
elif num == nums[index - 1]:
count_letter += 1
- if index == len(nums) - 1 and num != -1:
+ if index == len(nums) - 1 and num not in [-1, 0]:
text += nums_letters_mapping[
num,
normal_count(num, count_letter)
]
+ if index == len(nums) - 1 and num == 0:
+ for i in range(count_letter):
+ text += " "
else:
previous_num = nums[index - 1]
- if previous_num != -1:
+ if previous_num not in [-1, 0]:
text += nums_letters_mapping[
previous_num,
normal_count(previous_num, count_letter)
]
- if index == len(nums) - 1 and num != -1:
+ if previous_num == 0:
+ for i in range(count_letter):
+ text += " "
+ if index == len(nums) - 1 and num not in [-1, 0]:
text += nums_letters_mapping[num, 1]
break
+ if index == len(nums) - 1 and num == 0:
+ text += " "
count_letter = 1
return text
def text_to_nums(text):
numbers = []
text_lower = text.lower()
for index, letter in enumerate(text_lower):
digit, count = letters_nums_mapping[letter]
digit_previous = letters_nums_mapping[text_lower[index - 1]][0]
if index > 0 and digit == digit_previous:
numbers.append(-1)
numbers.extend([digit] * count)
return numbers
def nums_to_angle(nums):
angle = 0
for num in nums:
angle += 300 if num == 0 else num * 30
return angle % 360
def custom_round(num):
import math
return math.ceil(num - 0.5)
def angles_to_nums(angles):
nums = []
for angle in angles:
number = custom_round(angle % 360 / 30)
if number > 0 and number <= 10:
nums.append(number % 10)
return nums
def is_phone_tastic(text):
- return nums_to_angle(text_to_nums(text)) % len(text) == 0
+ if len(text) > 0:
+ return nums_to_angle(text_to_nums(text)) % len(text) == 0
+ return False