Минчо обнови решението на 02.11.2022 21:56 (преди над 2 години)
+
+def nums_to_text(og_nums):
+
+ working_nums = og_nums
+ num_to_letters = {
+ "2*1": "a", "2*2": "b", "2*3": "c",
+ "3*1": "d", "3*2": "e", "3*3": "f",
+ "4*1": "g", "4*2": "h", "4*3": "i",
+ "5*1": "j", "5*2": "k", "5*3": "l",
+ "6*1": "m", "6*2": "n", "6*3": "o",
+ "7*1": "p", "7*2": "q", "7*3": "r", "7*4": "s",
+ "8*1": "t", "8*2": "u", "8*3": "v",
+ "9*1": "w", "9*2": "x", "9*3": "y", "9*4": "z",
+ "0*1": " ", "-1*1": "", "1*1": ""
+ }
+ final_text = ""
+ count_pos = 1
+ count_appearances = 1
+
+ working_nums.append("END")
+ in_check = working_nums[0]
+ size = len(working_nums)
+ while count_pos < size:
+ if in_check == working_nums[count_pos]:
+ count_appearances += 1
+ if count_appearances == 5 and in_check in [7, 9]:
+ count_appearances = 1
+ elif (count_appearances == 4 and in_check in [2, 3, 4, 5, 6, 8]) or (
+ count_appearances == 2 and in_check in [-1, 1, 0]
+ ):
+ count_appearances = 1
+ else:
+ final_text += num_to_letters["{}*{}".format(in_check, count_appearances)]
+ count_appearances = 1
+ in_check = working_nums[count_pos]
+ count_pos += 1
+ return final_text
+
+
+def text_to_nums(text):
+
+ letters_to_num = {
+ "a": [2], "b": [2, 2], "c": [2, 2, 2],
+ "d": [3], "e": [3, 3], "f": [3, 3, 3],
+ "g": [4], "h": [4, 4], "i": [4, 4, 4],
+ "j": [5], "k": [5, 5], "l": [5, 5, 5],
+ "m": [6], "n": [6, 6], "o": [6, 6, 6],
+ "p": [7], "q": [7, 7], "r": [7, 7, 7], "s": [7, 7, 7, 7],
+ "t": [8], "u": [8, 8], "v": [8, 8, 8],
+ "w": [9], "x": [9, 9], "y": [9, 9, 9], "z": [9, 9, 9, 9],
+ " ": [0], "_": [0], "": [-1],
+ }
+ final_lst = []
+ text = text.lower()
+
+ for letter in text:
+ if final_lst and final_lst[-1] == letters_to_num[letter][0]:
+ final_lst.extend(letters_to_num[""])
+ final_lst.extend(letters_to_num[letter])
+ return final_lst
+
+
+def nums_to_angle(nums):
+ final_num = 0
+ for num in nums:
+ if -1 < num < 10:
+ final_num += num * 30
+ final_num %= 360
+ return final_num
+
+
+def angles_to_nums(angles):
+ final_nums = []
+ for angle in angles:
+ angle %= 360
+ if angle < 0:
+ angle += 360
+ if angle <= 15:
+ continue
+ elif angle <= 45:
+ angle = 30
+ elif angle <= 75:
+ angle = 60
+ elif angle <= 105:
+ angle = 90
+ elif angle <= 135:
+ angle = 120
+ elif angle <= 165:
+ angle = 150
+ elif angle <= 195:
+ angle = 180
+ elif angle <= 225:
+ angle = 210
+ elif angle <= 255:
+ angle = 240
+ elif angle <= 285:
+ angle = 270
+ elif angle <= 315:
+ angle = 300
+ else:
+ continue
+ angle /= 30
+ if angle == 10:
+ angle = 0
+ angle = int(angle)
+ final_nums.append(angle)
+ return final_nums
+
+
+def is_phone_tastic(word):
+ num = text_to_nums(word)
+ angle = nums_to_angle(num)
+ word_size = len(word)
+ phone_tastic = angle % word_size
+ if phone_tastic:
+ return False
+ else:
+ return True
Странен похват да се справиш с граничната стойност. Бих предпочел нещо по-близо до инструкциите.
Прегледай правилата за пренасяне на такива изрази в PEP8.
https://peps.python.org/pep-0008/#multiline-if-statements
Вече говорихме за това наживо, но да отбележа - опитай с модове, за да спестиш дублиране на редове.
Доста променливи, които не носят добавена стойност.
return not angle % len(word)