Решение на Телефонна любов от Стоян Михайлов

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

Към профила на Стоян Михайлов

Резултати

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

Код

def nums_to_text(nums):
text_from_nums = ""
keys_and_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"],
0: [" "]
}
previous_num = nums[0]
curr_num_occurances = 0
for index, num in enumerate(nums):
if (num == -1 or num == 1) and index == len(nums) - 1:
previous_num = num
continue
if num != previous_num:
if previous_num == -1 or previous_num == 1:
curr_num_occurances = 1
previous_num = num
continue
if curr_num_occurances > len(keys_and_letters[previous_num]):

Струва ми се, че този if е същия като този след няколко реда. Ако това е така, опитай се да обединиш кода си:
- функция
- промнелива, която да определи точно как да се изпълни кода
- различен ред на извършване на операциите

Ако в някакъв момент ти се наложи да copy-paste-неш код, значи правиш нещо грешно.

letter_index = curr_num_occurances % len(keys_and_letters[previous_num])
if letter_index != 0:
text_from_nums += keys_and_letters[previous_num][letter_index - 1]
else:
text_from_nums += keys_and_letters[previous_num][-1]
else:
text_from_nums += keys_and_letters[previous_num][curr_num_occurances - 1]
curr_num_occurances = 0
curr_num_occurances += 1
if index == len(nums) - 1 and num != 1 and num != -1:
if num != previous_num:
text_from_nums += keys_and_letters[num][curr_num_occurances - 1]
else:
if curr_num_occurances > len(keys_and_letters[previous_num]):
letter_index = curr_num_occurances % len(keys_and_letters[previous_num])
if letter_index != 0:
text_from_nums += keys_and_letters[previous_num][letter_index - 1]
else:
text_from_nums += keys_and_letters[previous_num][-1]
else:
text_from_nums += keys_and_letters[previous_num][curr_num_occurances - 1]
previous_num = num
return text_from_nums
def text_to_nums(text):
lower_text = text.lower()
letters_and_nums = {
"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]
}
nums_from_text = []
last_letter_core_num = letters_and_nums[lower_text[0]][0]
for index, letter in enumerate(lower_text):
core_letter_num = letters_and_nums[letter][0]
if core_letter_num == last_letter_core_num and index != 0:
nums_from_text.append(-1)
nums_from_text += letters_and_nums[letter]
last_letter_core_num = core_letter_num
return nums_from_text

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

EEEEEEEEEEEEEEEEEEEE.FEFF...F...E....
======================================================================
ERROR: test_empty_input (test.TestAnglesToNums)
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
NameError: name 'angles_to_nums' is not defined

======================================================================
ERROR: test_exact_angle (test.TestAnglesToNums)
Test with an exact angle.
----------------------------------------------------------------------
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
NameError: name 'angles_to_nums' is not defined

======================================================================
ERROR: 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
NameError: name 'angles_to_nums' is not defined

======================================================================
ERROR: test_ignoring_under_30 (test.TestAnglesToNums)
Test that angles rounded under 30 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
NameError: name 'angles_to_nums' is not defined

======================================================================
ERROR: 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
NameError: name 'angles_to_nums' is not defined

======================================================================
ERROR: test_negative_angles (test.TestAnglesToNums)
Test with a negative 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
NameError: name 'angles_to_nums' is not defined

======================================================================
ERROR: 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
NameError: name 'angles_to_nums' is not defined

======================================================================
ERROR: 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
NameError: name 'angles_to_nums' is not defined

======================================================================
ERROR: 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
NameError: name 'angles_to_nums' is not defined

======================================================================
ERROR: 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
NameError: name 'angles_to_nums' is not defined

======================================================================
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
NameError: name 'is_phone_tastic' is not defined

======================================================================
ERROR: test_random_falses (test.TestIsPhonetastic)
Test with a random input resulting in False.
----------------------------------------------------------------------
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
NameError: name 'is_phone_tastic' is not defined

======================================================================
ERROR: test_random_trues (test.TestIsPhonetastic)
Test with a random input resulting in True.
----------------------------------------------------------------------
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
NameError: name 'is_phone_tastic' is not defined

======================================================================
ERROR: 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
NameError: name 'nums_to_angle' is not defined

