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

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

Към профила на Иван Досев

Резултати

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

Код

def text_to_nums(text):
keypad = {
1: [''],
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: [' ']
}
lower_text = text.lower()
result = []
keys = list(keypad.items())
for letter in lower_text:
for key in keys:
for k in range(len(key[1])):
if letter == key[1][k]:
num = key[0]
if len(result) > 0 and result[-1] == num:
result.append(-1)
result.extend([int(num)] * (k + 1))
return result
def nums_to_text(nums: list):
if len(nums) == 0:
return ''
keypad = {
1: [''],
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: [' ']
}
result = ""
curr_num = nums[0]
curr_count = 0
for i in range(1, len(nums)):
if nums[i] == curr_num:
curr_count = curr_count + 1
else:
result += keypad[curr_num][curr_count % len(keypad[curr_num])]
curr_num = nums[i]
curr_count = 0
if curr_num == -1:
curr_num = nums[i + 1]
curr_count = -1
if curr_num != -1:
result += keypad[curr_num][curr_count % len(keypad[curr_num])]
return result.upper()
def nums_to_angle(nums: list):
result = 0
for num in nums:
if num == 0:
result += 300
elif num > 0:
result += (num * 30)
return result % 360
def angles_to_nums(angles: list):
result = []
for angle in angles:
if angle < 0:
angle = 360 + angle
curr_num = round(angle / 30)
left_out = angle % 30
if left_out == 15:
curr_num -= 1
if 1 <= curr_num <= 10:
result.append(curr_num % 10)
return result
def is_phone_tastic(word):
return nums_to_angle(text_to_nums(word)) % len(word) == 0

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

......FFF.E............EE....E.......
======================================================================
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_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
IndexError: list index out of range

======================================================================
ERROR: 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
KeyError: -1

======================================================================
ERROR: 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
KeyError: -1

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

Second list contains 1 additional elements.
First extra element 0:
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, 2, 3, 9] != [5, 1, 2, 4, 9, 1, 8, 0, 9]

First differing element 3:
3
4

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

