Решение на Телефонна любов от Назифе Алиджик

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

Към профила на Назифе Алиджик

Резултати

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

Код

def nums_to_text(nums):
key_pad = {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: ' '}
current_nums = []
result = []
for i in range(len(nums)):
if nums[i] == -1 or nums[i] == 1:
continue
current_nums.append(nums[i])
if i == len(nums) - 1 or nums[i] != nums[i + 1]:
key = current_nums[0]
key_nums = key_pad[key]
index = (len(current_nums) % len(key_nums)) - 1
result.append(key_nums[index])
current_nums = []
return ''.join(result)
def text_to_nums(text):
key_pad = {'A': (2, 1), 'B': (2, 2), 'C': (2, 3), 'D': (3, 1), 'E': (3, 2), 'F': (3, 3), 'G': (4, 1), 'H': (4, 2), 'I': (4, 3),
'J': (5, 1), 'K': (5, 2), 'L': (5, 3), 'M': (6, 1), 'N': (6, 2), 'O': (6, 3), 'P': (7, 1), 'Q': (7, 2), 'R': (7, 3),
'S': (7, 4), 'T': (8, 1), 'U': (8, 2), 'V': (8, 3), 'W': (9, 1), 'X': (9, 2), 'Y': (9, 3), 'Z': (9, 4), ' ': (0, 1)}
numbers = []
for letter in text:
tuple_ = key_pad[letter.upper()]
number, repetitions = tuple_
if len(numbers) > 0:
if numbers[-1] == number:
numbers.append(-1)
# for i in range(repetitions):
# numbers.append(number)
numbers.extend([number] * repetitions)
return numbers
def nums_to_angle(nums):
result = 0
for number in nums:
if number < 0:
continue
result += number * 30
while result > 359:
result -= 360
return result
def angles_to_nums(angles):
rounded_angles = [0, 30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330]
for angle in angles:
if angle < 0:
index = angles.index(angle)

По принцип бих направил тази операция преди цикъла с основната ти логика, т.е. първи си обходи списъка и си го нормализирай/закръгли, пък тогава оперирай върху него.

НО, по-скоро коментирам, защото за подобни случаи би ти помогнало enumerate - хем имаш индекса, хем елемента: for index, angle in enumerate(angles)

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

while angle < 0:
angle += 360
angles[index] = angle
if angle > 359:
index = angles.index(angle)
while angle > 359:
angle -= 360
angles[index] = angle
if angle in rounded_angles:
continue
else:
rounded_angle = min(rounded_angles, key=lambda x: abs(x - angle))
index = angles.index(angle)
angles.remove(angle)
angles.insert(index, rounded_angle)
result = []
for angle in angles:
if angle == 0 or angle == 330:
continue
angle_to_num = angle / 30
result.append(int(angle_to_num))
return result
def is_phone_tastic(word):
word_to_nums = text_to_nums(word)
angle = nums_to_angle(word_to_nums)
return angle % len(word) == 0

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

.......F..E..F....F..................
======================================================================
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_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, 4, 9, 1, 8, 10, 9] != [5, 1, 2, 4, 9, 1, 8, 0, 9]

First differing element 7:
10
0

- [5, 1, 2, 4, 9, 1, 8, 10, 9]
?                       -

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

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

----------------------------------------------------------------------
Ran 37 tests in 0.467s

FAILED (failures=3, errors=1)

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

Назифе обнови решението на 30.10.2022 17:22 (преди над 1 година)

