Решение на Телефонна любов от Калоян Кателиев

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

Към профила на Калоян Кателиев

Резултати

  • 7 точки от тестове
  • 0 бонус точки
  • 7 точки общо
  • 26 успешни тест(а)
  • 11 неуспешни тест(а)

Код

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()
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)
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

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

.......E..E......E..F.E..EE.E.F...F.F
======================================================================
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 63, in thread
    raise TimeoutError
TimeoutError

======================================================================
ERROR: test_empty_input (test.TestIsPhonetastic)
Test with empty 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
ZeroDivisionError: integer division or modulo by zero

======================================================================
ERROR: test_normalizing_for_top_boundary (test.TestNumsToAngles)
Test normalizing when the sum is full circle.
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/storage/deedee/data/rails/pyfmi-2022/releases/20221020151654/lib/language/python/runner.py", line 63, in thread
    raise TimeoutError
TimeoutError

======================================================================
ERROR: test_empty_input (test.TestNumsToText)
Test with empty 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: '-20'

======================================================================
ERROR: test_overflow_input (test.TestNumsToText)
Test with oveflowing number of presses.
----------------------------------------------------------------------
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: '96'

======================================================================
ERROR: test_random_mixed_case (test.TestNumsToText)
Test for a random mixed case.
----------------------------------------------------------------------
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: '56'

======================================================================
ERROR: test_spaces_only (test.TestNumsToText)
Test for input of only whitespaces with or without -1.
----------------------------------------------------------------------
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: '04'

======================================================================
FAIL: test_all_chars (test.TestNumsToText)
Test for correct mapping of all chars.
----------------------------------------------------------------------
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
AssertionError: ' abcdefghijklmnopqrstuvwxyz_' != 'abcdefghijklmnopqrstuvwxyz '
-  abcdefghijklmnopqrstuvwxyz_
? -                          ^
+ abcdefghijklmnopqrstuvwxyz 
?                           ^


======================================================================
FAIL: test_all_chars (test.TestTextToNums)
Test for correct mapping of all chars.
----------------------------------------------------------------------
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
AssertionError: Lists differ: [2, -[175 chars]8, 8, -1, 8, 8, 8, 9, -1, 9, 9, -1, 9, 9, 9, -1, 9, 9, 9, 9, 1] != [2, -[175 chars]8, 8, -1, 8, 8, 8, 9, -1, 9, 9, -1, 9, 9, 9, -1, 9, 9, 9, 9, 0]

First differing element 74:
1
0

  [2,
   -1,
   2,
   2,
   -1,
   2,
   2,
   2,
   3,
   -1,
   3,
   3,
   -1,
   3,
   3,
   3,
   4,
   -1,
   4,
   4,
   -1,
   4,
   4,
   4,
   5,
   -1,
   5,
   5,
   -1,
   5,
   5,
   5,
   6,
   -1,
   6,
   6,
   -1,
   6,
   6,
   6,
   7,
   -1,
   7,
   7,
   -1,
   7,
   7,
   7,
   -1,
   7,
   7,
   7,
   7,
   8,
   -1,
   8,
   8,
   -1,
   8,
   8,
   8,
   9,
   -1,
   9,
   9,
   -1,
   9,
   9,
   9,
   -1,
   9,
   9,
   9,
   9,
-  1]
+  0]

======================================================================
FAIL: test_random_mixed_case (test.TestTextToNums)
Test for a random mixed case.
----------------------------------------------------------------------
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
AssertionError: [8, 8, 8, 2, 7, 7, 7, 7, 5, 5, 6, 6, 6, 1, -1, 1, -1, 1, 5, 2, -1, 2, 2, -1, 2, 8, 2] not found in ([8, 8, 8, 2, 7, 7, 7, 7, 5, 5, 6, 6, 6, 0, -1, 0, -1, 0, 5, 2, -1, 2, 2, -1, 2, 8, 2], [8, 8, 8, 2, 7, 7, 7, 7, 5, 5, 6, 6, 6, 0, 0, 0, 5, 2, -1, 2, 2, -1, 2, 8, 2])

======================================================================
FAIL: test_spaces_only (test.TestTextToNums)
Test for input of only whitespaces.
----------------------------------------------------------------------
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
AssertionError: [1, -1, 1, -1, 1, -1, 1] not found in ([0, -1, 0, -1, 0, -1, 0], [0, 0, 0, 0])

----------------------------------------------------------------------
Ran 37 tests in 4.356s

FAILED (failures=4, errors=7)

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

Калоян обнови решението на 02.11.2022 16:27 (преди над 1 година)

+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()
+ 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)
+ 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", а логични математически сметки от училище с подобрения.