Решение на Телефонна любов от Йоан Бабулков

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

Към профила на Йоан Бабулков

Резултати

  • 9 точки от тестове
  • 0 бонус точки
  • 9 точки общо
  • 33 успешни тест(а)
  • 4 неуспешни тест(а)

Код

nums_to_letters = {
"1": "",
"2": "A", "22": "B", "222": "C",
"3": "D", "33": "E", "333": "F",
"4": "G", "44": "H", "444": "I",
"5": "J", "55": "K", "555": "L",
"6": "M", "66": "N", "666": "O",
"7": "P", "77": "Q", "777": "R", "7777": "S",
"8": "T", "88": "U", "888": "V",
"9": "W", "99": "X", "999": "Y", "9999": "Z",
"0": " "
}
letters_to_nums = {letter: num for num, letter in nums_to_letters.items()}
def nums_to_text(nums):
text = ""
nums = [str(num) for num in nums]
prev = nums[0] if nums[0] != '1' else ""
for num in nums[1:]:
if int(num) not in range(-1, 10):
continue
if num == "-1":
if prev:
text += nums_to_letters[prev]
prev = ""
continue
if prev == "" or (prev[0] == num and num not in "01"):
prev += num
else:
text += nums_to_letters[prev]
prev = num
if len(prev) > 3 and int(prev[0]) in [*range(1, 7), 8]:
prev = prev[:len(prev) % 3]
if len(prev) > 4 and int(prev[0]) in [7, 9]:
prev = prev[:len(prev) % 4]
if prev:
text += nums_to_letters[prev]
return text
def text_to_nums(text):
text = text.upper()
if not text:
return []
prev = text[0]
nums = list(letters_to_nums[prev])
for letter in text[1:]:
if letters_to_nums[prev][0] in letters_to_nums[letter]:
nums.append(-1)
nums.extend(list(letters_to_nums[letter]))
prev = letter
return [int(num) for num in nums]
# I am aware that the following is hard to read and generally a bad practice,
# that being said, I just wanted to have some fun :D
def nums_to_angle(nums):
return sum([num * 30 if num != 0 else 300 for num in nums if num != -1]) % 360
def angles_to_nums(angles):
return [(angle + 14) // 30 for angle in [angle % 360 for angle in angles if angle % 360 in range(16, 330)]]
def is_phone_tastic(word):
return nums_to_angle(text_to_nums(word)) % len(word) == 0 if word else False

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

..F....F..............E......E.......
======================================================================
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
IndexError: list index out of range

======================================================================
ERROR: test_starting_with_timeout (test.TestNumsToText)
Test with a sequence starting with a -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: '-1'

======================================================================
FAIL: test_ignoring_over_330 (test.TestAnglesToNums)
Test that angles rounded over 330 are ignored.
----------------------------------------------------------------------
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: [11] != []

First list contains 1 additional elements.
First extra element 0:
11

- [11]
+ []

======================================================================
FAIL: 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
AssertionError: Lists differ: [5, 1, 2, 4, 9, 1, 8, 10, 9] != [5, 1, 2, 4, 9, 1, 8, 0, 9]

First differing element 7:
10
0

- [5, 1, 2, 4, 9, 1, 8, 10, 9]
?                       -

+ [5, 1, 2, 4, 9, 1, 8, 0, 9]

----------------------------------------------------------------------
Ran 37 tests in 0.354s

FAILED (failures=2, errors=2)

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

Йоан обнови решението на 03.11.2022 00:29 (преди над 1 година)

+nums_to_letters = {
+ "1": "",
+ "2": "A", "22": "B", "222": "C",
+ "3": "D", "33": "E", "333": "F",
+ "4": "G", "44": "H", "444": "I",
+ "5": "J", "55": "K", "555": "L",
+ "6": "M", "66": "N", "666": "O",
+ "7": "P", "77": "Q", "777": "R", "7777": "S",
+ "8": "T", "88": "U", "888": "V",
+ "9": "W", "99": "X", "999": "Y", "9999": "Z",
+ "0": " "
+}
+
+letters_to_nums = {letter: num for num, letter in nums_to_letters.items()}
+
+
+def nums_to_text(nums):
+ text = ""
+ nums = [str(num) for num in nums]
+ prev = nums[0] if nums[0] != '1' else ""
+
+ for num in nums[1:]:
+ if int(num) not in range(-1, 10):
+ continue
+ if num == "-1":
+ if prev:
+ text += nums_to_letters[prev]
+ prev = ""
+ continue
+
+ if prev == "" or (prev[0] == num and num not in "01"):
+ prev += num
+ else:
+ text += nums_to_letters[prev]
+ prev = num
+
+ if len(prev) > 3 and int(prev[0]) in [*range(1, 7), 8]:
+ prev = prev[:len(prev) % 3]
+
+ if len(prev) > 4 and int(prev[0]) in [7, 9]:
+ prev = prev[:len(prev) % 4]
+
+ if prev:
+ text += nums_to_letters[prev]
+ return text
+
+
+def text_to_nums(text):
+ text = text.upper()
+ if not text:
+ return []
+ prev = text[0]
+ nums = list(letters_to_nums[prev])
+
+ for letter in text[1:]:
+ if letters_to_nums[prev][0] in letters_to_nums[letter]:
+ nums.append(-1)
+ nums.extend(list(letters_to_nums[letter]))
+ prev = letter
+ return [int(num) for num in nums]
+
+
+# I am aware that the following is hard to read and generally a bad practice,
+# that being said, I just wanted to have some fun :D
+
+
+def nums_to_angle(nums):
+ return sum([num * 30 if num != 0 else 300 for num in nums if num != -1]) % 360
+
+
+def angles_to_nums(angles):
+ return [(angle + 14) // 30 for angle in [angle % 360 for angle in angles if angle % 360 in range(16, 330)]]
+
+
+def is_phone_tastic(word):
+ return nums_to_angle(text_to_nums(word)) % len(word) == 0 if word else False