+
+def nums_to_text(nums):
+
+ key_pad = {'A': (2, 1), 'B': (2, 2), 'C': (2, 3), 'D': (3, 1), 'E': (3, 2), 'F': (3, 3), 'G': (4, 1), 'H': (4, 2), 'I': (4, 3),
+ 'J': (5, 1), 'K': (5, 2), 'L': (5, 3), 'M': (6, 1), 'N': (6, 2), 'O': (6, 3), 'P': (7, 1), 'Q': (7, 2), 'R': (7, 3),
+ 'S': (7, 4), 'T': (8, 1), 'U': (8, 2), 'V': (8, 3), 'W': (9, 1), 'X': (9, 2), 'Y': (9, 3), 'Z': (9, 4)}
+ current_nums = []
+
+ result = []
+
+ for i in range(len(nums)):
+
+ current_nums.append(nums[i])
+
+ if i == len(nums) - 1 or nums[i] != nums[i + 1]:
+
+ find_tuple = (current_nums[0], len(current_nums))
+
+ current_nums = []
+
+ for key, values in key_pad.items():
+
+ if find_tuple == values:
+
+ result.append(key)
+
+ return ''.join(result)
+
+
+def text_to_nums(text):
+
+ numbers = []
+ key_pad = {'A': (2, 1), 'B': (2, 2), 'C': (2, 3), 'D': (3, 1), 'E': (3, 2), 'F': (3, 3), 'G': (4, 1), 'H': (4, 2), 'I': (4, 3),
+ 'J': (5, 1), 'K': (5, 2), 'L': (5, 3), 'M': (6, 1), 'N': (6, 2), 'O': (6, 3), 'P': (7, 1), 'Q': (7, 2), 'R': (7, 3),
+ 'S': (7, 4), 'T': (8, 1), 'U': (8, 2), 'V': (8, 3), 'W': (9, 1), 'X': (9, 2), 'Y': (9, 3), 'Z': (9, 4), ' ': (0, 1)}
+
+ for letter in text:
+
+ _tuple = key_pad[letter.upper()]
+ number = _tuple[0]
+ repetitions = _tuple[1]
+
+ if len(numbers) > 0:
+
+ if numbers[-1] == number:
+
+ numbers.append(-1)
+
+ for i in range(repetitions):
+
+ numbers.append(number)
+
+ return numbers
+
+
+def nums_to_angle(nums):
+
+ result = 0
+
+ for number in nums:
+
+ if number < 0:
+ continue
+
+ result += number * 30
+
+ while (result > 359):
+
+ result -= 360
+
+ return result
+
+
+def angles_to_nums(angles):
+
+ rounded_angles = [0, 30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330]
+
+ for angle in angles:
+
+ if angle < 0:
+
+ index = angles.index(angle)
+
+ while angle < 0:
+ angle += 360
+ angles[index] = angle
+
+ if angle in rounded_angles:
+
+ continue
+ else:
+
+ rounded_angle = min(rounded_angles, key=lambda x: abs(x - angle))
+ index = angles.index(angle)
+ angles.remove(angle)
+ angles.insert(index, rounded_angle)
+
+ result = []
+
+ for angle in angles:
+
+ if angle == 0:
+ continue
+
+ angle_to_num = angle / 30
+ result.append(int(angle_to_num))
+
+ return result
+
+
+def is_phone_tastic(word):
+
+ word_size = len(word)
+
+ word_to_nums = text_to_nums(word)
+ print(word_to_nums)
+ angle = nums_to_angle(word_to_nums)
+ print(angle)
+
+ if angle % word_size == 0:
+
+ return True
+
+ return False

Назифе обнови решението на 30.10.2022 17:25 (преди над 1 година)

def nums_to_text(nums):
key_pad = {'A': (2, 1), 'B': (2, 2), 'C': (2, 3), 'D': (3, 1), 'E': (3, 2), 'F': (3, 3), 'G': (4, 1), 'H': (4, 2), 'I': (4, 3),
'J': (5, 1), 'K': (5, 2), 'L': (5, 3), 'M': (6, 1), 'N': (6, 2), 'O': (6, 3), 'P': (7, 1), 'Q': (7, 2), 'R': (7, 3),
'S': (7, 4), 'T': (8, 1), 'U': (8, 2), 'V': (8, 3), 'W': (9, 1), 'X': (9, 2), 'Y': (9, 3), 'Z': (9, 4)}
current_nums = []
result = []
for i in range(len(nums)):
current_nums.append(nums[i])
if i == len(nums) - 1 or nums[i] != nums[i + 1]:
find_tuple = (current_nums[0], len(current_nums))
current_nums = []
for key, values in key_pad.items():
if find_tuple == values:
result.append(key)
return ''.join(result)
def text_to_nums(text):
numbers = []
key_pad = {'A': (2, 1), 'B': (2, 2), 'C': (2, 3), 'D': (3, 1), 'E': (3, 2), 'F': (3, 3), 'G': (4, 1), 'H': (4, 2), 'I': (4, 3),

Този речник е почти идентичен на този от горната функция. Бих сложил една дефиниця извън функциите, за да избегна дублиране. Не е нужно да преправяш. Само споменавам, за да го имаш предвид следващия път.

'J': (5, 1), 'K': (5, 2), 'L': (5, 3), 'M': (6, 1), 'N': (6, 2), 'O': (6, 3), 'P': (7, 1), 'Q': (7, 2), 'R': (7, 3),
'S': (7, 4), 'T': (8, 1), 'U': (8, 2), 'V': (8, 3), 'W': (9, 1), 'X': (9, 2), 'Y': (9, 3), 'Z': (9, 4), ' ': (0, 1)}
for letter in text:
_tuple = key_pad[letter.upper()]

