Иван обнови решението на 31.10.2022 23:18 (преди над 2 години)
+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)
result
си е str
, така че кастването е излишно.
+
+# 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'))
Съветвам те да изтестваш граничните стойност. Според мен имаш пропуски при тях.
Използването на
match
води то прекалено много идентичен код. Реално всичкиcase
-ове правят едно и също нещо, но имаш по 1-2 симвоа разлика на всеки ред. Това лесно се бърка с typo-та, и трудно се праправя. Съветвам те да опиташ да го генерализираш, за да постигнеш алгоритъм от само няколко реда за същото.Тук открих edge case, който беше доста очевиден но бях пропуснал, мерси за коментара. :)