Решение на Телефонна любов от Петър Петров

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

Към профила на Петър Петров

Резултати

  • 10 точки от тестове
  • 1 бонус точка
  • 11 точки общо
  • 36 успешни тест(а)
  • 1 неуспешни тест(а)

Код

KEYBOARD_BUTTONS = {2: ['A', 'B', 'C'], 3: ['D', 'E', 'F'], 4: ['G', 'H', 'I'], 5: ['J', 'K', 'L'], 6: ['M', 'N', 'O'],
7: ['P', 'Q', 'R', 'S'], 8: ['T', 'U', 'V'], 9: ['W', 'X', 'Y', 'Z'], 0: [' ']}
def nums_to_text(numbers):
cur_count_of_the_letter = 0
index = 0
result_string = ""
while index < len(numbers):
if numbers[index] == -1 or numbers[index] == 1:
index += 1
continue
if index != len(numbers) - 1:
if numbers[index] == numbers[index + 1]:
cur_count_of_the_letter += 1
index += 1
continue
if cur_count_of_the_letter + 1 > len(KEYBOARD_BUTTONS[numbers[index]]):
cur_count_of_the_letter = cur_count_of_the_letter % len(KEYBOARD_BUTTONS[numbers[index]])
result_string += KEYBOARD_BUTTONS[numbers[index]][cur_count_of_the_letter]
cur_count_of_the_letter = 0
index += 1
return result_string
def text_to_nums(string):
upper_string = string.upper()
result_numbers = []
for letter in upper_string:
for button_number, button_letters in KEYBOARD_BUTTONS.items():
if result_numbers and letter in button_letters and result_numbers[-1] == button_number:
result_numbers.append(-1)
if letter in button_letters:
for i in range(0, button_letters.index(letter) + 1):
result_numbers.append(button_number)
return result_numbers
def nums_to_angle(numbers):
normalize_angle = 0
for number in numbers:
if number == -1:
continue
if number == 0:
normalize_angle += 300
else:
normalize_angle += number * 30
if normalize_angle > 359:
normalize_angle %= 360
return normalize_angle
def angles_to_nums(angles):
numbers = []
for angle in angles:
new_angle = angle
# if new_angle == 666° then 666° % 360° == 306° == 0,
# but if new_angle == -666°, then -666° + 360° == -306° == 56° == 2
if new_angle > 360 or new_angle < 0:
new_angle %= 360
# round to a multiple of 30
if new_angle % 30 > 15:
new_angle += 30 - (new_angle % 30)
elif 0 < new_angle % 30 <= 15:
new_angle -= new_angle % 30
# miss the angles
if new_angle == 360 or new_angle == 0 or new_angle == 330:
continue
# if the angle is 300° we need to append 0
if new_angle == 300:
numbers.append(0)
continue
numbers.append(int(new_angle / 30))
return numbers
def is_phone_tastic(word):
numbers = text_to_nums(word)
angle = nums_to_angle(numbers)
return angle % len(word) == 0

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

..........E..........................
======================================================================
ERROR: test_empty_input (test.TestIsPhonetastic)
Test with empty input.
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/storage/deedee/data/rails/pyfmi-2022/releases/20221020151654/lib/language/python/runner.py", line 67, in thread
    raise result
ZeroDivisionError: integer division or modulo by zero

----------------------------------------------------------------------
Ran 37 tests in 0.329s

FAILED (errors=1)

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

Петър обнови решението на 29.10.2022 17:04 (преди над 1 година)