Ако името ти съвпада с резервирана дума, прието е долната черта да се слага след, а не преди името - tuple_. Долна черта преди името има значение на protected атрибут.

number = _tuple[0]
repetitions = _tuple[1]
if len(numbers) > 0:
if numbers[-1] == number:
numbers.append(-1)
for i in range(repetitions):
numbers.append(number)
return numbers
def nums_to_angle(nums):
result = 0
for number in nums:
if number < 0:
continue
result += number * 30
while (result > 359):
result -= 360
return result
def angles_to_nums(angles):
rounded_angles = [0, 30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330]
for angle in angles:
if angle < 0:
index = angles.index(angle)

По принцип бих направил тази операция преди цикъла с основната ти логика, т.е. първи си обходи списъка и си го нормализирай/закръгли, пък тогава оперирай върху него.

НО, по-скоро коментирам, защото за подобни случаи би ти помогнало enumerate - хем имаш индекса, хем елемента: for index, angle in enumerate(angles)

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

while angle < 0:
angle += 360
angles[index] = angle
if angle in rounded_angles:
continue
else:
rounded_angle = min(rounded_angles, key=lambda x: abs(x - angle))
index = angles.index(angle)
angles.remove(angle)
angles.insert(index, rounded_angle)
result = []
for angle in angles:
if angle == 0:
continue
angle_to_num = angle / 30
result.append(int(angle_to_num))
return result
def is_phone_tastic(word):
word_size = len(word)
word_to_nums = text_to_nums(word)
- print(word_to_nums)
angle = nums_to_angle(word_to_nums)
- print(angle)
if angle % word_size == 0:
return True
return False

По принцип съм против използването на празни редове в тялото на самите функции и предпочитам по един празен ред само м/у тях. Наясно съм, че това е субективно мнение, затова не го налагам, но при твоят код реално има по един празен ред м/у всеки два реда (с някои изключения). Това е напълно излишно и смятам, че при толкова много празни редове, мога да твърдя - грешно.

Назифе обнови решението на 31.10.2022 22:56 (преди над 1 година)

