Боян обнови решението на 30.10.2022 11:17 (преди над 2 години)
+keyboard = {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: [' ']}
+
+# digits -> degrees
+dial_digits = {x: x * 30 for x in range(1,10)}
+dial_digits.update({0:300})
+
+# degrees -> digits
+dial_degrees = {degree: digit for digit,degree in dial_digits.items()}
+
+def nums_to_text(nums):
+ # While seeing the same number - increment counter
+ # If we see a different number - reset counter
+ # If we see -1 - reset counter and number
+ message = ''
+
+ prevNumber = nums[0]
+ pressCount = 1
+ for currNumber in nums[1:]:
+ if (currNumber != -1 and keyboard.get(currNumber) == None):
+ continue
+ if (currNumber == prevNumber and currNumber != -1):
+ pressCount += 1
+ continue
+
+ message = append_letter(message, prevNumber, pressCount)
+
+ if (currNumber != -1):
+ prevNumber = currNumber
+ pressCount = 1
+ else:
+ pressCount = 0
+
+ message = append_letter(message, prevNumber, pressCount)
+ return message
+
+def text_to_nums(text):
+ text = text.upper()
+ button = None
+ nums = []
+ for c in text:
+ for items in keyboard.items():
+ if (c in items[1]):
+ if(button == items[0]):
+ nums.append(-1)
+ button = items[0]
+ break
+ index = keyboard.get(button).index(c)
+ nums.extend([button] * (index + 1))
+ return nums
+
+def nums_to_angle(nums,strict = True):
+ total_angle = 0
+ for num in nums:
+ curr_angle = dial_digits.get(num)
+ if(curr_angle is not None):
+ total_angle += curr_angle
+
+ return normalize_angle(total_angle,strict)
+
+def angles_to_nums(angles):
+ angles = normalize_angles(round_angles(angles))
+ res = []
+ for angle in angles:
+ res.append(dial_degrees.get(angle))
+ return res
+
+def is_phone_tastic(word):
+ letter_count = len(word)
+ digits = text_to_nums(word)
+ angle = nums_to_angle(digits,False)
+ if(angle % letter_count == 0):
+ return True
+
+ return False
+
+
+def append_letter(message, buttonNumber, pressCnt):
+ letters = keyboard.get(buttonNumber)
+ if (pressCnt > len(letters)):
+ pressCnt = pressCnt % len(letters)
+
+ letter = letters[pressCnt - 1]
+ message += letter
+ return message
+
+def normalize_angle(angle,strict = True):
+ if(angle >= 360):
+ angle = angle - ((round(angle / 360) - 1) * 360)
+ if(angle < 0):
+ while(angle < 0):
+ angle += 360
+ if(strict == True and angle >= 330 or angle <= 0):
+ return None
+ return angle
+
+def normalize_angles(angles):
+ normalized_angles = []
+ for angle in angles:
+ normalized = normalize_angle(angle)
+ if(normalized is not None):
+ normalized_angles.append(normalized)
+
+ return normalized_angles
+
+def round_angles(angles):
+ def round_angle(angle):
+ return 30 * round(angle / 30)
+ return list(map(round_angle,angles))