Решение на Телефонна любов от Никола Михайлов

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

Към профила на Никола Михайлов

Резултати

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

Код

def nums_to_text(nums):
mobile_keyboard = {
2: 'abc',
3: 'def',
4: 'ghi',
5: 'jkl',
6: 'mno',
7: 'pqrs',
8: 'tuv',
9: 'wxyz',
}
text = ''
index = -1
while index + 1 < len(nums):
index += 1
if abs(nums[index]) == 1:
continue
if nums[index] == 0:
text += ' '
continue
count_number = 0
while index + 1 < len(nums) and nums[index] == nums[index + 1]:
index += 1
count_number += 1
keyboard_number = nums[index]
number_of_letter = count_number % len(mobile_keyboard[keyboard_number])
text += mobile_keyboard[keyboard_number][number_of_letter]
return text
def text_to_nums(text):
character_to_numbers = {
'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),
}
nums = []
for char in text:
if char == ' ':
nums.append(0)
continue
char = char.lower()
number, times_repeated = character_to_numbers[char]
if len(nums) > 0 and nums[-1] == number:
nums.append(-1)
nums += [number] * times_repeated
return nums
def nums_to_angle(nums):
angle = 0
for number in nums:
if number < 0:
continue
if number == 0:
number += 10
angle = (angle + 30 * number) % 360
return angle
def angles_to_nums(angles):
numbers = []
for angle in angles:
angle %= 360
if not 15 < angle <= 315:
continue
def rounding_angle(number):
remainder = number % 30
quotient = number // 30
return (quotient + 1) * 30 if remainder > 15 else quotient * 30
rounded_angle = rounding_angle(angle)
numbers.append((rounded_angle // 30) % 10)
return numbers
def is_phone_tastic(word):
return not nums_to_angle(text_to_nums(word)) % len(word) if word else False

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

.....................................
----------------------------------------------------------------------
Ran 37 tests in 0.335s

OK

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

Никола обнови решението на 30.10.2022 01:35 (преди над 1 година)

+def nums_to_text(nums):
+ mobile_keyboard = {
+ 2: 'abc',
+ 3: 'def',
+ 4: 'ghi',
+ 5: 'jkl',
+ 6: 'mno',
+ 7: 'pqrs',
+ 8: 'tuv',
+ 9: 'wxyz',
+ }
+
+ text = ''
+ index = -1
+ while index + 1 < len(nums):
+ index += 1
+ if abs(nums[index]) == 1:
+ continue
+
+ if nums[index] == 0:
+ text += ' '
+ continue
+
+ count_number = 0
+ while index + 1 < len(nums) and nums[index] == nums[index + 1]:
+ index += 1
+ count_number += 1
+
+ text += mobile_keyboard[nums[index]][count_number % len(mobile_keyboard[nums[index]])]
+
+ return text
+
+
+def text_to_nums(text):
+ character_to_numbers = {
+ '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),
+ }
+
+ nums = []
+ for char in text:
+ if char == ' ':
+ nums.append(0)
+ continue
+
+ char = char.lower()
+ number, times_repeated = character_to_numbers[char]
+ if len(nums) > 0 and nums[-1] == number:
+ nums.append(-1)
+ nums += [number] * times_repeated
+
+ return nums
+
+
+def nums_to_angle(nums):
+ angle = 0
+ for number in nums:
+ if number < 0:
+ continue
+
+ if number == 0:
+ number += 10
+
+ angle = (angle + 30 * number) % 360
+
+ return angle
+
+
+def angles_to_nums(angles):
+ numbers = []
+
+ for angle in angles:
+ angle %= 360
+ if angle > 315 or angle <= 15:
+ continue
+
+ def rounding_angle(number):
+ remainder = number % 30
+ quotient = number // 30
+ return (quotient + 1) * 30 if remainder > 15 else quotient * 30
+
+ rounded_angle = rounding_angle(angle)
+ numbers.append((rounded_angle // 30) % 10)
+
+ return numbers
+
+
+def is_phone_tastic(word):
+ return not nums_to_angle(text_to_nums(word)) % len(word)

Добро решение.

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

Например: mobile_keyboard[nums[index]][count_number % len(mobile_keyboard[nums[index]])]

Никола обнови решението на 03.11.2022 14:41 (преди над 1 година)

def nums_to_text(nums):
mobile_keyboard = {
2: 'abc',
3: 'def',
4: 'ghi',
5: 'jkl',
6: 'mno',
7: 'pqrs',
8: 'tuv',
9: 'wxyz',
}
text = ''
index = -1
while index + 1 < len(nums):
index += 1
if abs(nums[index]) == 1:
continue
if nums[index] == 0:
text += ' '
continue
count_number = 0
while index + 1 < len(nums) and nums[index] == nums[index + 1]:
index += 1
count_number += 1
+
+ keyboard_number = nums[index]
+ number_of_letter = count_number % len(mobile_keyboard[keyboard_number])
+ text += mobile_keyboard[keyboard_number][number_of_letter]
- text += mobile_keyboard[nums[index]][count_number % len(mobile_keyboard[nums[index]])]
-
return text
def text_to_nums(text):
character_to_numbers = {
'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),
}
nums = []
for char in text:
if char == ' ':
nums.append(0)
continue
char = char.lower()
number, times_repeated = character_to_numbers[char]
if len(nums) > 0 and nums[-1] == number:
nums.append(-1)
nums += [number] * times_repeated
return nums
def nums_to_angle(nums):
angle = 0
for number in nums:
if number < 0:
continue
if number == 0:
number += 10
angle = (angle + 30 * number) % 360
return angle
def angles_to_nums(angles):
numbers = []
for angle in angles:
angle %= 360
- if angle > 315 or angle <= 15:
+ if not 15 < angle <= 315:
continue
def rounding_angle(number):
remainder = number % 30
quotient = number // 30
return (quotient + 1) * 30 if remainder > 15 else quotient * 30
rounded_angle = rounding_angle(angle)
numbers.append((rounded_angle // 30) % 10)
return numbers
def is_phone_tastic(word):
- return not nums_to_angle(text_to_nums(word)) % len(word)
+ return not nums_to_angle(text_to_nums(word)) % len(word) if word else False