+key_pad = {'A': (2, 1), 'B': (2, 2), 'C': (2, 3), 'D': (3, 1), 'E': (3, 2), 'F': (3, 3), 'G': (4, 1), 'H': (4, 2), 'I': (4, 3),
+ 'J': (5, 1), 'K': (5, 2), 'L': (5, 3), 'M': (6, 1), 'N': (6, 2), 'O': (6, 3), 'P': (7, 1), 'Q': (7, 2), 'R': (7, 3),
+ 'S': (7, 4), 'T': (8, 1), 'U': (8, 2), 'V': (8, 3), 'W': (9, 1), 'X': (9, 2), 'Y': (9, 3), 'Z': (9, 4), ' ': (0, 1)}
+
+
def nums_to_text(nums):
- key_pad = {'A': (2, 1), 'B': (2, 2), 'C': (2, 3), 'D': (3, 1), 'E': (3, 2), 'F': (3, 3), 'G': (4, 1), 'H': (4, 2), 'I': (4, 3),
- 'J': (5, 1), 'K': (5, 2), 'L': (5, 3), 'M': (6, 1), 'N': (6, 2), 'O': (6, 3), 'P': (7, 1), 'Q': (7, 2), 'R': (7, 3),
- 'S': (7, 4), 'T': (8, 1), 'U': (8, 2), 'V': (8, 3), 'W': (9, 1), 'X': (9, 2), 'Y': (9, 3), 'Z': (9, 4)}
current_nums = []
-
result = []
for i in range(len(nums)):
-
current_nums.append(nums[i])
if i == len(nums) - 1 or nums[i] != nums[i + 1]:
-
find_tuple = (current_nums[0], len(current_nums))
-
current_nums = []
for key, values in key_pad.items():
-
if find_tuple == values:
-
result.append(key)
return ''.join(result)
def text_to_nums(text):
numbers = []
- key_pad = {'A': (2, 1), 'B': (2, 2), 'C': (2, 3), 'D': (3, 1), 'E': (3, 2), 'F': (3, 3), 'G': (4, 1), 'H': (4, 2), 'I': (4, 3),
- 'J': (5, 1), 'K': (5, 2), 'L': (5, 3), 'M': (6, 1), 'N': (6, 2), 'O': (6, 3), 'P': (7, 1), 'Q': (7, 2), 'R': (7, 3),
- 'S': (7, 4), 'T': (8, 1), 'U': (8, 2), 'V': (8, 3), 'W': (9, 1), 'X': (9, 2), 'Y': (9, 3), 'Z': (9, 4), ' ': (0, 1)}
for letter in text:
+ tuple_ = key_pad[letter.upper()]
+ number, repetitions = tuple_
- _tuple = key_pad[letter.upper()]
- number = _tuple[0]
- repetitions = _tuple[1]
-
if len(numbers) > 0:
-
if numbers[-1] == number:
-
numbers.append(-1)
- for i in range(repetitions):
+ # for i in range(repetitions):
+ # numbers.append(number)
- numbers.append(number)
+ numbers.extend([number] * repetitions)
return numbers
def nums_to_angle(nums):
result = 0
for number in nums:
-
if number < 0:
continue
-
result += number * 30
- while (result > 359):
-
+ while result > 359:
result -= 360
return result
def angles_to_nums(angles):
rounded_angles = [0, 30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330]
for angle in angles:
-
if angle < 0:
-
index = angles.index(angle)
while angle < 0:
angle += 360
angles[index] = angle
if angle in rounded_angles:
-
continue
else:
-
rounded_angle = min(rounded_angles, key=lambda x: abs(x - angle))
index = angles.index(angle)
angles.remove(angle)
angles.insert(index, rounded_angle)
result = []
for angle in angles:
-
if angle == 0:
continue
angle_to_num = angle / 30
result.append(int(angle_to_num))
return result
def is_phone_tastic(word):
- word_size = len(word)
-
word_to_nums = text_to_nums(word)
angle = nums_to_angle(word_to_nums)
- if angle % word_size == 0:
-
+ return angle % len(word) == 0
- return True
-
- return False

Назифе обнови решението на 01.11.2022 18:52 (преди над 1 година)

-key_pad = {'A': (2, 1), 'B': (2, 2), 'C': (2, 3), 'D': (3, 1), 'E': (3, 2), 'F': (3, 3), 'G': (4, 1), 'H': (4, 2), 'I': (4, 3),
- 'J': (5, 1), 'K': (5, 2), 'L': (5, 3), 'M': (6, 1), 'N': (6, 2), 'O': (6, 3), 'P': (7, 1), 'Q': (7, 2), 'R': (7, 3),
- 'S': (7, 4), 'T': (8, 1), 'U': (8, 2), 'V': (8, 3), 'W': (9, 1), 'X': (9, 2), 'Y': (9, 3), 'Z': (9, 4), ' ': (0, 1)}
-
-
def nums_to_text(nums):
+ key_pad = {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: ' '}
+
current_nums = []
result = []
for i in range(len(nums)):
- current_nums.append(nums[i])
+ if nums[i] == -1 or nums[i] == 1:
+ continue
+ current_nums.append(nums[i])
if i == len(nums) - 1 or nums[i] != nums[i + 1]:
- find_tuple = (current_nums[0], len(current_nums))
+ key = current_nums[0]
+ key_nums = key_pad[key]
+ index = (len(current_nums) % len(key_nums)) - 1
+ result.append(key_nums[index])
+
current_nums = []
- for key, values in key_pad.items():
- if find_tuple == values:
- result.append(key)
-
return ''.join(result)
-
def text_to_nums(text):
+ key_pad = {'A': (2, 1), 'B': (2, 2), 'C': (2, 3), 'D': (3, 1), 'E': (3, 2), 'F': (3, 3), 'G': (4, 1), 'H': (4, 2), 'I': (4, 3),
+ 'J': (5, 1), 'K': (5, 2), 'L': (5, 3), 'M': (6, 1), 'N': (6, 2), 'O': (6, 3), 'P': (7, 1), 'Q': (7, 2), 'R': (7, 3),
+ 'S': (7, 4), 'T': (8, 1), 'U': (8, 2), 'V': (8, 3), 'W': (9, 1), 'X': (9, 2), 'Y': (9, 3), 'Z': (9, 4), ' ': (0, 1)}
numbers = []
for letter in text:
tuple_ = key_pad[letter.upper()]
number, repetitions = tuple_
if len(numbers) > 0:
if numbers[-1] == number:
numbers.append(-1)
# for i in range(repetitions):
# numbers.append(number)
numbers.extend([number] * repetitions)
return numbers
-
def nums_to_angle(nums):
result = 0
for number in nums:
if number < 0:
continue
result += number * 30
while result > 359:
result -= 360
return result
-
def angles_to_nums(angles):
rounded_angles = [0, 30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330]
for angle in angles:
if angle < 0:
index = angles.index(angle)
while angle < 0:
angle += 360
angles[index] = angle
if angle in rounded_angles:
continue
else:
rounded_angle = min(rounded_angles, key=lambda x: abs(x - angle))
index = angles.index(angle)
angles.remove(angle)
angles.insert(index, rounded_angle)
result = []
for angle in angles:
if angle == 0:
continue
angle_to_num = angle / 30
result.append(int(angle_to_num))
return result
-
def is_phone_tastic(word):
word_to_nums = text_to_nums(word)
angle = nums_to_angle(word_to_nums)
return angle % len(word) == 0

