Решение на Телефонна любов от Тодор Добрев

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

Към профила на Тодор Добрев

Резултати

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

Код

number_to_letters = {0: ' ',
2: 'ABC',
3: 'DEF',
4: 'GHI',
5: 'JKL',
6: 'MNO',
7: 'PQRS',
8: 'TUV',
9: 'WXYZ'}
letter_to_numbers = {' ': [0],
'A': [2], 'B': [2, 2], 'C': [2, 2, 2],
'D': [3], 'E': [3, 3], 'F': [3, 3, 3],
'G': [4], 'H': [4, 4], 'I': [4, 4, 4],
'J': [5], 'K': [5, 5], 'L': [5, 5, 5],
'M': [6], 'N': [6, 6], 'O': [6, 6, 6],
'P': [7], 'Q': [7, 7], 'R': [7, 7, 7], 'S': [7, 7, 7, 7],
'T': [8], 'U': [8, 8], 'V': [8, 8, 8],
'W': [9], 'X': [9, 9], 'Y': [9, 9, 9], 'Z': [9, 9, 9, 9]}
# 1
def nums_to_text(nums):
def get_letter(digit, count):
letters = number_to_letters.get(digit)
if letters is not None:
count = (count - 1) % len(letters)
return letters[count]
return ''
if len(nums) == 0:
return ''
result = ''
digit = nums[0]
count = 1
for num in nums[1:]:
if digit != num:
result += get_letter(digit, count)
digit = num
count = 1
else:
count += 1
result += get_letter(digit, count)
return result
# 2
def text_to_nums(text):
result = []
for letter in text.upper():
nums = letter_to_numbers.get(letter)
if len(result) != 0 and nums is not None and result[-1] == nums[0]:
result.append(-1)
result.extend(nums)
return result
def normalize(angle):
angle %= 360
if angle < 0:
angle += 360
return angle
def round(angle):
if angle > 345:
return 0
n = angle % 30
if n <= 15:
return angle - n
else:
return angle + (30 - n)
# 3
def nums_to_angle(nums):
total = 0
for num in nums:
if num == 0:
total += 10
else:
total += num
return (total * 30) % 360
# 4
def angles_to_nums(angles):
result = []
for angle in angles:
angle = round(normalize(angle))
if angle == 300:
result.extend([0])
elif angle != 0 and angle != 330:
result.extend([int(angle / 30)])
return result
# 5
def is_phone_tastic(word):
nums = text_to_nums(word)
angle = nums_to_angle(nums)
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.350s

FAILED (errors=1)

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

Тодор обнови решението на 30.10.2022 12:30 (преди над 1 година)

+numbersToLetter = {0: ' ',
+ 2: 'ABC',
+ 3: 'DEF',
+ 4: 'GHI',
+ 5: 'JKL',
+ 6: 'MNO',
+ 7: 'PQRS',
+ 8: 'TUV',
+ 9: 'WXYZ'}
+
+letterToNumbers = {' ': [0],
+ 'A': [2], 'B': [2, 2], 'C': [2, 2, 2],
+ 'D': [3], 'E': [3, 3], 'F': [3, 3, 3],
+ 'G': [4], 'H': [4, 4], 'I': [4, 4, 4],
+ 'J': [5], 'K': [5, 5], 'L': [5, 5, 5],
+ 'M': [6], 'N': [6, 6], 'O': [6, 6, 6],
+ 'P': [7], 'Q': [7, 7], 'R': [7, 7, 7], 'S': [7, 7, 7, 7],
+ 'T': [8], 'U': [8, 8], 'V': [8, 8, 8],
+ 'W': [9], 'X': [9, 9], 'Y': [9, 9, 9], 'Z': [9, 9, 9, 9]}
+
+# 1
+def nums_to_text(nums):
+ def get_letter(digit, count):
+ letters = numbersToLetter.get(digit)
+ if letters is not None:
+ count = (count - 1) % len(letters)
+ return letters[count]
+ return ''
+
+ if len(nums) == 0:
+ return ''
+ result = ''
+ digit = nums[0]
+ count = 1
+ for num in nums[1:]:
+ if digit != num:
+ result += get_letter(digit, count)
+ digit = num
+ count = 1
+ else:
+ count += 1
+ result += get_letter(digit, count)
+ return result
+
+# 2
+def text_to_nums(text):
+ result = []
+ for letter in text.upper():
+ nums = letterToNumbers.get(letter)
+ if len(result) != 0 and nums is not None and result[-1] == nums[0]:
+ result.extend([-1])
+ result.extend(nums)
+ return result
+
+def normalize(angle):
+ angle %= 360
+ if angle < 0:
+ angle += 360
+ return angle
+
+def round(angle):
+ if angle > 345:
+ return 0
+ n = angle % 30
+ if n <= 15:
+ return angle - n
+ else:
+ return angle + (30 - n)
+
+# 3
+def nums_to_angle(nums):
+ total = 0
+ for num in nums:
+ if num == 0:
+ num = 10
+ total += num
+ return (total * 30) % 360
+
+# 4
+def angles_to_nums(angles):
+ result = []
+ for angle in angles:
+ angle = round(normalize(angle))
+ if angle == 300:
+ result.extend([0])
+ elif angle != 0 and angle != 330:
+ result.extend([int(angle / 30)])
+ return result
+
+# 5
+def is_phone_tastic(word):
+ nums = text_to_nums(word)
+ angle = nums_to_angle(nums)
+ return angle % len(word) == 0

