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

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

Към профила на Даниела Дишлянова

Резултати

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

Код

def nums_to_text(nums):
nums_to_letters = {
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')
}
text = ''
counter_num = 0
for index in range(len(nums)):
if nums[index] in (-1, 1):
counter_num = 0
continue
elif nums[index] == 0:
text = text + ' '
counter_num = 0
continue
if index+1 < len(nums) and nums[index] == nums[index+1]:
counter_num = counter_num + 1
continue
if nums[index] in (7, 9):
text = text + nums_to_letters[nums[index]][counter_num%4]
else:
text = text + nums_to_letters[nums[index]][counter_num%3]
counter_num = 0
return text
def text_to_nums(text):
letters_to_nums = {
' ': [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],
}
nums = []
for index in range(len(text)):
letter = text[index].upper()
if letter == ' ':
nums.append(0)
continue
nums.extend(letters_to_nums[letter])
if index + 1 < len(text) and letters_to_nums[letter][0] in letters_to_nums[text[index+1].upper()]:

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

nums.append(-1)
return nums
def nums_to_angle(nums):
angles_sum = 0
for num in nums:
if num == 0:
angles_sum = angles_sum + 300
else:
angles_sum = angles_sum + num*30
while angles_sum > 360:
angles_sum = angles_sum - 360
while angles_sum < 0:
angles_sum = angles_sum + 360
return angles_sum
def angles_to_nums(angles):
angle_to_num = {
(0, 16) : -1,
(16, 46) : 1,
(46, 76) : 2,
(76, 106) : 3,
(106, 136) : 4,
(136, 166) : 5,
(166, 196) : 6,
(196, 226) : 7,
(226, 256) : 8,
(256, 286) : 9,
(286, 346) : 0,
(346, 361) : -1
}
nums = []
for angle in angles:
normalized_angle = angle
while normalized_angle > 360:
normalized_angle = normalized_angle - 360
while normalized_angle < 0:
normalized_angle = normalized_angle + 360
for ranges in angle_to_num.keys():
if normalized_angle in range(ranges[0], ranges[1]) and angle_to_num[ranges] != -1 :
nums.append(angle_to_num[ranges])
continue
return nums
def is_phone_tastic(word):
word_to_nums = text_to_nums(word)
normalazed_angle = nums_to_angle(word_to_nums)
return normalazed_angle % len(word) == 0

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

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

======================================================================
FAIL: test_ignoring_over_330 (test.TestAnglesToNums)
Test that angles rounded over 330 are ignored.
----------------------------------------------------------------------
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
AssertionError: Lists differ: [0] != []

First list contains 1 additional elements.
First extra element 0:
0

- [0]
?  -

+ []

======================================================================
FAIL: test_random_mixed_case (test.TestAnglesToNums)
Test with a random mixed 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
AssertionError: Lists differ: [5, 1, 2, 4, 9, 0, 0, 1, 8, 0, 9] != [5, 1, 2, 4, 9, 1, 8, 0, 9]

First differing element 5:
0
1

First list contains 2 additional elements.
First extra element 9:
0

- [5, 1, 2, 4, 9, 0, 0, 1, 8, 0, 9]
+ [5, 1, 2, 4, 9, 1, 8, 0, 9]

======================================================================
FAIL: test_normalizing_for_top_boundary (test.TestNumsToAngles)
Test normalizing when the sum is full circle.
----------------------------------------------------------------------
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
AssertionError: 360 != 0

----------------------------------------------------------------------
Ran 37 tests in 0.461s

FAILED (failures=3, errors=1)

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

Даниела обнови решението на 31.10.2022 20:09 (преди над 1 година)

+
+def nums_to_text(nums):
+ nums_to_letters = {
+ 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')
+ }
+ text=''
+ index=0
+ while index< len(nums):
+ if nums[index] in (-1,1):
+ index = index + 1
+ continue
+ elif nums[index] == 0:
+ text = text + ' '
+ index = index + 1
+ continue
+ counter_num=0
+ while index+1 < len(nums) and nums[index] == nums[index+1]:
+ counter_num = counter_num + 1
+ index = index + 1
+ if nums[index] in (7, 9):
+ text = text + nums_to_letters[nums[index]][counter_num%4]
+ else:
+ text = text + nums_to_letters[nums[index]][counter_num%3]
+ index = index + 1
+ return text
+
+
+def text_to_nums(text):
+ letters_to_nums = {
+ ' ':[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],
+ }
+ nums=[]
+ for index in range(len(text)):
+ letter=text[index].upper()
+ if letter == ' ':
+ nums.append(0)
+ continue
+ nums.extend(letters_to_nums[letter])
+ if index + 1 < len(text) and letters_to_nums[letter][0] in letters_to_nums[text[index+1].upper()]:

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