Назифе обнови решението на 02.11.2022 20:42 (преди над 1 година)

def nums_to_text(nums):
key_pad = {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: ' '}
current_nums = []
result = []
for i in range(len(nums)):
if nums[i] == -1 or nums[i] == 1:
continue
current_nums.append(nums[i])
if i == len(nums) - 1 or nums[i] != nums[i + 1]:
key = current_nums[0]
key_nums = key_pad[key]
index = (len(current_nums) % len(key_nums)) - 1
result.append(key_nums[index])
current_nums = []
return ''.join(result)
+
def text_to_nums(text):
key_pad = {'A': (2, 1), 'B': (2, 2), 'C': (2, 3), 'D': (3, 1), 'E': (3, 2), 'F': (3, 3), 'G': (4, 1), 'H': (4, 2), 'I': (4, 3),
'J': (5, 1), 'K': (5, 2), 'L': (5, 3), 'M': (6, 1), 'N': (6, 2), 'O': (6, 3), 'P': (7, 1), 'Q': (7, 2), 'R': (7, 3),
'S': (7, 4), 'T': (8, 1), 'U': (8, 2), 'V': (8, 3), 'W': (9, 1), 'X': (9, 2), 'Y': (9, 3), 'Z': (9, 4), ' ': (0, 1)}
numbers = []
for letter in text:
tuple_ = key_pad[letter.upper()]
number, repetitions = tuple_
if len(numbers) > 0:
if numbers[-1] == number:
numbers.append(-1)
# for i in range(repetitions):
# numbers.append(number)
numbers.extend([number] * repetitions)
return numbers
def nums_to_angle(nums):
result = 0
for number in nums:
if number < 0:
continue
result += number * 30
while result > 359:
result -= 360
return result
def angles_to_nums(angles):
rounded_angles = [0, 30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330]
for angle in angles:
if angle < 0:
index = angles.index(angle)
-
while angle < 0:
angle += 360
angles[index] = angle
+ if angle > 359:
+ index = angles.index(angle)
+ while angle > 359:
+ angle -= 360
+ angles[index] = angle
+
if angle in rounded_angles:
continue
else:
rounded_angle = min(rounded_angles, key=lambda x: abs(x - angle))
index = angles.index(angle)
+
angles.remove(angle)
angles.insert(index, rounded_angle)
result = []
for angle in angles:
- if angle == 0:
+ if angle == 0 or angle == 330:
continue
angle_to_num = angle / 30
result.append(int(angle_to_num))
return result
def is_phone_tastic(word):
word_to_nums = text_to_nums(word)
angle = nums_to_angle(word_to_nums)
return angle % len(word) == 0