Тодор обнови решението на 30.10.2022 13:25 (преди над 1 година)

-numbersToLetter = {0: ' ',
- 2: 'ABC',
- 3: 'DEF',
- 4: 'GHI',
- 5: 'JKL',
- 6: 'MNO',
- 7: 'PQRS',
- 8: 'TUV',
- 9: 'WXYZ'}
+number_to_letters = {0: ' ',
+ 2: 'ABC',
+ 3: 'DEF',
+ 4: 'GHI',
+ 5: 'JKL',
+ 6: 'MNO',
+ 7: 'PQRS',
+ 8: 'TUV',
+ 9: 'WXYZ'}
-letterToNumbers = {' ': [0],
- 'A': [2], 'B': [2, 2], 'C': [2, 2, 2],
- 'D': [3], 'E': [3, 3], 'F': [3, 3, 3],
- 'G': [4], 'H': [4, 4], 'I': [4, 4, 4],
- 'J': [5], 'K': [5, 5], 'L': [5, 5, 5],
- 'M': [6], 'N': [6, 6], 'O': [6, 6, 6],
- 'P': [7], 'Q': [7, 7], 'R': [7, 7, 7], 'S': [7, 7, 7, 7],
- 'T': [8], 'U': [8, 8], 'V': [8, 8, 8],
- 'W': [9], 'X': [9, 9], 'Y': [9, 9, 9], 'Z': [9, 9, 9, 9]}
+letter_to_numbers = {' ': [0],
+ 'A': [2], 'B': [2, 2], 'C': [2, 2, 2],
+ 'D': [3], 'E': [3, 3], 'F': [3, 3, 3],
+ 'G': [4], 'H': [4, 4], 'I': [4, 4, 4],
+ 'J': [5], 'K': [5, 5], 'L': [5, 5, 5],
+ 'M': [6], 'N': [6, 6], 'O': [6, 6, 6],
+ 'P': [7], 'Q': [7, 7], 'R': [7, 7, 7], 'S': [7, 7, 7, 7],
+ 'T': [8], 'U': [8, 8], 'V': [8, 8, 8],
+ 'W': [9], 'X': [9, 9], 'Y': [9, 9, 9], 'Z': [9, 9, 9, 9]}
# 1
def nums_to_text(nums):
def get_letter(digit, count):
- letters = numbersToLetter.get(digit)
+ letters = number_to_letters.get(digit)
if letters is not None:
count = (count - 1) % len(letters)
return letters[count]
return ''
if len(nums) == 0:
return ''
result = ''
digit = nums[0]
count = 1
for num in nums[1:]:
if digit != num:
result += get_letter(digit, count)
digit = num
count = 1
else:
count += 1
result += get_letter(digit, count)
return result
# 2
def text_to_nums(text):
result = []
for letter in text.upper():
- nums = letterToNumbers.get(letter)
+ nums = letter_to_numbers.get(letter)
if len(result) != 0 and nums is not None and result[-1] == nums[0]:
- result.extend([-1])
+ result.append(-1)
result.extend(nums)
return result
def normalize(angle):
angle %= 360
if angle < 0:
angle += 360
return angle
def round(angle):
if angle > 345:
return 0
n = angle % 30
if n <= 15:
return angle - n
else:
return angle + (30 - n)
# 3
def nums_to_angle(nums):
total = 0
for num in nums:
if num == 0:
- num = 10
- total += num
+ total += 10
+ else:
+ total += num
return (total * 30) % 360
# 4
def angles_to_nums(angles):
result = []
for angle in angles:
angle = round(normalize(angle))
if angle == 300:
result.extend([0])
elif angle != 0 and angle != 330:
result.extend([int(angle / 30)])
return result
# 5
def is_phone_tastic(word):
nums = text_to_nums(word)
angle = nums_to_angle(nums)
return angle % len(word) == 0