Решение на Телефонна любов от Кристияна Николова

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

Към профила на Кристияна Николова

Резултати

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

Код

from itertools import groupby
phone_pad_letters = {0: ' ', 1: '', 2: 'ABC', 3: 'DEF',
4: 'GHI', 5: 'JKL', 6: 'MNO',
7: 'PQRS', 8: 'TUV', 9: 'WXYZ'}
letter_to_num = [[2], [2, 2], [2, 2, 2],
[3], [3, 3], [3, 3, 3],
[4], [4, 4], [4, 4, 4],
[5], [5, 5], [5, 5, 5],
[6], [6, 6], [6, 6, 6],
[7], [7, 7], [7, 7, 7], [7, 7, 7, 7],
[8], [8, 8], [8, 8, 8],
[9], [9, 9], [9, 9, 9], [9, 9, 9, 9]]
def nums_to_text(nums):
sms = ""
grouped_nums = [list(j) for i, j in groupby(nums)]
for group in grouped_nums:
current_num = group[0]
counter = len(group)
if current_num == 0 or current_num == 1:
sms += phone_pad_letters[current_num]
elif current_num == -1:
continue
elif ((current_num >= 2 and current_num <= 6) or current_num == 8):
sms += phone_pad_letters[current_num][counter % 3 - 1]
elif (current_num == 7 or current_num == 9):
sms += phone_pad_letters[current_num][counter % 4 - 1]
return sms
def text_to_nums(text):
nums = []
for letter in text.upper():
if letter == ' ':
nums.append(0)
else:
index = ord(letter) - ord('A')
for i in letter_to_num[index]:
nums.append(i)
return nums
def nums_to_angle(nums):
angles = 0
for num in nums:
if num == 0:
angles += 300
else:
angles += num * 30
return angles % 360
def angles_to_nums(angles):
numbers = []
for angle in angles:
angle %= 360
if angle % 30 != 0:
if angle % 30 <= 15:
angle = angle - angle % 30
else:
angle = (angle + angle % 30) - ((angle + angle % 30) % 30)
if angle == 300:
numbers.append(0)
elif angle != 0 and angle < 300:
numbers.append(angle//30)
return numbers
def is_phone_tastic(word):
transformed_word = nums_to_angle(text_to_nums(word))
return transformed_word % len(word) == 0

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

..........E...................FF.FF..
======================================================================
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_all_chars (test.TestTextToNums)
Test for correct mapping of all chars.
----------------------------------------------------------------------
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: [2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4,[121 chars]9, 0] != [2, -1, 2, 2, -1, 2, 2, 2, 3, -1, 3, 3, -1, 3[193 chars]9, 0]

First differing element 1:
2
-1

Second list contains 18 additional elements.
First extra element 57:
-1

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

======================================================================
FAIL: test_complex_word (test.TestTextToNums)
Test with a complex word that requires -1.
----------------------------------------------------------------------
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: [4, 6, 6] != [4, 6, -1, 6]

First differing element 2:
6
-1

Second list contains 1 additional elements.
First extra element 3:
6

- [4, 6, 6]
+ [4, 6, -1, 6]
?        ++++


======================================================================
FAIL: test_mixed_casing (test.TestTextToNums)
Test for both lower and capital case.
----------------------------------------------------------------------
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: [2, 2, 2, 3, 3] != [2, -1, 2, 2, 3, -1, 3]

First differing element 1:
2
-1

Second list contains 2 additional elements.
First extra element 5:
-1

- [2, 2, 2, 3, 3]
+ [2, -1, 2, 2, 3, -1, 3]
?     ++++         ++++


======================================================================
FAIL: test_random_mixed_case (test.TestTextToNums)
Test for a random mixed case.
----------------------------------------------------------------------
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: [8, 8, 8, 2, 7, 7, 7, 7, 5, 5, 6, 6, 6, 0, 0, 0, 5, 2, 2, 2, 2, 8, 2] not found in ([8, 8, 8, 2, 7, 7, 7, 7, 5, 5, 6, 6, 6, 0, -1, 0, -1, 0, 5, 2, -1, 2, 2, -1, 2, 8, 2], [8, 8, 8, 2, 7, 7, 7, 7, 5, 5, 6, 6, 6, 0, 0, 0, 5, 2, -1, 2, 2, -1, 2, 8, 2])

----------------------------------------------------------------------
Ran 37 tests in 0.349s

FAILED (failures=4, errors=1)

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

Кристияна обнови решението на 01.11.2022 13:19 (преди над 1 година)

+from itertools import groupby
+
+phone_pad_letters = {0: ' ', 1: '', 2: 'ABC', 3: 'DEF',
+ 4: 'GHI', 5: 'JKL', 6: 'MNO',
+ 7: 'PQRS', 8: 'TUV', 9: 'WXYZ'}
+
+letter_to_num = [[2], [2, 2], [2, 2, 2],
+ [3], [3, 3], [3, 3, 3],
+ [4], [4, 4], [4, 4, 4],
+ [5], [5, 5], [5, 5, 5],
+ [6], [6, 6], [6, 6, 6],
+ [7], [7, 7], [7, 7, 7], [7, 7, 7, 7],
+ [8], [8, 8], [8, 8, 8],
+ [9], [9, 9], [9, 9, 9], [9, 9, 9, 9]]
+
+def nums_to_text(nums):
+ sms = ""
+ grouped_nums = group = [list(j) for i, j in groupby(nums)]
+
+ for group in grouped_nums:
+ current_num = group[0]
+ counter = len(group)
+
+ if current_num == 0 or current_num == 1:
+ sms += phone_pad_letters[current_num]
+ elif current_num == -1:
+ continue
+ elif ((current_num >= 2 and current_num <= 6) or current_num == 8):
+ sms += phone_pad_letters[current_num][counter % 3 - 1]
+ elif (current_num == 7 or current_num == 9):
+ sms += phone_pad_letters[current_num][counter % 4 - 1]
+ return str(sms)
+
+def text_to_nums(text):
+ nums = []
+
+ for letter in text.upper():
+ if letter == ' ':
+ nums.append(0)
+ else:
+ index = ord(letter) - ord('A')
+ for i in letter_to_num[index]:
+ nums.append(i)
+ #nums.append(letter_to_num[index])
+
+ #return [int(x) for x in nums]
+ return nums
+
+def nums_to_angle(nums):
+ angles = 0
+
+ for num in nums:
+ if num == 0:
+ angles += 300
+ else:
+ angles += num * 30
+ return angles % 360
+
+def angles_to_nums(angles):
+ numbers = []
+
+ for angle in angles:
+ angle %= 360
+
+ if angle % 30 != 0:
+ if angle % 30 <= 15:
+ angle = angle - angle % 30
+ else:
+ angle = (angle + angle % 30) - ((angle + angle % 30) % 30)
+
+ if angle == 300:
+ numbers.append(0)
+ elif angle != 0 and angle <= 330:
+ numbers.append(angle//30)
+
+ return numbers
+
+def is_phone_tastic(word):
+ transformed_word = nums_to_angle(text_to_nums(word))
+
+ if transformed_word % len(word) == 0:
+ return True
+ else:
+ return False

Кристияна обнови решението на 01.11.2022 13:21 (преди над 1 година)

from itertools import groupby
phone_pad_letters = {0: ' ', 1: '', 2: 'ABC', 3: 'DEF',
4: 'GHI', 5: 'JKL', 6: 'MNO',
7: 'PQRS', 8: 'TUV', 9: 'WXYZ'}
letter_to_num = [[2], [2, 2], [2, 2, 2],
[3], [3, 3], [3, 3, 3],
[4], [4, 4], [4, 4, 4],
[5], [5, 5], [5, 5, 5],
[6], [6, 6], [6, 6, 6],
[7], [7, 7], [7, 7, 7], [7, 7, 7, 7],
[8], [8, 8], [8, 8, 8],
[9], [9, 9], [9, 9, 9], [9, 9, 9, 9]]
def nums_to_text(nums):
sms = ""
grouped_nums = group = [list(j) for i, j in groupby(nums)]
for group in grouped_nums:
current_num = group[0]
counter = len(group)
if current_num == 0 or current_num == 1:
sms += phone_pad_letters[current_num]
elif current_num == -1:
continue
elif ((current_num >= 2 and current_num <= 6) or current_num == 8):
sms += phone_pad_letters[current_num][counter % 3 - 1]
elif (current_num == 7 or current_num == 9):
sms += phone_pad_letters[current_num][counter % 4 - 1]
return str(sms)
def text_to_nums(text):
nums = []
for letter in text.upper():
if letter == ' ':
nums.append(0)
else:
index = ord(letter) - ord('A')
for i in letter_to_num[index]:
nums.append(i)
- #nums.append(letter_to_num[index])
-
- #return [int(x) for x in nums]
+
return nums
def nums_to_angle(nums):
angles = 0
for num in nums:
if num == 0:
angles += 300
else:
angles += num * 30
return angles % 360
def angles_to_nums(angles):
numbers = []
for angle in angles:
angle %= 360
if angle % 30 != 0:
if angle % 30 <= 15:
angle = angle - angle % 30
else:
angle = (angle + angle % 30) - ((angle + angle % 30) % 30)
if angle == 300:
numbers.append(0)
elif angle != 0 and angle <= 330:
numbers.append(angle//30)
return numbers
def is_phone_tastic(word):
transformed_word = nums_to_angle(text_to_nums(word))
if transformed_word % len(word) == 0:
return True
else:
- return False
+ return False

Кристияна обнови решението на 01.11.2022 20:10 (преди над 1 година)

from itertools import groupby
phone_pad_letters = {0: ' ', 1: '', 2: 'ABC', 3: 'DEF',
4: 'GHI', 5: 'JKL', 6: 'MNO',
7: 'PQRS', 8: 'TUV', 9: 'WXYZ'}
letter_to_num = [[2], [2, 2], [2, 2, 2],
[3], [3, 3], [3, 3, 3],
[4], [4, 4], [4, 4, 4],
[5], [5, 5], [5, 5, 5],
[6], [6, 6], [6, 6, 6],
[7], [7, 7], [7, 7, 7], [7, 7, 7, 7],
[8], [8, 8], [8, 8, 8],
[9], [9, 9], [9, 9, 9], [9, 9, 9, 9]]
def nums_to_text(nums):
sms = ""
grouped_nums = group = [list(j) for i, j in groupby(nums)]

i и j не са добри имена. Едни семпли key, grp са по-описателни, и не е необходимо човек да знае какво прави groupby за да прочете кода.
По-важното - grouped_nums = group = ...? Използваш името group тук, а по-надолу така или иначе "презаписваш" с for-а.

for group in grouped_nums:
current_num = group[0]
counter = len(group)
if current_num == 0 or current_num == 1:
sms += phone_pad_letters[current_num]
elif current_num == -1:
continue
elif ((current_num >= 2 and current_num <= 6) or current_num == 8):
sms += phone_pad_letters[current_num][counter % 3 - 1]
elif (current_num == 7 or current_num == 9):
sms += phone_pad_letters[current_num][counter % 4 - 1]
return str(sms)
def text_to_nums(text):
nums = []
for letter in text.upper():
if letter == ' ':
nums.append(0)
else:
index = ord(letter) - ord('A')
for i in letter_to_num[index]:
nums.append(i)
return nums
def nums_to_angle(nums):
angles = 0
for num in nums:
if num == 0:
angles += 300
else:
angles += num * 30
return angles % 360
def angles_to_nums(angles):
numbers = []
for angle in angles:
angle %= 360
if angle % 30 != 0:
if angle % 30 <= 15:
angle = angle - angle % 30
else:
angle = (angle + angle % 30) - ((angle + angle % 30) % 30)
if angle == 300:
numbers.append(0)
- elif angle != 0 and angle <= 330:
+ elif angle != 0 and angle < 300:
numbers.append(angle//30)
return numbers
def is_phone_tastic(word):
transformed_word = nums_to_angle(text_to_nums(word))
if transformed_word % len(word) == 0:
return True
else:
- return False
+ return False

Празните редове на много места са излишни. Ако в angles_to_nums имаше 0 или 1 празни реда, пак щеше да се чете добре. As per PEP8:
Use blank lines in functions, sparingly, to indicate logical sections.

А на някои места са недостатъчни: Surround top-level function and class definitions with two blank lines.

Кристияна обнови решението на 03.11.2022 12:54 (преди над 1 година)

from itertools import groupby
phone_pad_letters = {0: ' ', 1: '', 2: 'ABC', 3: 'DEF',
4: 'GHI', 5: 'JKL', 6: 'MNO',
7: 'PQRS', 8: 'TUV', 9: 'WXYZ'}
letter_to_num = [[2], [2, 2], [2, 2, 2],
[3], [3, 3], [3, 3, 3],
[4], [4, 4], [4, 4, 4],
[5], [5, 5], [5, 5, 5],
[6], [6, 6], [6, 6, 6],
[7], [7, 7], [7, 7, 7], [7, 7, 7, 7],
[8], [8, 8], [8, 8, 8],
[9], [9, 9], [9, 9, 9], [9, 9, 9, 9]]
+
def nums_to_text(nums):
sms = ""
- grouped_nums = group = [list(j) for i, j in groupby(nums)]
-
+ grouped_nums = [list(j) for i, j in groupby(nums)]
for group in grouped_nums:
current_num = group[0]
counter = len(group)
if current_num == 0 or current_num == 1:
sms += phone_pad_letters[current_num]
elif current_num == -1:
continue
elif ((current_num >= 2 and current_num <= 6) or current_num == 8):
sms += phone_pad_letters[current_num][counter % 3 - 1]
elif (current_num == 7 or current_num == 9):
sms += phone_pad_letters[current_num][counter % 4 - 1]
- return str(sms)
+ return sms
+
def text_to_nums(text):
nums = []
-
for letter in text.upper():
if letter == ' ':
nums.append(0)
else:
index = ord(letter) - ord('A')
for i in letter_to_num[index]:
nums.append(i)
-
return nums
+
def nums_to_angle(nums):
angles = 0
-
for num in nums:
if num == 0:
angles += 300
else:
angles += num * 30
return angles % 360
+
def angles_to_nums(angles):
numbers = []
-
for angle in angles:
angle %= 360
if angle % 30 != 0:
if angle % 30 <= 15:
angle = angle - angle % 30
else:
angle = (angle + angle % 30) - ((angle + angle % 30) % 30)
if angle == 300:
numbers.append(0)
elif angle != 0 and angle < 300:
numbers.append(angle//30)
-
return numbers
+
def is_phone_tastic(word):
transformed_word = nums_to_angle(text_to_nums(word))
-
- if transformed_word % len(word) == 0:
+
- return True
+ return transformed_word % len(word) == 0
- else:
- return False