Решение на Телефонна любов от Ангел Марински

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

Към профила на Ангел Марински

Резултати

  • 8 точки от тестове
  • 0 бонус точки
  • 8 точки общо
  • 29 успешни тест(а)
  • 8 неуспешни тест(а)

Код

from collections import OrderedDict
dict_nums_to_text = {
'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': ' '
}
dict_digit_to_angle = {
1: 30,
2: 60,
3: 90,
4: 120,
5: 150,
6: 180,
7: 210,
8: 240,
9: 270,
0: 300
}
digit_letters = {
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'],
0: [' '],
1: ['']
}
dict_text_to_nums = {key: value for value, key in dict_nums_to_text.items()}
dict_angle_to_digit = {key: value for value,
key in dict_digit_to_angle.items()}
def encode(message):
encoded_message = list()
i = 0
while (i <= len(message)-1):
count = 1
ch = message[i]
j = i
while (j < len(message)-1):
if (message[j] == message[j+1]):
count = count+1
if (ch == '7' or ch == '9') and count > 4:
count = 1
elif ch != '7' and ch != '9' and count > 3:
count = 1
j = j+1
else:
break
encoded_message.append((str(count), str(ch)))
i = j+1
return encoded_message
def nums_to_text(nums):
result = ""
encoded = encode(nums)
for number, char in encoded:
if char == '1' or char == '-1':
continue
elif char == '0':
i = int(number)
while (i > 0):
result += dict_nums_to_text[char]
i -= 1
else:
code = str(int(number) * char)
result += dict_nums_to_text[code]
return result
def text_to_nums(text):
if len(text) == 0:
return [1]
result = list()
prev = ''
for letter in text:
if prev != '' and digit_letters[int(dict_text_to_nums[prev.upper()][-1])] == digit_letters[int(dict_text_to_nums[letter.upper()][-1])]:
result.append(-1)
number = dict_text_to_nums[letter.upper()]
for digit in number:
result.append(int(digit))
prev = letter
return result
def nums_to_angle(nums):
sum = 0
for digit in nums:
if digit == -1:
continue
sum += dict_digit_to_angle[digit]
while sum >= 360:
sum -= 360
return sum
def myround(x, base=30):
return base * round(x/base)
def angles_to_nums(angles):
result = list()
for angle in angles:
if angle < 0:
angle = abs(360 + angle)
elif angle > 360:
angle = angle - 360
angle = myround(angle)
if angle == 0:
continue
if angle in dict_angle_to_digit:
result.append(dict_angle_to_digit[angle])
return result
def is_phone_tastic(text):
nums = text_to_nums(text)
angle = nums_to_angle(nums)
return angle % len(text) == 0

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

......FFF.E.........F....FF.....F....
======================================================================
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

======================================================================
FAIL: test_overflowing_angles (test.TestAnglesToNums)
Test with an overflowed 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: [] != [2]

Second list contains 1 additional elements.
First extra element 0:
2

- []
+ [2]
?  +


======================================================================
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] != [5, 1, 2, 4, 9, 1, 8, 0, 9]

Second list contains 4 additional elements.
First extra element 5:
1

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

======================================================================
FAIL: test_round_angle_direction (test.TestAnglesToNums)
Test with an angle requiring explicit rounding to floor.
----------------------------------------------------------------------
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] != [1]

First differing element 0:
2
1

- [2]
+ [1]

======================================================================
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: 'abcdefghijklmnopqrptuvwxyw ' != 'abcdefghijklmnopqrstuvwxyz '
- abcdefghijklmnopqrptuvwxyw 
?                   ^      ^
+ abcdefghijklmnopqrstuvwxyz 
?                   ^      ^


======================================================================
FAIL: 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
AssertionError: 'y' != 'x'
- y
+ x


======================================================================
FAIL: 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
AssertionError: 'fmi rulwww' != 'fmi rulzzz'
- fmi rulwww
+ fmi rulzzz


======================================================================
FAIL: test_empty_input (test.TestTextToNums)
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
AssertionError: Lists differ: [1] != []

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

- [1]
?  -

+ []

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

FAILED (failures=7, errors=1)

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

Ангел обнови решението на 03.11.2022 00:16 (преди над 1 година)

+from collections import OrderedDict
+
+
+dict_nums_to_text = {
+ '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': ' '
+}
+
+dict_digit_to_angle = {
+ 1: 30,
+ 2: 60,
+ 3: 90,
+ 4: 120,
+ 5: 150,
+ 6: 180,
+ 7: 210,
+ 8: 240,
+ 9: 270,
+ 0: 300
+}
+
+digit_letters = {
+ 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'],
+ 0: [' '],
+ 1: ['']
+}
+
+dict_text_to_nums = {key: value for value, key in dict_nums_to_text.items()}
+
+dict_angle_to_digit = {key: value for value,
+ key in dict_digit_to_angle.items()}
+
+
+def encode(message):
+ encoded_message = list()
+ i = 0
+
+ while (i <= len(message)-1):
+ count = 1
+ ch = message[i]
+ j = i
+ while (j < len(message)-1):
+ if (message[j] == message[j+1]):
+ count = count+1
+ if (ch == '7' or ch == '9') and count > 4:
+ count = 1
+ elif ch != '7' and ch != '9' and count > 3:
+ count = 1
+ j = j+1
+ else:
+ break
+ encoded_message.append((str(count), str(ch)))
+ i = j+1
+ return encoded_message
+
+
+def nums_to_text(nums):
+ result = ""
+ encoded = encode(nums)
+
+ for number, char in encoded:
+ if char == '1' or char == '-1':
+ continue
+ elif char == '0':
+ i = int(number)
+ while (i > 0):
+ result += dict_nums_to_text[char]
+ i -= 1
+ else:
+ code = str(int(number) * char)
+ result += dict_nums_to_text[code]
+
+ return result
+
+
+def text_to_nums(text):
+ if len(text) == 0:
+ return [1]
+
+ result = list()
+ prev = ''
+ for letter in text:
+ if prev != '' and digit_letters[int(dict_text_to_nums[prev.upper()][-1])] == digit_letters[int(dict_text_to_nums[letter.upper()][-1])]:
+ result.append(-1)
+ number = dict_text_to_nums[letter.upper()]
+ for digit in number:
+ result.append(int(digit))
+ prev = letter
+ return result
+
+
+def nums_to_angle(nums):
+ sum = 0
+ for digit in nums:
+ if digit == -1:
+ continue
+ sum += dict_digit_to_angle[digit]
+
+ while sum >= 360:
+ sum -= 360
+
+ return sum
+
+
+def myround(x, base=30):
+ return base * round(x/base)
+
+
+def angles_to_nums(angles):
+ result = list()
+
+ for angle in angles:
+ if angle < 0:
+ angle = abs(360 + angle)
+ elif angle > 360:
+ angle = angle - 360
+
+ angle = myround(angle)
+ if angle == 0:
+ continue
+
+ if angle in dict_angle_to_digit:
+ result.append(dict_angle_to_digit[angle])
+
+ return result
+
+
+def is_phone_tastic(text):
+ nums = text_to_nums(text)
+ angle = nums_to_angle(nums)
+
+ return angle % len(text) == 0