======================================================================
ERROR: test_empty_input (test.TestNumsToAngles)
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
NameError: name 'nums_to_angle' is not defined

======================================================================
ERROR: test_for_overflowing_numbers (test.TestNumsToAngles)
Test normalizing when sum overflows.
----------------------------------------------------------------------
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
NameError: name 'nums_to_angle' is not defined

======================================================================
ERROR: test_for_sum (test.TestNumsToAngles)
Test with multiple numbers that should result in a sum.
----------------------------------------------------------------------
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
NameError: name 'nums_to_angle' is not defined

======================================================================
ERROR: 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
NameError: name 'nums_to_angle' is not defined

======================================================================
ERROR: 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
NameError: name 'nums_to_angle' is not defined

======================================================================
ERROR: test_single_number (test.TestNumsToAngles)
Test with single number.
----------------------------------------------------------------------
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
NameError: name 'nums_to_angle' is not defined

======================================================================
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_empty_input (test.TestTextToNums)
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: string index out of range

======================================================================
FAIL: test_complex_word (test.TestNumsToText)
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: 'b' != 'ba'
- b
+ ba
?  +


======================================================================
FAIL: 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
AssertionError: '' != 'o'
+ o

======================================================================
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: 'jmp' != 'jmpt'
- jmp
+ jmpt
?    +


======================================================================
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 ('   ', '      ')

----------------------------------------------------------------------
Ran 37 tests in 0.359s

FAILED (failures=4, errors=22)

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

Стоян обнови решението на 03.11.2022 17:52 (преди над 1 година)

+def nums_to_text(nums):
+ text_from_nums = ""
+ keys_and_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"],
+ 0: [" "]
+ }
+
+ previous_num = nums[0]
+ curr_num_occurances = 0
+ for index, num in enumerate(nums):
+ if (num == -1 or num == 1) and index == len(nums) - 1:
+ previous_num = num
+ continue
+
+ if num != previous_num:
+ if previous_num == -1 or previous_num == 1:
+ curr_num_occurances = 1
+ previous_num = num
+ continue
+
+ if curr_num_occurances > len(keys_and_letters[previous_num]):

Струва ми се, че този if е същия като този след няколко реда. Ако това е така, опитай се да обединиш кода си:
- функция
- промнелива, която да определи точно как да се изпълни кода
- различен ред на извършване на операциите

Ако в някакъв момент ти се наложи да copy-paste-неш код, значи правиш нещо грешно.

+ letter_index = curr_num_occurances % len(keys_and_letters[previous_num])
+ if letter_index != 0:
+ text_from_nums += keys_and_letters[previous_num][letter_index - 1]
+ else:
+ text_from_nums += keys_and_letters[previous_num][-1]
+ else:
+ text_from_nums += keys_and_letters[previous_num][curr_num_occurances - 1]
+
+ curr_num_occurances = 0
+
+ curr_num_occurances += 1
+
+ if index == len(nums) - 1 and num != 1 and num != -1:
+ if num != previous_num:
+ text_from_nums += keys_and_letters[num][curr_num_occurances - 1]
+ else:
+ if curr_num_occurances > len(keys_and_letters[previous_num]):
+ letter_index = curr_num_occurances % len(keys_and_letters[previous_num])
+ if letter_index != 0:
+ text_from_nums += keys_and_letters[previous_num][letter_index - 1]
+ else:
+ text_from_nums += keys_and_letters[previous_num][-1]
+ else:
+ text_from_nums += keys_and_letters[previous_num][curr_num_occurances - 1]
+
+ previous_num = num
+
+ return text_from_nums
+
+
+def text_to_nums(text):
+ lower_text = text.lower()
+ letters_and_nums = {
+ "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]
+ }
+ nums_from_text = []
+
+ last_letter_core_num = letters_and_nums[lower_text[0]][0]
+ for index, letter in enumerate(lower_text):
+ core_letter_num = letters_and_nums[letter][0]
+ if core_letter_num == last_letter_core_num and index != 0:
+ nums_from_text.append(-1)
+
+ nums_from_text += letters_and_nums[letter]
+ last_letter_core_num = core_letter_num
+
+ return nums_from_text