+KEYBOARD_BUTTONS = {2: ['A', 'B', 'C'], 3: ['D', 'E', 'F'], 4: ['G', 'H', 'I'], 5: ['J', 'K', 'L'], 6: ['M', 'N', 'O'],
+ 7: ['P', 'Q', 'R', 'S'], 8: ['T', 'U', 'V'], 9: ['W', 'X', 'Y', 'Z'], 0: [' ']}
+
+
+def nums_to_text(numbers):
+ cur_count_of_the_letter = 0
+ index = 0
+ result_string = ""
+ while index < len(numbers):
+ if numbers[index] == -1 or numbers[index] == 1:
+ index += 1
+ continue
+
+ if index != len(numbers) - 1:
+ if numbers[index] == numbers[index + 1]:
+ cur_count_of_the_letter += 1
+ index += 1
+ continue
+
+ if cur_count_of_the_letter + 1 > len(KEYBOARD_BUTTONS[numbers[index]]):
+ cur_count_of_the_letter = cur_count_of_the_letter % len(KEYBOARD_BUTTONS[numbers[index]])
+
+ result_string += KEYBOARD_BUTTONS[numbers[index]][cur_count_of_the_letter]
+ cur_count_of_the_letter = 0
+ index += 1
+ return result_string
+
+
+def text_to_nums(string):
+ upper_string = string.upper()
+ result_numbers = []
+ for letter in upper_string:
+ for button_number, button_letters in KEYBOARD_BUTTONS.items():
+ if result_numbers and letter in button_letters and result_numbers[-1] == button_number:
+ result_numbers.append(-1)
+
+ if letter in button_letters:
+ for i in range(0, button_letters.index(letter) + 1):
+ result_numbers.append(button_number)
+ return result_numbers
+
+
+def nums_to_angle(numbers):
+ normalize_angle = 0
+ for number in numbers:
+ if number == -1:
+ continue
+ if number == 0:
+ normalize_angle += 300
+ else:
+ normalize_angle += number * 30
+
+ if normalize_angle > 359:
+ normalize_angle %= 360
+ return normalize_angle
+
+
+def angles_to_nums(angles):
+ numbers = []
+ for angle in angles:
+ new_angle = angle
+ if angle < 0:
+ new_angle = 360 + angle
+
+ if new_angle > 360:
+ new_angle %= 360
+
+ if new_angle % 30 > 15:
+ new_angle += 30 - (new_angle % 30)
+ elif 0 < new_angle % 30 <= 15:
+ new_angle -= new_angle % 30
+
+ if new_angle == 360 or new_angle == 0 or new_angle == 330:
+ continue
+
+ if new_angle < 0:
+ new_angle *= -1
+
+ if new_angle == 300:
+ numbers.append(0)
+ continue
+
+ numbers.append(int(new_angle / 30))
+ return numbers
+
+
+def is_phone_tastic(word):
+ numbers = text_to_nums(word)
+ angle = nums_to_angle(numbers)
+ if angle % len(word) == 0:
+ return True
+ else:
+ return False
+

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

Петър обнови решението на 30.10.2022 18:25 (преди над 1 година)

KEYBOARD_BUTTONS = {2: ['A', 'B', 'C'], 3: ['D', 'E', 'F'], 4: ['G', 'H', 'I'], 5: ['J', 'K', 'L'], 6: ['M', 'N', 'O'],
7: ['P', 'Q', 'R', 'S'], 8: ['T', 'U', 'V'], 9: ['W', 'X', 'Y', 'Z'], 0: [' ']}
def nums_to_text(numbers):
cur_count_of_the_letter = 0
index = 0
result_string = ""
while index < len(numbers):
if numbers[index] == -1 or numbers[index] == 1:
index += 1
continue
if index != len(numbers) - 1:
if numbers[index] == numbers[index + 1]:
cur_count_of_the_letter += 1
index += 1
continue
if cur_count_of_the_letter + 1 > len(KEYBOARD_BUTTONS[numbers[index]]):
cur_count_of_the_letter = cur_count_of_the_letter % len(KEYBOARD_BUTTONS[numbers[index]])
result_string += KEYBOARD_BUTTONS[numbers[index]][cur_count_of_the_letter]
cur_count_of_the_letter = 0
index += 1
return result_string
def text_to_nums(string):
upper_string = string.upper()
result_numbers = []
for letter in upper_string:
for button_number, button_letters in KEYBOARD_BUTTONS.items():
if result_numbers and letter in button_letters and result_numbers[-1] == button_number:
result_numbers.append(-1)
if letter in button_letters:
for i in range(0, button_letters.index(letter) + 1):
result_numbers.append(button_number)
return result_numbers
def nums_to_angle(numbers):
normalize_angle = 0
for number in numbers:
if number == -1:
continue
if number == 0:
normalize_angle += 300
else:
normalize_angle += number * 30
if normalize_angle > 359:
normalize_angle %= 360
return normalize_angle
def angles_to_nums(angles):
numbers = []
for angle in angles:
new_angle = angle
- if angle < 0:
- new_angle = 360 + angle
-
- if new_angle > 360:
+ # if new_angle == 666° then 666° % 360° == 306° == 0,
+ # but if new_angle == -666°, then -666° + 360° == -306° == 56° == 2
+ if new_angle > 360 or new_angle < 0:
new_angle %= 360
+ # round to a multiple of 30
if new_angle % 30 > 15:
new_angle += 30 - (new_angle % 30)
elif 0 < new_angle % 30 <= 15:
new_angle -= new_angle % 30
+ # miss the angles
if new_angle == 360 or new_angle == 0 or new_angle == 330:
continue
- if new_angle < 0:
- new_angle *= -1
-
+ # if the angle is 300° we need to append 0
if new_angle == 300:
numbers.append(0)
continue
numbers.append(int(new_angle / 30))
return numbers
def is_phone_tastic(word):
numbers = text_to_nums(word)
angle = nums_to_angle(numbers)
- if angle % len(word) == 0:
- return True
+ return angle % len(word) == 0
- else:
- return False
-

Благодаря за коментара върху нормализиране и закръгляване на ъгли, опитах се да измисля по-адекватно решение и си намерих няколко грешни случая.

Оправих си решението и промених малко кода, надявам се да е по-разбираемо сега.

--pesho :D