Данаил обнови решението на 01.11.2022 23:58 (преди над 2 години)
+from decimal import ROUND_HALF_DOWN, Decimal
+
+mapped_nums = {2: 'abc', 3: 'def', 4: 'ghi', 5: 'jkl',
+ 6: 'mno', 7: 'pqrs', 8: 'tuv', 9: 'wxyz', 0: ' '}
+
+possible_numbers = [x % 10 for x in range(2, 11)]
+possible_numbers.append(0)
+
+
+def get_char(nums, index_from, index_to):
+ if nums[index_from] in possible_numbers:
+ chars = mapped_nums[nums[index_from]]
+ return chars[(index_to - index_from - 1) % len(chars)]
+ return ''
+
+
+def nums_to_text(nums):
+ index_from, index_to = 0, 0
+ sentence = ''
+ while index_to < len(nums):
+ if nums[index_from] != nums[index_to]:
+ sentence += get_char(nums, index_from, index_to)
+ index_from = index_to
+ index_to += 1
+ sentence += get_char(nums, index_from, index_to)
+ return sentence
+
+
+def text_to_nums(text):
+ result = []
+ last_num = None
+ for char in text.lower():
+ char_order = (ord(char)-ord('a'))
+ number = None
+ repetitions = None
+ if char == ' ':
+ number = 0
+ repetitions = 1
+ elif char < 'p':
+ repetitions = char_order % 3 + 1
+ number = int(char_order/3) + 2
+ elif char in ['t', 'u', 'v']:
+ repetitions = (char_order - 1) % 3 + 1
+ number = int((char_order-1)/3) + 2
+ elif char >= 'p' and char <= 's':
+ repetitions = ((char_order + 1) % 4) + 1
+ number = 7
+ elif char >= 'w' and char <= 'z':
+ repetitions = (char_order + 2) % 4 + 1
+ number = 9
+ if last_num == number:
+ result += [-1]
+ last_num = number
+ result += repetitions * [number]
+ return result
+
+
+def nums_to_angle(nums):
+ angle = 0
+ for num in nums:
+ if num == 0:
+ angle += 300
+ else:
+ angle += num*30
+ return angle % 360
+
+
+def angles_to_nums(angles):
+ nums = []
+ for angle in angles:
+ angle = angle % 360
+ if angle < 0:
+ angle = 360-angle
+ angle = Decimal(angle/30).to_integral_value(rounding=ROUND_HALF_DOWN)
+ if angle == 10:
+ nums += [0]
+ elif angle == 0 or angle > 10:
+ continue
+ else:
+ nums += [int(angle)]
Ако нямаш добра причина да ползваш списък (e.g. понякога имаш по 1 елемент, понякога по 2), nums.append(int(angle))
върши същото.
+ return nums
+
+
+def is_phone_tastic(word):
+ angle = nums_to_angle(text_to_nums(word))
+ return angle % len(word) == 0
Тук таме имаш липсващи спейсове около някои оператори, но in general - решението е добре написано.
Само това с конкатенацията на списък с 1 елемент е малко sus. :)