Решение на Телефонна любов от Велислава Крумова

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

Към профила на Велислава Крумова

Резултати

  • 7 точки от тестове
  • 0 бонус точки
  • 7 точки общо
  • 26 успешни тест(а)
  • 11 неуспешни тест(а)

Код

three_letters_dict = {2: ['a', 'b', 'c'], 3: ['d', 'e', 'f'], 4: ['g', 'h', 'i'],
5: ['j', 'k', 'l'], 6: ['m', 'n', 'o'], 8: ['t', 'u', 'v']}
four_letters_dict = {7: ['p', 'q', 'r', 's'], 9: ['w', 'x', 'y', 'z']}
def nums_to_text(num_list):
result_str = ''
counter = 1
list_size = len(num_list)
if list_size == 1:

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

for number in three_letters_dict:
if num_list[0] == number:
to_search = three_letters_dict.get(number)
result_str += to_search[(counter % 3) - 1]
break
for number in four_letters_dict:
if num_list[0] == number:
to_search = four_letters_dict.get(number)
result_str += to_search[(counter % 4) - 1]
for index in range(0, list_size - 1):
if num_list[index] == num_list[index + 1]:
counter += 1
if index == list_size - 2 or not num_list[index] == num_list[index + 1]:
for number in three_letters_dict:
if num_list[index] == number:
to_search = three_letters_dict.get(number)
result_str += to_search[(counter % 3 )- 1]
counter = 1
break
for number in four_letters_dict:
if num_list[index] == number:
to_search = four_letters_dict.get(number)
result_str += to_search[(counter % 4) - 1]
counter = 1
if num_list[list_size - 1] != num_list[list_size - 2]:
for number in three_letters_dict:
if num_list[list_size - 1] == number:
to_search = three_letters_dict.get(number)
result_str += to_search[(counter % 3) - 1]
counter = 1
break
for number in four_letters_dict:
if num_list[list_size - 1] == number:
to_search = four_letters_dict.get(number)
result_str += to_search[(counter % 4) - 1]
counter = 1
return result_str.upper()
def get_key(s_dict, search):
key_list = list(s_dict.keys())

Ако дефинираш обратен речник (може и динамично с няколко реда код), ще си спестиш тази функция и ще можеш просто да вземеш стойност по ключ.

val_list = list(s_dict.values())
position = val_list.index(search)
return key_list[position]
def text_to_nums(text_str):
num_list = []
text_str = text_str.lower()
last_char = ''
for char in text_str:
if char == ' ':
num_list.append(0)
for value_list in three_letters_dict.values():

Тези два цикъла изглеждат еднакви. Ако е така, можеш просто:

values_lists = list(three_letters_dict.values()) + list(four_letters_dict.values())
for value_list in values_lists:

сигурно има и по-логичен начин, но този похват поне директно се справя с проблема, че имаш два блока от по 7 реда, които са идентични.

for ch in value_list:
if char == ch:
if last_char in value_list:
num_list.append(-1)
last_char = char
for i in range(value_list.index(ch) + 1):
num_list.append(get_key(three_letters_dict, value_list))
for value_list in four_letters_dict.values():
for ch in value_list:
if char == ch:
if last_char in value_list:
num_list.append(-1)
last_char = char
for i in range(value_list.index(ch) + 1):
num_list.append(get_key(four_letters_dict, value_list))
return num_list
def nums_to_angle(num_list):
angle_tuple = (300, 30, 60, 90, 120, 150, 180, 210, 240, 270)
angle_return = 0
for num in num_list:
angle_return += angle_tuple[num]
while angle_return > 360:
angle_return -= 360
return angle_return
def angles_to_nums(angle_list):
angle_tuple = (30, 60, 90, 120, 150, 180, 210, 240, 270, 300)
return_list = []
for angle in angle_list:
if 0 < angle < 15 or 300 < angle < 360:
continue
while angle < 0:
angle += 360
while angle > 360:
angle -= 360
if angle in angle_tuple:
if angle == angle_tuple[9]:
return_list.append(0)
else:
return_list.append(angle_tuple.index(angle) + 1)
else:
if angle < angle_tuple[0]:
return_list.append(1)
for index in range(len(angle_tuple) - 1):
if angle_tuple[index] <= angle <= angle_tuple[index + 1]:
dif1 = angle - angle_tuple[index]
dif2 = angle_tuple[index + 1] - angle
if dif1 < dif2:
return_list.append(index)
else:
return_list.append(index + 1)
return return_list
def is_phone_tastic(word_str):
num_list = text_to_nums(word_str)
angle = nums_to_angle(num_list)
word_len = len(word_str)
if angle % word_len == 0:
return True
return False

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

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

======================================================================
FAIL: test_multiple_angles (test.TestAnglesToNums)
Test with a couple of angles as 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: [1, 6, 1, 2, 1] != [1, 6, 2, 2, 2]

First differing element 2:
1
2

- [1, 6, 1, 2, 1]
+ [1, 6, 2, 2, 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, 1, 1, 1, 2, 4, 9, 1, 7, 9, 8] != [5, 1, 2, 4, 9, 1, 8, 0, 9]

First differing element 2:
1
2

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

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

======================================================================
FAIL: test_round_angle_easy_case (test.TestAnglesToNums)
Test with an angle requiring rounding - easy 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] != [3]

First differing element 0:
2
3

- [2]
+ [3]

======================================================================
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_all_chars (test.TestNumsToText)
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: 'abcdefghijklmnopqrstuvwxyz' != 'abcdefghijklmnopqrstuvwxyz '
- abcdefghijklmnopqrstuvwxyz
+ abcdefghijklmnopqrstuvwxyz 
?                           +


