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

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

Към профила на Божидар Горанов

Резултати

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

Код

def nums_to_text(nums):
letter_dict = {(2, 1): 'a', (2, 2): 'b', (2, 3): 'c', (3, 1): 'd', (3, 2): 'e', (3, 3): 'f', (4, 1): 'g',
(4, 2): 'h', (4, 3): 'i', (5, 1): 'j', (5, 2): 'k', (5, 3): 'l', (6, 1): 'm', (6, 2): 'n',
(6, 3): 'o', (7, 1): 'p', (7, 2): 'q', (7, 3): 'r', (7, 4): 's', (8, 1): 't', (8, 2): 'u',
(8, 3): 'v', (9, 1): 'w', (9, 2): 'x', (9, 3): 'y', (9, 4): 'z', (0, 1): ' '}
message = ''
count = 1
for i in range(1, len(nums)):
if nums[i - 1] == nums[i]:
count += 1
else:
if 0 <= nums[i - 1] <= 9 and (nums[i - 1], count) in letter_dict.keys():
message += letter_dict[(nums[i - 1], count)]
count = 1
message += letter_dict[nums[len(nums) - 1], count]
return message
def text_to_nums(text):
num_dict = {'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]}
text_lower = text.lower()
temp_list = []
answer_list = []
for char in text_lower:
if char in num_dict:
answer_list.extend(num_dict[char])
return answer_list
def nums_to_angle(nums):
angle_sum = 0
for i in nums:
angle_sum += i * 30
while angle_sum > 360:
angle_sum -= 360
while angle_sum < 0:
angle_sum += 360
return angle_sum
def angles_to_nums(nums):
list_of_answers = []
for i in nums:
while i < 0:
i += 360
if i % 30 == 0:
list_of_answers.append(int(i / 30))
else:
angle = 30
result = int((angle * round(i / angle)) / 30)
if result != 0:
list_of_answers.append(result)
return list_of_answers
def is_phone_tastic(word):
help_list = text_to_nums(word)
return nums_to_angle(help_list) % len(word) == 0

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

..F...FFF.E..F...FF...EE.EE.F.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

======================================================================
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

======================================================================
ERROR: test_ending_with_timeout (test.TestNumsToText)
Test with a sequence ending with a -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
KeyError: (-1, 1)

======================================================================
ERROR: test_overflow_input (test.TestNumsToText)
Test with oveflowing number of presses.
----------------------------------------------------------------------
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
KeyError: (9, 6)

======================================================================
ERROR: test_random_mixed_case (test.TestNumsToText)
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
KeyError: (9, 16)

======================================================================
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: [11] != []

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

- [11]
+ []

======================================================================
FAIL: test_overflowing_angles (test.TestAnglesToNums)
Test with an overflowed 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: [98] != [2]

First differing element 0:
98
2

- [98]
+ [2]

======================================================================
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, 0, 1, 2, 4, 9, 11, 11, 24, 98, 368, 9993082, 12813] != [5, 1, 2, 4, 9, 1, 8, 0, 9]

First differing element 1:
0
1

First list contains 4 additional elements.
First extra element 9:
98

- [5, 0, 1, 2, 4, 9, 11, 11, 24, 98, 368, 9993082, 12813]
+ [5, 1, 2, 4, 9, 1, 8, 0, 9]

======================================================================
FAIL: test_round_angle_direction (test.TestAnglesToNums)
Test with an angle requiring explicit rounding to floor.
----------------------------------------------------------------------
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] != [1]

First differing element 0:
2
1

- [2]
+ [1]

======================================================================
FAIL: test_correct_mapping (test.TestNumsToAngles)
Test correct mapping for all numbers.
----------------------------------------------------------------------
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: 0 != 300

======================================================================
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

======================================================================
FAIL: test_random_mixed_case (test.TestNumsToAngles)
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: 90 != 150

======================================================================
FAIL: test_spaces_only (test.TestNumsToText)
Test for input of only whitespaces with or without -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: '  ' not found in ('   ', '      ')

======================================================================
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.347s

