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

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

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

Резултати

  • 9 точки от тестове
  • 0 бонус точки
  • 9 точки общо
  • 35 успешни тест(а)
  • 2 неуспешни тест(а)

Код

from decimal import ROUND_HALF_DOWN, Decimal
mapped_nums = {2: 'abc', 3: 'def', 4: 'ghi', 5: 'jkl',
6: 'mno', 7: 'pqrs', 8: 'tuv', 9: 'wxyz', 0: ' '}
possible_numbers = [x % 10 for x in range(2, 11)]
possible_numbers.append(0)
def get_char(nums, index_from, index_to):
if nums[index_from] in possible_numbers:
chars = mapped_nums[nums[index_from]]
return chars[(index_to - index_from - 1) % len(chars)]
return ''
def nums_to_text(nums):
index_from, index_to = 0, 0
sentence = ''
while index_to < len(nums):
if nums[index_from] != nums[index_to]:
sentence += get_char(nums, index_from, index_to)
index_from = index_to
index_to += 1
sentence += get_char(nums, index_from, index_to)
return sentence
def text_to_nums(text):
result = []
last_num = None
for char in text.lower():
char_order = (ord(char)-ord('a'))
number = None
repetitions = None
if char == ' ':
number = 0
repetitions = 1
elif char < 'p':
repetitions = char_order % 3 + 1
number = int(char_order/3) + 2
elif char in ['t', 'u', 'v']:
repetitions = (char_order - 1) % 3 + 1
number = int((char_order-1)/3) + 2
elif char >= 'p' and char <= 's':
repetitions = ((char_order + 1) % 4) + 1
number = 7
elif char >= 'w' and char <= 'z':
repetitions = (char_order + 2) % 4 + 1
number = 9
if last_num == number:
result += [-1]
last_num = number
result += repetitions * [number]
return result
def nums_to_angle(nums):
angle = 0
for num in nums:
if num == 0:
angle += 300
else:
angle += num*30
return angle % 360
def angles_to_nums(angles):
nums = []
for angle in angles:
angle = angle % 360
if angle < 0:
angle = 360-angle
angle = Decimal(angle/30).to_integral_value(rounding=ROUND_HALF_DOWN)
if angle == 10:
nums.append(0)
elif angle == 0 or angle > 10:
continue
else:
nums.append(int(angle))
return nums
def is_phone_tastic(word):
angle = nums_to_angle(text_to_nums(word))
return angle % len(word) == 0

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

..........E...........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

======================================================================
ERROR: test_empty_input (test.TestNumsToText)
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
IndexError: list index out of range

----------------------------------------------------------------------
Ran 37 tests in 0.350s

FAILED (errors=2)

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

Данаил обнови решението на 01.11.2022 23:58 (преди над 1 година)

