Айше обнови решението на 03.11.2022 01:39 (преди над 2 години)
+SEQUENCE_TO_LETTER = {
+ '1': '',
+ '2': 'A',
+ '22': 'B',
+ '222': 'C',
+ '3': 'D',
+ '33': 'E',
+ '333': 'F',
+ '4': 'G',
+ '44': 'H',
+ '444': 'I',
+ '5': 'J',
+ '55': 'K',
+ '555': 'L',
+ '6': 'M',
+ '66': 'N',
+ '666': 'O',
+ '7': 'P',
+ '77': 'Q',
+ '777': 'R',
+ '7777': 'S',
+ '8': 'T',
+ '88': 'U',
+ '888': 'V',
+ '9': 'W',
+ '99': 'X',
+ '999': 'Y',
+ '9999': 'Z',
+ '0': ' '
+}
+
+DIGIT_TO_ANGLE = {
+ 1: 30,
+ 2: 60,
+ 3: 90,
+ 4: 120,
+ 5: 150,
+ 6: 180,
+ 7: 210,
+ 8: 240,
+ 9: 270,
+ 0: 300
+}
+
+LETTER_TO_SEQUENCE = dict([(value, key) for key, value in SEQUENCE_TO_LETTER.items()])
{(value, key) for key, value in SEQUENCE_TO_LETTER.items()}
е същото.
+ANGLES_TO_DIGITS = dict([(value, key) for key, value in DIGIT_TO_ANGLE.items()])
+BASE_ANGLE = 30
+MAX_ANGLE = 300
+
+def is_valid_sequence(sequence, number):
+ return (sequence <= 3 and number not in [7, 9]) or (sequence <= 4 and number in [7, 9])
+
+def get_bound(number):
+ if number in [7, 9]:
+ return 4
+ return 3
+
+def normalize(angle):
+ return angle % 360
+
+def round_degrees(angle):
+ rounded_angle = BASE_ANGLE * round(angle / BASE_ANGLE)
+ if rounded_angle > MAX_ANGLE:
+ return 0
+ return rounded_angle
+
+def nums_to_text(nums):
+ previous_number = nums[0]
+ count = 0
+ number_seq = []
+ result = ''
+
+ for num in nums:
+ if num == previous_number:
+ count += 1
+ else:
+ number_seq.append((previous_number, count))
+ count = 1
+ previous_number = num
+
+ number_seq.append((previous_number, count))
+
+ for num, repetition in number_seq:
+ if num == 0:
+ result += ' ' * repetition
+ elif num == -1 or num == 1:
+ continue
+ elif is_valid_sequence(repetition, num):
+ result += SEQUENCE_TO_LETTER[str(num) * repetition]
+ else:
+ bound = get_bound(num)
+ repetition = repetition % bound or get_bound(num)
+ result += SEQUENCE_TO_LETTER[str(num) * repetition]
+
+ return result
+
+def text_to_nums(text):
+ text = text.upper()
+ prev_digit = 0
+ result = []
+
+ for letter in text:
+ digit = int(LETTER_TO_SEQUENCE[letter][0])
+
+ if digit == prev_digit and digit != 0:
+ result.append(-1)
+
+ sequence = LETTER_TO_SEQUENCE[letter]
+ for seq_letter in sequence:
+ result.append(int(seq_letter))
+ prev_digit = digit
+
+ return result
+
+def nums_to_angle(nums):
+ result = 0
+ for num in nums:
+ if num < 0:
+ continue
+
+ angle = DIGIT_TO_ANGLE[num]
+ result += angle
+
+ return normalize(result)
+
+def angles_to_nums(angles):
+ numbers = []
+ for angle in angles:
+ normalized_angle = normalize(angle)
+ rounded_angle = round_degrees(normalized_angle)
+
+ if not rounded_angle:
Реално можеш да го напишеш и
if rounded_angle:
numbers.append...
просто пестиш код, не че е по-различно.
+ continue
+
+ numbers.append(ANGLES_TO_DIGITS[rounded_angle])
+
+ return numbers
+
+def is_phone_tastic(word):
+ if not word:
+ return False
+
+ digits = text_to_nums(word)
+ angle = normalize(nums_to_angle(digits))
+
+ return angle % len(word) == 0
{(value, key) for key, value in SEQUENCE_TO_LETTER.items()}
е същото.Реално можеш да го напишеш и
просто пестиш код, не че е по-различно.