Решение на Телефонна любов от Иван Лаков

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

Към профила на Иван Лаков

Резултати

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

Код

import math
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: [" "]
}
def nums_to_text(nums):
last_num = -1
counter = 0
result = ""
for num in nums:
if last_num == num:
counter += 1
elif last_num != num:
if last_num != -1:
result += letters[last_num][counter % len(letters[last_num])]
last_num = num
counter = 0
result += letters[last_num][counter]
return result
# probably the ugliest thing I've ever done, tried 3 different approaches and ended up with some hybrid :]
def text_to_nums(text):
result = []
last_button = 1
for letter in text.upper():
multiplier = 1
match letter:

Използването на match води то прекалено много идентичен код. Реално всички case-ове правят едно и също нещо, но имаш по 1-2 симвоа разлика на всеки ред. Това лесно се бърка с typo-та, и трудно се праправя. Съветвам те да опиташ да го генерализираш, за да постигнеш алгоритъм от само няколко реда за същото.

case "A" | "B" | "C":
if last_button == 2:
result.append(-1)
last_button = 2
if letter == "B": multiplier = 2
if letter == "C": multiplier = 3
for _ in range(multiplier):
result.append(list(letters.keys())[list(letters.values()).index(["A", "B", "C"])])
case "D" | "E" | "F":
if last_button == 3:
result.append(-1)
last_button = 3
if letter == "E": multiplier = 2
if letter == "F": multiplier = 3
for _ in range(multiplier):
result.append(list(letters.keys())[list(letters.values()).index(["D", "E", "F"])])
case "G" | "H" | "I":
if last_button == 4:
result.append(-1)
last_button = 4
if letter == "H": multiplier = 2
if letter == "I": multiplier = 3
for _ in range(multiplier):
result.append(list(letters.keys())[list(letters.values()).index(["G", "H", "I"])])
case "J" | "K" | "L":
if last_button == 5:
result.append(-1)
last_button = 5
if letter == "K": multiplier = 2
if letter == "L": multiplier = 3
for _ in range(multiplier):
result.append(list(letters.keys())[list(letters.values()).index(["J", "K", "L"])])
case "M" | "N" | "O":
if last_button == 6:
result.append(-1)
last_button = 6
if letter == "N": multiplier = 2
if letter == "O": multiplier = 3
for _ in range(multiplier):
result.append(list(letters.keys())[list(letters.values()).index(["M", "N", "O"])])
case "P" | "Q" | "R" | "S":
if last_button == 7:
result.append(-1)
last_button = 7
if letter == "Q": multiplier = 2
if letter == "R": multiplier = 3
if letter == "S": multiplier = 4
for _ in range(multiplier):
result.append(list(letters.keys())[list(letters.values()).index(["P", "Q", "R", "S"])])
case "T" | "U" | "V":
if last_button == 8:
result.append(-1)
last_button = 8
if letter == "U": multiplier = 2
if letter == "V": multiplier = 3
for _ in range(multiplier):
result.append(list(letters.keys())[list(letters.values()).index(["T", "U", "V"])])
case "W" | "X" | "Y" | "Z":
if last_button == 9:
result.append(-1)
last_button = 9
if letter == "X": multiplier = 2
if letter == "Y": multiplier = 3
if letter == "Z": multiplier = 4
for _ in range(multiplier):
result.append(list(letters.keys())[list(letters.values()).index(["W", "X", "Y", "Z"])])
case " ":
if last_button == 0:
result.append(-1)
last_button = 0
result.append(list(letters.keys())[list(letters.values()).index([" "])])
return result
def nums_to_angle(nums):
sum = 0
for num in nums:
sum += 30 * num
while (sum > 359):
sum -= 360
while (sum < 0):
sum += 360
return sum
def angles_to_nums(angles):
new_angle = 0
result_list = []
for angle in angles:
floor = math.floor(angle / 30)
ceil = math.ceil(angle / 30)
if (floor + ceil) / 2 == angle:
new_angle = math.floor(angle / 30) * 30
else:
new_angle = round(angle / 30) * 30
while (new_angle > 359):
new_angle -= 360
while (new_angle < 0):
new_angle += 360
if new_angle == 300:
result = 0
else:
result = int(new_angle / 30)
if new_angle != 0 and new_angle != 330:
result_list.append(result)
return result_list
def is_phone_tastic(word):
angle_result = nums_to_angle(text_to_nums(word))
letter_count = len(word)
return angle_result % letter_count == 0
#print(nums_to_text([0, 4, 4, 3, 3, 5, 5, 5, -1, 5, 5, 5, 6, 6, 6, 0, -1, 0, 4]))
#print(text_to_nums("PYTHONzz zz"))
#print(nums_to_angle([1, 5, 9, 0, 0, 9, 8, 8, 8]))
#print(angles_to_nums([0, -44, 90, -120]))
#print(is_phone_tastic('GOD'))

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

.......FF.E..F....F.E.EE.EE..........
======================================================================
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_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
KeyError: 1

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

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

======================================================================
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
IndexError: list index out of range

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

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

First differing element 5:
2
1