+from decimal import ROUND_HALF_DOWN, Decimal
+
+mapped_nums = {2: 'abc', 3: 'def', 4: 'ghi', 5: 'jkl',
+ 6: 'mno', 7: 'pqrs', 8: 'tuv', 9: 'wxyz', 0: ' '}
+
+possible_numbers = [x % 10 for x in range(2, 11)]
+possible_numbers.append(0)
+
+
+def get_char(nums, index_from, index_to):
+ if nums[index_from] in possible_numbers:
+ chars = mapped_nums[nums[index_from]]
+ return chars[(index_to - index_from - 1) % len(chars)]
+ return ''
+
+
+def nums_to_text(nums):
+ index_from, index_to = 0, 0
+ sentence = ''
+ while index_to < len(nums):
+ if nums[index_from] != nums[index_to]:
+ sentence += get_char(nums, index_from, index_to)
+ index_from = index_to
+ index_to += 1
+ sentence += get_char(nums, index_from, index_to)
+ return sentence
+
+
+def text_to_nums(text):
+ result = []
+ last_num = None
+ for char in text.lower():
+ char_order = (ord(char)-ord('a'))
+ number = None
+ repetitions = None
+ if char == ' ':
+ number = 0
+ repetitions = 1
+ elif char < 'p':
+ repetitions = char_order % 3 + 1
+ number = int(char_order/3) + 2
+ elif char in ['t', 'u', 'v']:
+ repetitions = (char_order - 1) % 3 + 1
+ number = int((char_order-1)/3) + 2
+ elif char >= 'p' and char <= 's':
+ repetitions = ((char_order + 1) % 4) + 1
+ number = 7
+ elif char >= 'w' and char <= 'z':
+ repetitions = (char_order + 2) % 4 + 1
+ number = 9
+ if last_num == number:
+ result += [-1]
+ last_num = number
+ result += repetitions * [number]
+ return result
+
+
+def nums_to_angle(nums):
+ angle = 0
+ for num in nums:
+ if num == 0:
+ angle += 300
+ else:
+ angle += num*30
+ return angle % 360
+
+
+def angles_to_nums(angles):
+ nums = []
+ for angle in angles:
+ angle = angle % 360
+ if angle < 0:
+ angle = 360-angle
+ angle = Decimal(angle/30).to_integral_value(rounding=ROUND_HALF_DOWN)
+ if angle == 10:
+ nums += [0]
+ elif angle == 0 or angle > 10:
+ continue
+ else:
+ nums += [int(angle)]
+ return nums
+
+
+def is_phone_tastic(word):
+ angle = nums_to_angle(text_to_nums(word))
+ return angle % len(word) == 0

Тук таме имаш липсващи спейсове около някои оператори, но in general - решението е добре написано.
Само това с конкатенацията на списък с 1 елемент е малко sus. :)

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

from decimal import ROUND_HALF_DOWN, Decimal
mapped_nums = {2: 'abc', 3: 'def', 4: 'ghi', 5: 'jkl',
6: 'mno', 7: 'pqrs', 8: 'tuv', 9: 'wxyz', 0: ' '}
possible_numbers = [x % 10 for x in range(2, 11)]
possible_numbers.append(0)
def get_char(nums, index_from, index_to):
if nums[index_from] in possible_numbers:
chars = mapped_nums[nums[index_from]]
return chars[(index_to - index_from - 1) % len(chars)]
return ''
def nums_to_text(nums):
index_from, index_to = 0, 0
sentence = ''
while index_to < len(nums):
if nums[index_from] != nums[index_to]:
sentence += get_char(nums, index_from, index_to)
index_from = index_to
index_to += 1
sentence += get_char(nums, index_from, index_to)
return sentence
def text_to_nums(text):
result = []
last_num = None
for char in text.lower():
char_order = (ord(char)-ord('a'))
number = None
repetitions = None
if char == ' ':
number = 0
repetitions = 1
elif char < 'p':
repetitions = char_order % 3 + 1
number = int(char_order/3) + 2
elif char in ['t', 'u', 'v']:
repetitions = (char_order - 1) % 3 + 1
number = int((char_order-1)/3) + 2
elif char >= 'p' and char <= 's':
repetitions = ((char_order + 1) % 4) + 1
number = 7
elif char >= 'w' and char <= 'z':
repetitions = (char_order + 2) % 4 + 1
number = 9
if last_num == number:
result += [-1]
last_num = number
result += repetitions * [number]
return result
def nums_to_angle(nums):
angle = 0
for num in nums:
if num == 0:
angle += 300
else:
angle += num*30
return angle % 360
def angles_to_nums(angles):
nums = []
for angle in angles:
angle = angle % 360
if angle < 0:
angle = 360-angle
angle = Decimal(angle/30).to_integral_value(rounding=ROUND_HALF_DOWN)
if angle == 10:
- nums += [0]
+ nums.append(0)
elif angle == 0 or angle > 10:
continue
else:
- nums += [int(angle)]
+ nums.append(int(angle))
return nums
def is_phone_tastic(word):
angle = nums_to_angle(text_to_nums(word))
return angle % len(word) == 0