Рая обнови решението на 02.11.2022 00:54 (преди над 2 години)
+def nums_to_angle(nums):
+ sum_angles = 0
+ angle_diff = 30
Такива променливи, които ще ползваш на няколко места (nums_to_angle, angle_to_nums) е нелошо да бъдат дефинирани като константи (спазвайки конвенцията за именуване на константи) извън тялото на функцията.
+ min_angle_turnabout = 360
+
+ for num in nums:
+ if num == 0:
+ angle = 300
+ else:
+ angle = num * angle_diff
+
+ sum_angles += angle
+
+ while sum_angles >= min_angle_turnabout:
+ sum_angles -= min_angle_turnabout
+
+ return sum_angles
+
+def angles_to_nums(angles):
+ angle_diff = 30
+ min_angle_turnabout = 360
+ nums = []
+ for angle in angles:
+ while angle < 0:
+ angle += min_angle_turnabout
+ while angle >= min_angle_turnabout:
+ angle -= min_angle_turnabout
+
+ digit = round(angle / angle_diff)
+
+ if digit == 10:
+ nums.append(0)
+ elif digit > 0 and digit < 10:
+ nums.append(digit)
+
+ return nums
+
+def nums_to_text(nums):
+ num_to_symbols = {
+ 2: 'ABC',
+ 3: 'DEF',
+ 4: 'GHI',
+ 5: 'JKL',
+ 6: 'MNO',
+ 7: 'PQRS',
+ 8: 'TUV',
+ 9: 'WXYZ',
+ 0: ' ',
+ }
+ text = ''
+ num_occurances = 0
+ current_num = 0
+ is_first_iteration = True
+
+ buffer = 1
Не е най-необходимата променлива на света, а коментарът по-долу стига да обясни защо би написала nums.append(1)
.
+ nums.append(buffer) # adding buffer so that the last num could be processed in the loop
+
+ for num in nums:
+ if is_first_iteration:
+ current_num = num
+ is_first_iteration = False
+ continue
+
+ if current_num == num:
+ num_occurances += 1
+ continue
+
+ if current_num in num_to_symbols:
+ symbols_from_num = num_to_symbols[current_num]
+ symbols_from_num_len = len(symbols_from_num)
+ while num_occurances >= symbols_from_num_len:
+ num_occurances -= symbols_from_num_len
+
+ text += symbols_from_num[num_occurances]
+
+ num_occurances = 0
+ current_num = num
+
+ nums.pop() # removing the buffer
+ return text
+
+
+def text_to_nums(text):
+ # for eeach symbol the tuple coressponding is (times needed to hit the digit, digit to hit)
+ symbol_to_num = {
+ 'A': (1, 2),
+ 'B': (2, 2),
+ 'C': (3, 2),
+ 'D': (1, 3),
+ 'E': (2, 3),
+ 'F': (3, 3),
+ 'G': (1, 4),
+ 'H': (2, 4),
+ 'I': (3, 4),
+ 'J': (1, 5),
+ 'K': (2, 5),
+ 'L': (3, 5),
+ 'M': (1, 6),
+ 'N': (2, 6),
+ 'O': (3, 6),
+ 'P': (1, 7),
+ 'Q': (2, 7),
+ 'R': (3, 7),
+ 'S': (4, 7),
+ 'T': (1, 8),
+ 'U': (2, 8),
+ 'V': (3, 8),
+ 'W': (1, 9),
+ 'X': (2, 9),
+ 'Y': (3, 9),
+ 'Z': (4, 9),
+ ' ': (1, 0),
+ }
+ nums = []
+ last_num = -1
+ for char in text:
+ times, num = symbol_to_num[char.upper()]
+ if last_num == num:
+ nums.append(-1)
+
+ for _ in range(times):
Имаш много сладкото nums.extend([num] * times)
или nums += [num] * times
.
+ nums.append(num)
+
+ last_num = num
+
+ return nums
+
+
+def is_phone_tastic(word):
+ nums = text_to_nums(word)
+ angle = nums_to_angle(nums)
+
+ return angle % len(word) == 0
Логиката в ядрото на nums_to_text
ми е малко Fortran-ска (да се чете "като на C"), но не мога да отрека, че ще работи.
За празните редове ще си поговорим днес на лекцията.
Останалото е добре. :)