Лиляна обнови решението на 02.11.2022 19:18 (преди над 2 години)
+from itertools import repeat
+
+keyboard = {
+ 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']
+}
+
+angles = {
+ 0: 300,
+ 1: 30,
+ 2: 60,
+ 3: 90,
+ 4: 120,
+ 5: 150,
+ 6: 180,
+ 7: 210,
+ 8: 240,
+ 9: 270,
+}
+
+
+def rounded_number(number):
+ base = 30
+ result = number % base
+
+ if result + result > base:
+ return number + base - result
+ else:
+ return number - result
+
+def normalize_angle(angle):
+ while angle < 0:
+ angle += 360
+ while angle > 359:
+ angle -= 360
+ return angle
+
+def nums_to_text(nums):
+ value_list = list(keyboard.values())
+ output = ''
+ i, counter = 0, 0
+
+ for digit in nums:
+ if len(nums) == 1:
+ return value_list[abs(digit)][0]
+
+ if i < len(nums) - 1 and digit == nums[i+1]:
+ counter += 1
+ else:
+ if digit in [2, 3, 4, 5, 6, 7, 8, 9]:
+ counter = counter % 3
+ output += value_list[digit][counter]
+ elif digit == 0:
+ output += (counter+1) * value_list[digit][0]
+ counter = 0
+ i += 1
+ return output
+
+def text_to_nums(text):
+ output = []
+
+ if len(text) == 0:
+ return [1]
+
+ for letter in text:
+ for key, value in keyboard.items():
+ if letter.upper() in value:
+ if len(output) > 0 and key == output[len(output)-1]:
+ output.append(-1)
+ ind = value.index(letter.upper()) + 1
+ output.extend(repeat(key, ind))
+ return output
+
+def nums_to_angle(nums):
+ sum = 0
+ angles_values = list(angles.values())
+
+ for digit in nums:
+ if digit in angles.keys():
+ sum += angles_values[digit]
+ return normalize_angle(sum)
+
+def angles_to_nums(list_angles):
+ disk_num = []
+ rounded = 0
+
+ for angle in list_angles:
+ if angle < 0 or angle > 359:
+ angle = normalize_angle(angle)
+ if angle % 30 != 0:
+ rounded = rounded_number(angle)
+ else:
+ rounded = angle
+
+ for key, value in angles.items():
+ if rounded == value:
+ disk_num.append(key)
+ return disk_num
+
+def is_phone_tastic(word):
+ angle = nums_to_angle(text_to_nums(word))
+
+ if normalize_angle(angle) % len(word) == 0:
+ return True
+ else:
+ return False
Предполагам, че можеш да си спестиш няколко променливи тук. Имаш
digit
, имашi
, имашcounter
.Ако предварително обърнеш речника (дори и динамично), така че да размениш ключ/стойност, би могла да си спестиш един цикъл.