Решение на Телефонна любов от Никол Казанджиева

Обратно към всички решения

Към профила на Никол Казанджиева

Резултати

  • 10 точки от тестове
  • 1 бонус точка
  • 11 точки общо
  • 36 успешни тест(а)
  • 1 неуспешни тест(а)

Код

import itertools
import math
def nums_to_text(nums):
ans = ""
keypad = {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"]}
for digit, group in itertools.groupby(nums):
if digit == -1 or digit == 1:
continue
if digit == 0:
ans += " "
continue
letters = keypad[digit]
presses_number = len(list(group))
letter_index = (presses_number - 1) % len(letters)
ans += letters[letter_index]
return ans
def text_to_nums(text):
if len(text) == 0:
return []
to_nums = {
" ": [0],
"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]
}
group = {
" ": [0],
"a": [2], "b": [2], "c": [2],
"d": [3], "e": [3], "f": [3],
"g": [4], "h": [4], "i": [4],
"j": [5], "k": [5], "l": [5],
"m": [6], "n": [6], "o": [6],
"p": [7], "q": [7], "r": [7], "s": [7],
"t": [8], "u": [8], "v": [8],
"w": [9], "x": [9], "y": [9], "z": [9]
}
ans = []
for i in range(0, len(text)-1):
first = text[i].lower()
second = text[i+1].lower()
ans += to_nums[first]
if group[first] == group[second]:
ans += [-1]
last = text[len(text)-1].lower()
ans += to_nums[last]
return ans
def nums_to_angle(nums):
angles = {
1: 30, 2: 60, 3: 90,
4: 120, 5: 150, 6: 180,
7: 210, 8: 240, 9: 270, 0: 300
}
ans = 0
for num in nums:
if num == -1:
continue
ans += angles[num]
if ans > 359:
while ans > 359:
ans -= 360
return ans
def round_up_to_nearest_30(x, base=30):
mid = [15, 45, 75, 105, 135, 165, 195, 225, 255, 285, 305, 345]
if x in mid:
x -= 1
return base * round(x / base)
def normalized(x):
if 0 <= x <= 360:
return x
while x < 0:
x += 360
while x > 360:
x -= 360
return x
def angles_to_nums(nums):
possible_angles = [0, 30, 60, 90, 120, 150, 180, 210, 240, 270, 300]
digits = {0: [], 30: [1], 60: [2], 90: [3], 120: [4], 150: [5],
180: [6], 210: [7], 240: [8], 270: [9], 330: [], 360: []}
ans = []
for num in nums:
if num not in possible_angles:

Предполагам, че можеш да пропуснеш дефиницията possible_angles и да нормализираш и закръгляваш винаги, което няма да доведе до кой знае колко допълнителни операции, но ще спести код.

num = round_up_to_nearest_30(num)
num = normalized(num)
ans += digits[num]
else:
ans += digits[num]
return ans
def is_phone_tastic(word):
if word == "":
return False
return nums_to_angle(text_to_nums(word)) % len(word) == 0

Лог от изпълнението

.......E.............................
======================================================================
ERROR: test_random_mixed_case (test.TestAnglesToNums)
Test with a random mixed input.
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/storage/deedee/data/rails/pyfmi-2022/releases/20221020151654/lib/language/python/runner.py", line 67, in thread
    raise result
KeyError: 300

----------------------------------------------------------------------
Ran 37 tests in 0.438s

FAILED (errors=1)

История (1 версия и 5 коментара)

Никол обнови решението на 03.11.2022 02:54 (преди над 1 година)

+import itertools
+import math
+
+
+def nums_to_text(nums):
+ ans = ""
+ keypad = {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"]}
+
+ for digit, group in itertools.groupby(nums):
+ if digit == -1 or digit == 1:
+ continue
+ if digit == 0:
+ ans += " "
+ continue
+ letters = keypad[digit]
+ presses_number = len(list(group))
+ letter_index = (presses_number - 1) % len(letters)
+ ans += letters[letter_index]
+ return ans
+
+
+def text_to_nums(text):
+ if len(text) == 0:
+ return []
+
+ to_nums = {
+ " ": [0],
+ "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]
+ }
+ group = {
+ " ": [0],
+ "a": [2], "b": [2], "c": [2],
+ "d": [3], "e": [3], "f": [3],
+ "g": [4], "h": [4], "i": [4],
+ "j": [5], "k": [5], "l": [5],
+ "m": [6], "n": [6], "o": [6],
+ "p": [7], "q": [7], "r": [7], "s": [7],
+ "t": [8], "u": [8], "v": [8],
+ "w": [9], "x": [9], "y": [9], "z": [9]
+
+ }
+ ans = []
+
+ for i in range(0, len(text)-1):
+ first = text[i].lower()
+ second = text[i+1].lower()
+ ans += to_nums[first]
+ if group[first] == group[second]:
+ ans += [-1]
+
+ last = text[len(text)-1].lower()
+ ans += to_nums[last]
+
+ return ans
+
+
+def nums_to_angle(nums):
+ angles = {
+ 1: 30, 2: 60, 3: 90,
+ 4: 120, 5: 150, 6: 180,
+ 7: 210, 8: 240, 9: 270, 0: 300
+ }
+ ans = 0
+ for num in nums:
+ if num == -1:
+ continue
+ ans += angles[num]
+
+ if ans > 359:
+ while ans > 359:
+ ans -= 360
+
+ return ans
+
+
+def round_up_to_nearest_30(x, base=30):
+ mid = [15, 45, 75, 105, 135, 165, 195, 225, 255, 285, 305, 345]
+ if x in mid:
+ x -= 1
+ return base * round(x / base)
+
+
+def normalized(x):
+ if 0 <= x <= 360:
+ return x
+ while x < 0:
+ x += 360
+ while x > 360:
+ x -= 360
+ return x
+
+
+def angles_to_nums(nums):
+ possible_angles = [0, 30, 60, 90, 120, 150, 180, 210, 240, 270, 300]
+ digits = {0: [], 30: [1], 60: [2], 90: [3], 120: [4], 150: [5],
+ 180: [6], 210: [7], 240: [8], 270: [9], 330: [], 360: []}
+ ans = []
+ for num in nums:
+ if num not in possible_angles:

Предполагам, че можеш да пропуснеш дефиницията possible_angles и да нормализираш и закръгляваш винаги, което няма да доведе до кой знае колко допълнителни операции, но ще спести код.

+ num = round_up_to_nearest_30(num)
+ num = normalized(num)
+ ans += digits[num]
+ else:
+ ans += digits[num]
+ return ans
+
+
+def is_phone_tastic(word):
+ if word == "":
+ return False
+ return nums_to_angle(text_to_nums(word)) % len(word) == 0