- [5, 1, 2, 3, 9]
+ [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: [1] != [2]

First differing element 0:
1
2

- [1]
+ [2]

----------------------------------------------------------------------
Ran 37 tests in 0.333s

FAILED (failures=3, errors=4)

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

Иван обнови решението на 30.10.2022 15:56 (преди над 1 година)

+def text_to_nums(text):
+ keypad = {
+ '1': [''],
+ '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': [' ']
+ }
+ lower_text = text.lower()
+ result = []
+ keys = list(keypad.items())
+ for i in range(len(lower_text)):
+ for j in range(len(keys)):
+ for k in range(len(keys[j][1])):
+ if lower_text[i] == keys[j][1][k]:
+ num = keys[j][0]
+ if result.__len__() > 0 and result[-1] == num:

__len__ е методът на list (и не само), който дефинира колко е дълъг елементът. Да, директното му извикване работи, но е препоръчително да използваш len(result), което реално използва същия този метод, но не бърка в дъндър методите на обекта. Рядко се налага директно да извикаш дъндър метод на обект, а ако се наложи, най-вероятно има и по-добър вариант.

+ result.append(-1)
+ to_append = [int(num)] * (k + 1)

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

+ result.extend(to_append)
+ return result
+
+
+def nums_to_text(nums: list):
+ if len(nums) == 0:
+ return ''
+ keypad = {
+ 1: [''],
+ 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: [' ']
+ }
+ result = ""
+ curr_num = nums[0]
+ curr_count = 0
+ for i in range(1, len(nums)):
+ if nums[i] == curr_num:
+ curr_count = curr_count + 1
+ else:
+ result += keypad[curr_num][curr_count]
+ curr_num = nums[i]
+ curr_count = 0
+ if curr_num == -1:
+ curr_num = nums[i + 1]
+ curr_count = -1
+ if curr_num != -1:
+ result += keypad[curr_num][curr_count]
+ return result.upper()
+
+
+def nums_to_angle(nums: list):
+ result = 0
+ for num in nums:
+ result += (num * 30)
+ return result % 360
+
+
+def angles_to_nums(angles: list):
+ result = []
+ for angle in angles:
+ if angle < 0:
+ angle = 360 + angle
+ curr_num = round(angle / 30)
+ if 1 <= curr_num <= 10:
+ result.append(curr_num % 10)
+ return result
+
+
+def is_phone_tastic(word):
+ return True if nums_to_angle(text_to_nums(word)) % len(word) == 0 else False

Иван обнови решението на 02.11.2022 13:11 (преди над 1 година)

def text_to_nums(text):
keypad = {
'1': [''],
'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': [' ']
}
lower_text = text.lower()
result = []
keys = list(keypad.items())
- for i in range(len(lower_text)):
- for j in range(len(keys)):
- for k in range(len(keys[j][1])):
- if lower_text[i] == keys[j][1][k]:
- num = keys[j][0]
- if result.__len__() > 0 and result[-1] == num:
+ for letter in lower_text:
+ for key in keys:
+ for k in range(len(key[1])):
+ if letter == key[1][k]:
+ num = key[0]
+ if len(result) > 0 and result[-1] == num:
result.append(-1)
- to_append = [int(num)] * (k + 1)
- result.extend(to_append)
+ result.extend([int(num)] * (k + 1))
return result
def nums_to_text(nums: list):
if len(nums) == 0:
return ''
keypad = {
1: [''],
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: [' ']
}
result = ""
curr_num = nums[0]
curr_count = 0
for i in range(1, len(nums)):
if nums[i] == curr_num:
curr_count = curr_count + 1
else:
- result += keypad[curr_num][curr_count]
+ result += keypad[curr_num][curr_count % len(keypad[curr_num])]
curr_num = nums[i]
curr_count = 0
if curr_num == -1:
curr_num = nums[i + 1]
curr_count = -1
if curr_num != -1:
- result += keypad[curr_num][curr_count]
+ result += keypad[curr_num][curr_count % len(keypad[curr_num])]
return result.upper()
def nums_to_angle(nums: list):
result = 0
for num in nums:
result += (num * 30)
return result % 360
def angles_to_nums(angles: list):
result = []
for angle in angles:
if angle < 0:
angle = 360 + angle
curr_num = round(angle / 30)
if 1 <= curr_num <= 10:
result.append(curr_num % 10)
return result
def is_phone_tastic(word):
- return True if nums_to_angle(text_to_nums(word)) % len(word) == 0 else False
+ return nums_to_angle(text_to_nums(word)) % len(word) == 0

Мисля, че пооправих някои странични случаи. Повечето забележки са оправени, само тази за enumerate не съм сигурен как точно работи, защото ще ми трябва да работя и със следващия елемент (знам, че мога да използвам индекса, но си мисля, че ще е по-четимо ако изрично му кажа, че сравнявам елементът с текуш индекс и следващ индекс), и ще я погледна малко по-подробно, за да съм сигурен. :Д

Иван обнови решението на 02.11.2022 18:07 (преди над 1 година)

def text_to_nums(text):
keypad = {
- '1': [''],
- '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': [' ']
+ 1: [''],
+ 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: [' ']
}
lower_text = text.lower()
result = []
keys = list(keypad.items())
for letter in lower_text:
for key in keys:
for k in range(len(key[1])):
if letter == key[1][k]:
num = key[0]
if len(result) > 0 and result[-1] == num:
result.append(-1)
result.extend([int(num)] * (k + 1))
return result
def nums_to_text(nums: list):
if len(nums) == 0:
return ''
keypad = {
1: [''],
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: [' ']
}
result = ""
curr_num = nums[0]
curr_count = 0
for i in range(1, len(nums)):
if nums[i] == curr_num:
curr_count = curr_count + 1
else:
result += keypad[curr_num][curr_count % len(keypad[curr_num])]
curr_num = nums[i]
curr_count = 0
if curr_num == -1:
curr_num = nums[i + 1]
curr_count = -1
if curr_num != -1:
result += keypad[curr_num][curr_count % len(keypad[curr_num])]
return result.upper()
def nums_to_angle(nums: list):
result = 0
for num in nums:
- result += (num * 30)
+ if num == 0:
+ result += 300
+ elif num > 0:
+ result += (num * 30)
return result % 360
def angles_to_nums(angles: list):
result = []
for angle in angles:
if angle < 0:
angle = 360 + angle
curr_num = round(angle / 30)
+ left_out = angle % 30
+ if left_out == 15:
+ curr_num -= 1
if 1 <= curr_num <= 10:
result.append(curr_num % 10)
return result
def is_phone_tastic(word):
return nums_to_angle(text_to_nums(word)) % len(word) == 0