======================================================================
FAIL: test_multiple_timeouts (test.TestNumsToText)
Test with multiple '-1's next to each other.
----------------------------------------------------------------------
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: 'jopu' != 'jmpt'
- jopu
+ jmpt


======================================================================
FAIL: 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
AssertionError: 'fmirulzzz' != 'fmi rulzzz'
- fmirulzzz
+ fmi rulzzz
?    +


======================================================================
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_starting_with_timeout (test.TestNumsToText)
Test with a sequence starting 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
AssertionError: 'm' != 'o'
- m
+ o


----------------------------------------------------------------------
Ran 37 tests in 0.454s

FAILED (failures=9, errors=2)

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

Велислава обнови решението на 02.11.2022 22:24 (преди над 1 година)

+three_letters_dict = {2: ['a', 'b', 'c'], 3: ['d', 'e', 'f'], 4: ['g', 'h', 'i'],
+ 5: ['j', 'k', 'l'], 6: ['m', 'n', 'o'], 8: ['t', 'u', 'v']}
+four_letters_dict = {7: ['p', 'q', 'r', 's'], 9: ['w', 'x', 'y', 'z']}
+
+
+def nums_to_text(num_list):
+ result_str = ''
+ counter = 1
+ list_size = len(num_list)
+ if list_size == 1:

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

+ for number in three_letters_dict:
+ if num_list[0] == number:
+ to_search = three_letters_dict.get(number)
+ result_str += to_search[(counter % 3) - 1]
+ break
+ for number in four_letters_dict:
+ if num_list[0] == number:
+ to_search = four_letters_dict.get(number)
+ result_str += to_search[(counter % 4) - 1]
+ for index in range(0, list_size - 1):
+ if num_list[index] == num_list[index + 1]:
+ counter += 1
+ if index == list_size - 2 or not num_list[index] == num_list[index + 1]:
+ for number in three_letters_dict:
+ if num_list[index] == number:
+ to_search = three_letters_dict.get(number)
+ result_str += to_search[(counter % 3 )- 1]
+ counter = 1
+ break
+ for number in four_letters_dict:
+ if num_list[index] == number:
+ to_search = four_letters_dict.get(number)
+ result_str += to_search[(counter % 4) - 1]
+ counter = 1
+ if num_list[list_size - 1] != num_list[list_size - 2]:
+ for number in three_letters_dict:
+ if num_list[list_size - 1] == number:
+ to_search = three_letters_dict.get(number)
+ result_str += to_search[(counter % 3) - 1]
+ counter = 1
+ break
+ for number in four_letters_dict:
+ if num_list[list_size - 1] == number:
+ to_search = four_letters_dict.get(number)
+ result_str += to_search[(counter % 4) - 1]
+ counter = 1
+ return result_str.upper()
+
+
+def get_key(s_dict, search):
+ key_list = list(s_dict.keys())

Ако дефинираш обратен речник (може и динамично с няколко реда код), ще си спестиш тази функция и ще можеш просто да вземеш стойност по ключ.

+ val_list = list(s_dict.values())
+ position = val_list.index(search)
+ return key_list[position]
+
+
+def text_to_nums(text_str):
+ num_list = []
+ text_str = text_str.lower()
+ last_char = ''
+ for char in text_str:
+ if char == ' ':
+ num_list.append(0)
+ for value_list in three_letters_dict.values():

Тези два цикъла изглеждат еднакви. Ако е така, можеш просто:

values_lists = list(three_letters_dict.values()) + list(four_letters_dict.values())
for value_list in values_lists:

сигурно има и по-логичен начин, но този похват поне директно се справя с проблема, че имаш два блока от по 7 реда, които са идентични.

+ for ch in value_list:
+ if char == ch:
+ if last_char in value_list:
+ num_list.append(-1)
+ last_char = char
+ for i in range(value_list.index(ch) + 1):
+ num_list.append(get_key(three_letters_dict, value_list))
+ for value_list in four_letters_dict.values():
+ for ch in value_list:
+ if char == ch:
+ if last_char in value_list:
+ num_list.append(-1)
+ last_char = char
+ for i in range(value_list.index(ch) + 1):
+ num_list.append(get_key(four_letters_dict, value_list))
+ return num_list
+
+
+def nums_to_angle(num_list):
+ angle_tuple = (300, 30, 60, 90, 120, 150, 180, 210, 240, 270)
+ angle_return = 0
+ for num in num_list:
+ angle_return += angle_tuple[num]
+ while angle_return > 360:
+ angle_return -= 360
+ return angle_return
+
+
+def angles_to_nums(angle_list):
+ angle_tuple = (30, 60, 90, 120, 150, 180, 210, 240, 270, 300)
+ return_list = []
+ for angle in angle_list:
+ if 0 < angle < 15 or 300 < angle < 360:
+ continue
+ while angle < 0:
+ angle += 360
+ while angle > 360:
+ angle -= 360
+ if angle in angle_tuple:
+ if angle == angle_tuple[9]:
+ return_list.append(0)
+ else:
+ return_list.append(angle_tuple.index(angle) + 1)
+ else:
+ if angle < angle_tuple[0]:
+ return_list.append(1)
+ for index in range(len(angle_tuple) - 1):
+ if angle_tuple[index] <= angle <= angle_tuple[index + 1]:
+ dif1 = angle - angle_tuple[index]
+ dif2 = angle_tuple[index + 1] - angle
+ if dif1 < dif2:
+ return_list.append(index)
+ else:
+ return_list.append(index + 1)
+ return return_list
+
+
+def is_phone_tastic(word_str):
+ num_list = text_to_nums(word_str)
+ angle = nums_to_angle(num_list)
+ word_len = len(word_str)
+ if angle % word_len == 0:
+ return True
+ return False