FAILED (failures=12, errors=5)

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

Божидар обнови решението на 30.10.2022 13:22 (преди над 1 година)

+def concat(nums, count):
+ message = ''

Бих базирал тази логика на конкретен тип данни, за да спестя почти идентичните редове. Можеш да помислиш за тип данни, който да държи тази информация, във формат, удобен за бърз достъп. Варианти много, но като жокер - dict от tuple-и би свършил чудесна работа.

+ if nums == 2:
+ if count == 1:
+ message += 'a'
+ elif count == 2:
+ message += 'b'
+ elif count == 3:
+ message += 'c'
+ elif nums == 3:
+ if count == 1:
+ message += 'd'
+ elif count == 2:
+ message += 'e'
+ elif count == 3:
+ message += 'f'
+ elif nums == 4:
+ if count == 1:
+ message += 'g'
+ elif count == 2:
+ message += 'h'
+ elif count == 3:
+ message += 'i'
+ elif nums == 5:
+ if count == 1:
+ message += 'j'
+ elif count == 2:
+ message += 'k'
+ elif count == 3:
+ message += 'l'
+ elif nums == 6:
+ if count == 1:
+ message += 'm'
+ elif count == 2:
+ message += 'n'
+ elif count == 3:
+ message += 'o'
+ elif nums == 7:
+ if count == 1:
+ message += 'p'
+ elif count == 2:
+ message += 'q'
+ elif count == 3:
+ message += 'r'
+ elif count == 4:
+ message += 's'
+ elif nums == 8:
+ if count == 1:
+ message += 't'
+ elif count == 2:
+ message += 'u'
+ elif count == 3:
+ message += 'v'
+ elif nums == 9:
+ if count == 1:
+ message += 'w'
+ elif count == 2:
+ message += 'x'
+ elif count == 3:
+ message += 'y'
+ elif count == 4:
+ message += 'z'
+ elif nums == 0:
+ message += ' '
+ return message
+
+
+def nums_to_text(nums):
+ count = 1
+ message = ''
+ last_word = nums[len(nums)-1]
+ for i in range(1, len(nums)):
+ if nums[i-1] == nums[i]:
+ count += 1
+ else:
+ message += concat(nums[i-1], count)
+ count = 1
+ message += concat(last_word, count)
+ return message
+
+
+def text_to_nums(text):
+ num_dict = {'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]}
+ text_lower = text.lower()
+ temp_list = []
+ answer_list = []
+ for i in text_lower:
+ if i in num_dict:

На лекцията с обратна връзка от последното домашно вече стана въпрос за това. Не е нужно да обхождаш ключовете на dict, за да вземеш стойност. Използвай директно num_dict[i] или num_dict.get(i, <something>) в зависимост от случая.

+ for key, values in num_dict.items():
+ if i == key:
+ if isinstance(values, list):
+ for value in values:
+ answer_list.append(value)
+ return answer_list
+
+
+def nums_to_angle(nums):
+ angle_sum = 0
+ for i in nums:
+ angle_sum += i * 30
+ while angle_sum > 360:
+ angle_sum -= 360
+ return angle_sum
+
+
+def angles_to_nums(nums):
+ list_of_answers = []
+ for i in nums:
+ if i < 0:
+ while i < 0:
+ i += 360
+
+ if i % 30 == 0:
+ list_of_answers.append(int(i/30))
+ else:
+ angle = 30
+ while i > angle:
+ angle += 30
+ if angle - i < i - (angle-30):
+ list_of_answers.append(int(angle/30))
+ else:
+ if angle-30 != 0:
+ list_of_answers.append(int((angle-30)/30))
+ return list_of_answers
+
+
+def is_phone_tastic(word):
+ help_list = text_to_nums(word)
+ return nums_to_angle(help_list) % 3 == 0

Божидар обнови решението на 01.11.2022 11:52 (преди над 1 година)

-def concat(nums, count):
- message = ''
- if nums == 2:
- if count == 1:
- message += 'a'
- elif count == 2:
- message += 'b'
- elif count == 3:
- message += 'c'
- elif nums == 3:
- if count == 1:
- message += 'd'
- elif count == 2:
- message += 'e'
- elif count == 3:
- message += 'f'
- elif nums == 4:
- if count == 1:
- message += 'g'
- elif count == 2:
- message += 'h'
- elif count == 3:
- message += 'i'
- elif nums == 5:
- if count == 1:
- message += 'j'
- elif count == 2:
- message += 'k'
- elif count == 3:
- message += 'l'
- elif nums == 6:
- if count == 1:
- message += 'm'
- elif count == 2:
- message += 'n'
- elif count == 3:
- message += 'o'
- elif nums == 7:
- if count == 1:
- message += 'p'
- elif count == 2:
- message += 'q'
- elif count == 3:
- message += 'r'
- elif count == 4:
- message += 's'
- elif nums == 8:
- if count == 1:
- message += 't'
- elif count == 2:
- message += 'u'
- elif count == 3:
- message += 'v'
- elif nums == 9:
- if count == 1:
- message += 'w'
- elif count == 2:
- message += 'x'
- elif count == 3:
- message += 'y'
- elif count == 4:
- message += 'z'
- elif nums == 0:
- message += ' '
- return message
-
-
def nums_to_text(nums):
- count = 1
+ letter_dict = {(2, 1): 'a', (2, 2): 'b', (2, 3): 'c', (3, 1): 'd', (3, 2): 'e', (3, 3): 'f', (4, 1): 'g',
+ (4, 2): 'h', (4, 3): 'i', (5, 1): 'j', (5, 2): 'k', (5, 3): 'l', (6, 1): 'm', (6, 2): 'n',
+ (6, 3): 'o', (7, 1): 'p', (7, 2): 'q', (7, 3): 'r', (7, 4): 's', (8, 1): 't', (8, 2): 'u',
+ (8, 3): 'v', (9, 1): 'w', (9, 2): 'x', (9, 3): 'y', (9, 4): 'z', (0, 1): ' '}
message = ''
- last_word = nums[len(nums)-1]
+ count = 1
for i in range(1, len(nums)):
- if nums[i-1] == nums[i]:
+ if nums[i - 1] == nums[i]:
count += 1
else:
- message += concat(nums[i-1], count)
+ if 0 <= nums[i - 1] <= 9 and (nums[i - 1], count) in letter_dict.keys():
+ message += letter_dict[(nums[i - 1], count)]
count = 1
- message += concat(last_word, count)
+ message += letter_dict[nums[len(nums) - 1], count]
return message
def text_to_nums(text):
num_dict = {'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]}
+ '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]}
text_lower = text.lower()
temp_list = []
answer_list = []
- for i in text_lower:
- if i in num_dict:
- for key, values in num_dict.items():
- if i == key:
- if isinstance(values, list):
- for value in values:
- answer_list.append(value)
+ for char in text_lower:
+ if char in num_dict:
+ answer_list.extend(num_dict[char])
return answer_list
def nums_to_angle(nums):
angle_sum = 0
for i in nums:
angle_sum += i * 30
while angle_sum > 360:
angle_sum -= 360
+ while angle_sum < 0:
+ angle_sum += 360
return angle_sum
def angles_to_nums(nums):
list_of_answers = []
for i in nums:
- if i < 0:
- while i < 0:
- i += 360
-
+ while i < 0:
+ i += 360
if i % 30 == 0:
- list_of_answers.append(int(i/30))
+ list_of_answers.append(int(i / 30))
else:
angle = 30
- while i > angle:
- angle += 30
- if angle - i < i - (angle-30):
- list_of_answers.append(int(angle/30))
- else:
- if angle-30 != 0:
- list_of_answers.append(int((angle-30)/30))
+ result = int((angle * round(i / angle)) / 30)
+ if result != 0:
+ list_of_answers.append(result)
return list_of_answers
def is_phone_tastic(word):
help_list = text_to_nums(word)
- return nums_to_angle(help_list) % 3 == 0
+ return nums_to_angle(help_list) % len(word) == 0