- [5, 1, 2, 4, 9, 2, 8, 0, 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: [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_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.444s

FAILED (failures=4, errors=6)

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

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

+import math
+
+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: [" "]
+}
+
+def nums_to_text(nums):
+ last_num = -1
+ counter = 0
+ result = ""
+
+ for num in nums:
+ if last_num == num:
+ counter += 1
+ elif last_num != num:
+ if last_num != -1:
+ result += letters[last_num][counter % len(letters[last_num])]
+ last_num = num
+ counter = 0
+ result += letters[last_num][counter]
+ return str(result)
+
+# probably the ugliest thing I've ever done, tried 3 different approaches and ended up with some hybrid :]
+def text_to_nums(text):
+ result = []
+ last_button = 1
+ for letter in text.upper():
+ multiplier = 1
+ match letter:

Използването на match води то прекалено много идентичен код. Реално всички case-ове правят едно и също нещо, но имаш по 1-2 симвоа разлика на всеки ред. Това лесно се бърка с typo-та, и трудно се праправя. Съветвам те да опиташ да го генерализираш, за да постигнеш алгоритъм от само няколко реда за същото.

+ case "A" | "B" | "C":
+ if last_button == 2:
+ result.append(-1)
+ last_button = 2
+ if letter == "B": multiplier = 2
+ if letter == "C": multiplier = 3
+ for _ in range(multiplier):
+ result.append(list(letters.keys())[list(letters.values()).index(["A", "B", "C"])])
+ case "D" | "E" | "F":
+ if last_button == 3:
+ result.append(-1)
+ last_button = 3
+ if letter == "E": multiplier = 2
+ if letter == "F": multiplier = 3
+ for _ in range(multiplier):
+ result.append(list(letters.keys())[list(letters.values()).index(["D", "E", "F"])])
+ case "G" | "H" | "I":
+ if last_button == 4:
+ result.append(-1)
+ last_button = 4
+ if letter == "H": multiplier = 2
+ if letter == "I": multiplier = 3
+ for _ in range(multiplier):
+ result.append(list(letters.keys())[list(letters.values()).index(["G", "H", "I"])])
+ case "J" | "K" | "L":
+ if last_button == 5:
+ result.append(-1)
+ last_button = 5
+ if letter == "K": multiplier = 2
+ if letter == "L": multiplier = 3
+ for _ in range(multiplier):
+ result.append(list(letters.keys())[list(letters.values()).index(["J", "K", "L"])])
+ case "M" | "N" | "O":
+ if last_button == 6:
+ result.append(-1)
+ last_button = 6
+ if letter == "N": multiplier = 2
+ if letter == "O": multiplier = 3
+ for _ in range(multiplier):
+ result.append(list(letters.keys())[list(letters.values()).index(["M", "N", "O"])])
+ case "P" | "Q" | "R" | "S":
+ if last_button == 7:
+ result.append(-1)
+ last_button = 7
+ if letter == "Q": multiplier = 2
+ if letter == "R": multiplier = 3
+ if letter == "S": multiplier = 4
+ for _ in range(multiplier):
+ result.append(list(letters.keys())[list(letters.values()).index(["P", "Q", "R", "S"])])
+ case "T" | "U" | "V":
+ if last_button == 8:
+ result.append(-1)
+ last_button = 8
+ if letter == "U": multiplier = 2
+ if letter == "V": multiplier = 3
+ for _ in range(multiplier):
+ result.append(list(letters.keys())[list(letters.values()).index(["T", "U", "V"])])
+ case "W" | "X" | "Y" | "Z":
+ if last_button == 9:
+ result.append(-1)
+ last_button = 9
+ if letter == "X": multiplier = 2
+ if letter == "Y": multiplier = 3
+ if letter == "Z": multiplier = 4
+ for _ in range(multiplier):
+ result.append(list(letters.keys())[list(letters.values()).index(["W", "X", "Y", "Z"])])
+ case " ":
+ if last_button == 0:
+ result.append(-1)
+ last_button = 0
+ result.append(list(letters.keys())[list(letters.values()).index([" "])])
+ return result
+
+def nums_to_angle(nums):
+ sum = 0
+ for num in nums:
+ sum += 30 * num
+
+ while (sum > 359):
+ sum -= 360
+ while (sum < 0):
+ sum += 360
+
+ return sum
+
+def angles_to_nums(angles):
+ new_angle = 0
+ result_list = []
+ for angle in angles:
+ floor = math.floor(angle / 30)
+ ceil = math.ceil(angle / 30)
+
+ if (floor + ceil) / 2 == angle:
+ new_angle = math.floor(angle / 30) * 30
+ else:
+ new_angle = round(angle / 30) * 30
+
+ while (new_angle > 359):
+ new_angle -= 360
+ while (new_angle < 0):
+ new_angle += 360
+
+ result = int(new_angle / 30)
+ if new_angle != 0 and new_angle != 330:
+ result_list.append(result)
+ return result_list
+
+def is_phone_tastic(word):
+ angle_result = nums_to_angle(text_to_nums(word))
+ letter_count = len(word)
+ return angle_result % letter_count == 0
+
+#print(nums_to_text([4, 4, 3, 3, 5, 5, 5, -1, 5, 5, 5, 6, 6, 6]))
+#print(text_to_nums("PYTHON"))
+#print(nums_to_angle([1, 5, 9]))
+#print(angles_to_nums([16, 46, 90, -120]))
+#print(is_phone_tastic('GOD'))

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

import math
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: [" "]
}
def nums_to_text(nums):
last_num = -1
counter = 0
result = ""
for num in nums:
if last_num == num:
counter += 1
elif last_num != num:
if last_num != -1:
result += letters[last_num][counter % len(letters[last_num])]
last_num = num
counter = 0
result += letters[last_num][counter]
- return str(result)
+ return result
# probably the ugliest thing I've ever done, tried 3 different approaches and ended up with some hybrid :]
def text_to_nums(text):
result = []
last_button = 1
for letter in text.upper():
multiplier = 1
match letter:
case "A" | "B" | "C":
if last_button == 2:
result.append(-1)
last_button = 2
if letter == "B": multiplier = 2
if letter == "C": multiplier = 3
for _ in range(multiplier):
result.append(list(letters.keys())[list(letters.values()).index(["A", "B", "C"])])
case "D" | "E" | "F":
if last_button == 3:
result.append(-1)
last_button = 3
if letter == "E": multiplier = 2
if letter == "F": multiplier = 3
for _ in range(multiplier):
result.append(list(letters.keys())[list(letters.values()).index(["D", "E", "F"])])
case "G" | "H" | "I":
if last_button == 4:
result.append(-1)
last_button = 4
if letter == "H": multiplier = 2
if letter == "I": multiplier = 3
for _ in range(multiplier):
result.append(list(letters.keys())[list(letters.values()).index(["G", "H", "I"])])
case "J" | "K" | "L":
if last_button == 5:
result.append(-1)
last_button = 5
if letter == "K": multiplier = 2
if letter == "L": multiplier = 3
for _ in range(multiplier):
result.append(list(letters.keys())[list(letters.values()).index(["J", "K", "L"])])
case "M" | "N" | "O":
if last_button == 6:
result.append(-1)
last_button = 6
if letter == "N": multiplier = 2
if letter == "O": multiplier = 3
for _ in range(multiplier):
result.append(list(letters.keys())[list(letters.values()).index(["M", "N", "O"])])
case "P" | "Q" | "R" | "S":
if last_button == 7:
result.append(-1)
last_button = 7
if letter == "Q": multiplier = 2
if letter == "R": multiplier = 3
if letter == "S": multiplier = 4
for _ in range(multiplier):
result.append(list(letters.keys())[list(letters.values()).index(["P", "Q", "R", "S"])])
case "T" | "U" | "V":
if last_button == 8:
result.append(-1)
last_button = 8
if letter == "U": multiplier = 2
if letter == "V": multiplier = 3
for _ in range(multiplier):
result.append(list(letters.keys())[list(letters.values()).index(["T", "U", "V"])])
case "W" | "X" | "Y" | "Z":
if last_button == 9:
result.append(-1)
last_button = 9
if letter == "X": multiplier = 2
if letter == "Y": multiplier = 3
if letter == "Z": multiplier = 4
for _ in range(multiplier):
result.append(list(letters.keys())[list(letters.values()).index(["W", "X", "Y", "Z"])])
case " ":
if last_button == 0:
result.append(-1)
last_button = 0
result.append(list(letters.keys())[list(letters.values()).index([" "])])
return result
def nums_to_angle(nums):
sum = 0
for num in nums:
sum += 30 * num
while (sum > 359):
sum -= 360
while (sum < 0):
sum += 360
return sum
def angles_to_nums(angles):
new_angle = 0
result_list = []
for angle in angles:
floor = math.floor(angle / 30)
ceil = math.ceil(angle / 30)
if (floor + ceil) / 2 == angle:
new_angle = math.floor(angle / 30) * 30
else:
new_angle = round(angle / 30) * 30
while (new_angle > 359):
new_angle -= 360
while (new_angle < 0):
new_angle += 360
- result = int(new_angle / 30)
+ if new_angle == 300:
+ result = 0
+ else:
+ result = int(new_angle / 30)
if new_angle != 0 and new_angle != 330:
result_list.append(result)
return result_list
def is_phone_tastic(word):
angle_result = nums_to_angle(text_to_nums(word))
letter_count = len(word)
return angle_result % letter_count == 0
-#print(nums_to_text([4, 4, 3, 3, 5, 5, 5, -1, 5, 5, 5, 6, 6, 6]))
-#print(text_to_nums("PYTHON"))
-#print(nums_to_angle([1, 5, 9]))
-#print(angles_to_nums([16, 46, 90, -120]))
+#print(nums_to_text([0, 4, 4, 3, 3, 5, 5, 5, -1, 5, 5, 5, 6, 6, 6, 0, -1, 0, 4]))
+#print(text_to_nums("PYTHONzz zz"))
+#print(nums_to_angle([1, 5, 9, 0, 0, 9, 8, 8, 8]))
+#print(angles_to_nums([0, -44, 90, -120]))
#print(is_phone_tastic('GOD'))