Калоян обнови решението на 02.11.2022 16:27 (преди над 2 години)
+telephone = {
+ "21": "A", "22": "B", "23": "C",
+ "31": "D", "32": "E", "33": "F",
+ "41": "G", "42": "H", "43": "I",
+ "51": "J", "52": "K", "53": "L",
+ "61": "M", "62": "N", "63": "O",
+ "71": "P", "72": "Q", "73": "R", "74": "S",
+ "81": "T", "82": "U", "83": "V",
+ "91": "W", "92": "X", "93": "Y", "94": "Z",
+ "11": " ", "01": "_"
+}
+
+
+def get_text(num, counter):
+ if num == -1:
+ return ""
+ the_key = str(num) + str(counter)
+ return telephone[the_key]
+
+
+def nums_to_text(nums):
+ result = ""
+ prev_num = -2
+ counter = 0
+ for num in nums:
+ if num != prev_num and counter != 0:
+ result += get_text(prev_num, counter)
+ counter = 0
+ counter += 1
+ prev_num = num
+ result += get_text(prev_num, counter)
+ return result
+
+
+def get_number(char):
+ key_list = list(telephone.keys())
+ val_list = list(telephone.values())
+ return key_list[val_list.index(char)]
На практика, ако разчитам правилно, търсиш в речника наобратно. Има доста по-елегантни методи да направиш същото нещо.
+
+
+def text_to_nums(text):
+ nums = list()
Избягвай да ползваш "конструктора" list. Затова ги има квадратните скоби - nums = []
.
+ for char in text.upper():
+ number = get_number(char)
+ num = int(number[0])
+ counter = int(number[1])
+ size = len(nums)
+ if size > 0:
+ last_element = nums[len(nums) - 1]
+ if num == last_element:
+ nums.append(-1)
+ for _ in range(counter):
+ nums.append(num)
+ return nums
+
+
+def normalize(angle):
+ while angle < 0 or angle >= 360:
+ if angle > 360:
+ angle -= 360
+ else:
+ angle += 360
+ return angle
+
+
+def nums_to_angle(nums):
+ angle = 0
+ for num in nums:
+ if num == 0:
+ angle += 300
+ else:
+ for _ in range(num):
+ angle += 30
+ angle = normalize(angle)
+ return angle
+
+
+def closest_number(n):
+ q = int(n / 30)
Това е с толкова лоши имена на променливите, че изглежда като взето от stack overflow (или от С код). :D
Math magic, но трудно за разбиране.
+ n1 = 30 * q
+ if n * 30 > 0:
+ n2 = 30 * (q + 1)
+ else:
+ n2 = 30 * (q - 1)
+ if abs(n - n1) <= abs(n - n2):
+ return n1
+ return n2
+
+
+def angles_to_nums(angles):
+ result = list()
+ for angle in angles:
+ angle = normalize(angle)
+ if angle <= 15 or angle > 315:
+ continue
+ angle = closest_number(angle)
+ num = int(angle/30)
+ if num == 10:
+ num = 0
+ result.append(num)
+ return result
+
+
+def is_phone_tastic(text):
+ size = len(text)
+ nums = text_to_nums(text)
+ angle = nums_to_angle(nums)
+ return angle % size == 0
Здравей, да поправя ли забележките или мога да го оставя така? И closest_number го взех от стара задачка моя, мога и нея да преработя. Според мен не е "Magic math", а логични математически сметки от училище с подобрения.
На практика, ако разчитам правилно, търсиш в речника наобратно. Има доста по-елегантни методи да направиш същото нещо.
Избягвай да ползваш "конструктора" list. Затова ги има квадратните скоби -
nums = []
.Това е с толкова лоши имена на променливите, че изглежда като взето от stack overflow (или от С код). :D
Math magic, но трудно за разбиране.