+ nums.append(-1)
+ return nums
+
+
+def nums_to_angle(nums):
+ angles_sum = 0
+ for num in nums:
+ if num == 0:
+ angles_sum = angles_sum + 300
+ else:
+ angles_sum = angles_sum + num*30
+ while angles_sum > 360:
+ angles_sum = angles_sum - 360
+ while angles_sum < 0:
+ angles_sum = angles_sum + 360
+ return angles_sum
+
+
+def angles_to_nums(angles):
+ angle_to_num = {
+ (0,16) : -1,
+ (16,46) : 1,
+ (46,76) : 2,
+ (76,106) : 3,
+ (106,136) : 4,
+ (136,166) : 5,
+ (166,196) : 6,
+ (196,226) : 7,
+ (226,256) : 8,
+ (256,286) : 9,
+ (286,346) : 0,
+ (346,361): -1
+ }
+ nums = []
+ for angle in angles:
+ normalized_angle = angle
+ while normalized_angle > 360:
+ normalized_angle = normalized_angle - 360
+ while normalized_angle < 0:
+ normalized_angle = normalized_angle + 360
+ for ranges in angle_to_num.keys():
+ if normalized_angle in range(ranges[0],ranges[1]) and angle_to_num[ranges]!=-1 :
+ nums.append(angle_to_num[ranges])
+ continue
+ return nums
+
+
+def is_phone_tastic(word):
+ word_to_nums = text_to_nums(word)
+ normalazed_angle = nums_to_angle(word_to_nums)
+ return normalazed_angle % len(word) == 0

Доста от коментарите ми вече са те насочили натам, но пък това е есенцията на мнението ми - прегледай правилата за интервали от PEP8. Иначе бих казал, че решението е добро.

Даниела обнови решението на 02.11.2022 17:12 (преди над 1 година)

def nums_to_text(nums):
nums_to_letters = {
- 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')
+ 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')
}
- text=''
- index=0
- while index< len(nums):
- if nums[index] in (-1,1):
- index = index + 1
+ text = ''
+ counter_num = 0
+ for index in range(len(nums)):
+ if nums[index] in (-1, 1):
+ counter_num = 0
continue
elif nums[index] == 0:
text = text + ' '
- index = index + 1
+ counter_num = 0
continue
- counter_num=0
- while index+1 < len(nums) and nums[index] == nums[index+1]:
+ if index+1 < len(nums) and nums[index] == nums[index+1]:
counter_num = counter_num + 1
- index = index + 1
+ continue
if nums[index] in (7, 9):
text = text + nums_to_letters[nums[index]][counter_num%4]
else:
- text = text + nums_to_letters[nums[index]][counter_num%3]
- index = index + 1
+ text = text + nums_to_letters[nums[index]][counter_num%3]
+ counter_num = 0
return text
def text_to_nums(text):
letters_to_nums = {
- ' ':[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],
+ ' ': [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],
}
- nums=[]
+ nums = []
for index in range(len(text)):
- letter=text[index].upper()
+ letter = text[index].upper()
if letter == ' ':
nums.append(0)
continue
nums.extend(letters_to_nums[letter])
if index + 1 < len(text) and letters_to_nums[letter][0] in letters_to_nums[text[index+1].upper()]:
nums.append(-1)
return nums
def nums_to_angle(nums):
angles_sum = 0
for num in nums:
if num == 0:
angles_sum = angles_sum + 300
else:
angles_sum = angles_sum + num*30
while angles_sum > 360:
angles_sum = angles_sum - 360
while angles_sum < 0:
angles_sum = angles_sum + 360
return angles_sum
def angles_to_nums(angles):
angle_to_num = {
- (0,16) : -1,
- (16,46) : 1,
- (46,76) : 2,
- (76,106) : 3,
- (106,136) : 4,
- (136,166) : 5,
- (166,196) : 6,
- (196,226) : 7,
- (226,256) : 8,
- (256,286) : 9,
- (286,346) : 0,
- (346,361): -1
+ (0, 16) : -1,
+ (16, 46) : 1,
+ (46, 76) : 2,
+ (76, 106) : 3,
+ (106, 136) : 4,
+ (136, 166) : 5,
+ (166, 196) : 6,
+ (196, 226) : 7,
+ (226, 256) : 8,
+ (256, 286) : 9,
+ (286, 346) : 0,
+ (346, 361) : -1
}
nums = []
for angle in angles:
normalized_angle = angle
while normalized_angle > 360:
normalized_angle = normalized_angle - 360
while normalized_angle < 0:
normalized_angle = normalized_angle + 360
for ranges in angle_to_num.keys():
- if normalized_angle in range(ranges[0],ranges[1]) and angle_to_num[ranges]!=-1 :
+ if normalized_angle in range(ranges[0], ranges[1]) and angle_to_num[ranges] != -1 :
nums.append(angle_to_num[ranges])
continue
return nums
def is_phone_tastic(word):
word_to_nums = text_to_nums(word)
normalazed_angle = nums_to_angle(word_to_nums)
return normalazed_angle % len(word) == 0