Георги обнови решението на 30.10.2022 21:49 (преди над 2 години)
+number_codes = {
+ 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 add_letter(text, number, click_counter):
+ if number in number_codes:
+ text += number_codes[number][click_counter - 1]
+ click_counter = 0
+ return text, click_counter
+
+def nums_to_text(numbers):
+ click_counter = 0
+ previous_click = numbers[0]
+ final_text = ""
+ for number in numbers:
+ if number == 1 or number == -1:
+ final_text, click_counter = add_letter(final_text, previous_click, click_counter)
+ continue
+ else:
+ if number != previous_click:
+ final_text, click_counter = add_letter(final_text, previous_click, click_counter)
+ click_counter += 1
+ if click_counter > len(number_codes[number]):
+ click_counter = 1
+ previous_click = number
+ final_text, click_counter = add_letter(final_text, previous_click, click_counter)
+ return final_text
+
+def text_to_nums(text):
+ number_code = []
+ previous_number = -1
+ for letter in text:
+ for number, letters in number_codes.items():
+ upper_letter = letter.upper()
+ if upper_letter in letters:
+ if number == previous_number and number != 0:
+ number_code.append(-1)
+ for _ in range(letters.index(upper_letter) + 1):
+ number_code.append(number)
+ previous_number = number
+ break
+ return number_code
+
+def nums_to_angle(numbers):
+ angle_sum = 0
+ for number in numbers:
+ number = 10 if number == 0 else number
+ angle_sum += number*30
+ normalized_angle = angle_sum % 360
+ return normalized_angle
+
+def round_angle(angle):
+ multiplier = angle // 30
+ mod = angle % 30
+ closer_angle = 0
+ if mod > 15:
+ closer_angle = 30 * (multiplier + 1)
+ else:
+ closer_angle = 30 * (multiplier)
+ return closer_angle
+
+def make_angle_positive(angle):
+ return 360 - (angle * -1) if angle < 0 else angle
+
+def angles_to_nums(angles):
+ number_code = []
+ for angle in angles:
+ angle = make_angle_positive(angle)
+ normalized_angle = angle % 360
+ rounded_angle = round_angle(normalized_angle)
+ if rounded_angle in [330,360,0]:
+ continue
+ rounded_angle = 0 if rounded_angle == 300 else rounded_angle
+ number_code.append(rounded_angle // 30)
+ return number_code
+
+def is_phone_tastic(text):
+ normalized_angle = nums_to_angle(text_to_nums(text))
+ return normalized_angle % len(text) == 0
+
Ако предварително "обърнеш" речника (letter_to_num(s)), било то като хардкоуднат обект, или динамично преди дефиницията на функциите си, ще можеш да поопростиш логиката тук. Не е нужно да предаваш ново решение за това. Просто препоръка.
Не е кой знае колко важно, но тази операция може да иде с един ред нагоре. Не е нужно да я правиш за всеки елемент от речника си.
Ако имаш доверие на инпута ни (а аз бих имал), можеш
number = number or 10
. Найс, а?