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

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

Към профила на Мария Кукова

Резултати

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

Код

from itertools import groupby
keyboard_nums_to_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')
}
keyboard_letters_to_nums = {'a': (2, 1),
'b': (2, 2),
'c': (2, 3),
'd': (3, 1),
'e': (3, 2),
'f': (3, 3),
'g': (4, 1),
'h': (4, 2),
'i': (4, 3),
'j': (5, 1),
'k': (5, 2),
'l': (5, 3),
'm': (6, 1),
'n': (6, 2),
'o': (6, 3),
'p': (7, 1),
'q': (7, 2),
'r': (7, 3),
's': (7, 4),
't': (8, 1),
'u': (8, 2),
'v': (8, 3),
'w': (9, 1),
'x': (9, 2),
'y': (9, 3),
'z': (9, 4),
' ': (0, 1)
}
angles_to_digits = {30: 1,
60: 2,
90: 3,
120: 4,
150: 5,
180: 6,
210: 7,
240: 8,
270: 9
}
def nums_to_text(nums):
group_by_nums = [(k, sum(1 for i in g)) for k, g in groupby(nums) if not k == 1 and not k == -1]
text_result = ""
for num, count in group_by_nums:
if num == 9 or num == 7:
text_result += keyboard_nums_to_letters[num][(count - 1) % 4]
elif num == 1 or num == -1:
continue
elif num == 0:
text_result += ' '
else:
text_result += keyboard_nums_to_letters[num][(count - 1) % 3]
return text_result
def text_to_nums(text):
text_to_lower = text.lower()
nums_result = []
for letter in text_to_lower:
digit = keyboard_letters_to_nums[letter][0]
digit_count = keyboard_letters_to_nums[letter][1]
if not len(nums_result) == 0 and nums_result[-1] == digit:
nums_result.append(-1)
nums_result += [digit] * digit_count
return nums_result
def nums_to_angle(nums):
angle = sum(num * 30 for num in nums)
angle += (nums.count(0) * 300)
return angle % 360
def my_round(x, base=30):
while x > 360:
x -= 360
while x < 0:
x += 360
return base * round(x / base)
def angles_to_nums(angles):
round_angles = [my_round(angle) for angle in angles]
digits_result = []
for round_angle in round_angles:
if angles_to_digits.get(round_angle, 0):
digits_result.append(angles_to_digits[round_angle])
return digits_result
def is_phone_tastic(word):
if not len(word):
return False
word_to_digits = text_to_nums(word)
digits_to_angle = nums_to_angle(word_to_digits)
return not digits_to_angle % len(word)

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

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

First differing element 5:
2
1

Second list contains 1 additional elements.
First extra element 8:
9

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

----------------------------------------------------------------------
Ran 37 tests in 0.468s

FAILED (failures=2)

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

Мария обнови решението на 01.11.2022 12:56 (преди над 2 години)

+from itertools import groupby
+
+keyboard_nums_to_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: ' '
+ }
+
+keyboard_letters_to_nums = {'a': (2, 1),
+ 'b': (2, 2),
+ 'c': (2, 3),
+ 'd': (3, 1),
+ 'e': (3, 2),
+ 'f': (3, 3),
+ 'g': (4, 1),
+ 'h': (4, 2),
+ 'i': (4, 3),
+ 'j': (5, 1),
+ 'k': (5, 2),
+ 'l': (5, 3),
+ 'm': (6, 1),
+ 'n': (6, 2),
+ 'o': (6, 3),
+ 'p': (7, 1),
+ 'q': (7, 2),
+ 'r': (7, 3),
+ 's': (7, 4),
+ 't': (8, 1),
+ 'u': (8, 2),
+ 'v': (8, 3),
+ 'w': (9, 1),
+ 'x': (9, 2),
+ 'y': (9, 3),
+ 'z': (9, 4),
+ ' ': (0, 1)}
+
+angels_to_digits = {30: 1,
+ 60: 2,
+ 90: 3,
+ 120: 4,
+ 150: 5,
+ 180: 6,
+ 210: 7,
+ 240: 8,
+ 270: 9}
+
+
+def nums_to_text(nums):
+ group_by_nums = [(k, sum(1 for i in g)) for k, g in groupby(nums)]
+ text_result = ""
+
+ for num, count in group_by_nums:
+ if num == 5 or num == 7:
+ text_result += keyboard_nums_to_letters[num][(count - 1) % 4]
+ elif num == 1 or num == -1:
+ continue
+ else:
+ text_result += keyboard_nums_to_letters[num][(count - 1) % 3]
+
+ return text_result
+
+
+def text_to_nums(text):
+ text_to_lower = text.lower()
+ nums_result = []
+
+ for letter in text_to_lower:
+ digit = keyboard_letters_to_nums[letter][0]
+ digit_count = keyboard_letters_to_nums[letter][1]
+ if not len(nums_result) == 0 and nums_result[-1] == digit:
+ nums_result.append(-1)
+ nums_result += [digit] * digit_count
+ return nums_result
+
+
+def nums_to_angle(nums):
+ angle = sum(num * 30 for num in nums)
+ angle += (nums.count(0) * 300)
+ return angle % 360
+
+
+def my_round(x, base=30):
+ if x < 0:
+ return base * round((360 + x) / base)
+ return base * round(x / base)
+
+
+def angles_to_nums(angles):
+ round_angles = [my_round(angle) for angle in angles]
+ digits_result = [digit for angle, digit in angels_to_digits.items()

value for key, value in dict.items() if something_else == value е сходно с грешното търсене в речник, за което говорихме предния път. Разбирам защо си го направила така (опитах се да го напиша като контра-пример, но има детайл (решим проблем), който пречи). Просто го оставям за future reference.

Сериозният проблем тук е логиката на comprehension-а. Няма да ти го давам наготово, но си помисли ако го напишеш като 2 for-а как би изглеждало и дали това е правилната логика.

+ for round_angle in round_angles if round_angle == angle]
+ return digits_result
+
+
+def is_phone_tastic(word):
+ word_to_digits = text_to_nums(word)
+ digits_to_angle = nums_to_angle(word_to_digits)
+
+ if digits_to_angle % 30:
+ return False
+ return True
+

Мария обнови решението на 03.11.2022 16:34 (преди над 2 години)

from itertools import groupby
keyboard_nums_to_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: ' '
+ 9: ('W', 'X', 'Y', 'Z')
}
keyboard_letters_to_nums = {'a': (2, 1),
'b': (2, 2),
'c': (2, 3),
'd': (3, 1),
'e': (3, 2),
'f': (3, 3),
'g': (4, 1),
'h': (4, 2),
'i': (4, 3),
'j': (5, 1),
'k': (5, 2),
'l': (5, 3),
'm': (6, 1),
'n': (6, 2),
'o': (6, 3),
'p': (7, 1),
'q': (7, 2),
'r': (7, 3),
's': (7, 4),
't': (8, 1),
'u': (8, 2),
'v': (8, 3),
'w': (9, 1),
'x': (9, 2),
'y': (9, 3),
'z': (9, 4),
- ' ': (0, 1)}
+ ' ': (0, 1)
+ }
-angels_to_digits = {30: 1,
+angles_to_digits = {30: 1,
60: 2,
90: 3,
120: 4,
150: 5,
180: 6,
210: 7,
240: 8,
- 270: 9}
+ 270: 9
+ }
def nums_to_text(nums):
- group_by_nums = [(k, sum(1 for i in g)) for k, g in groupby(nums)]
+ group_by_nums = [(k, sum(1 for i in g)) for k, g in groupby(nums) if not k == 1 and not k == -1]
text_result = ""
for num, count in group_by_nums:
- if num == 5 or num == 7:
+ if num == 9 or num == 7:
text_result += keyboard_nums_to_letters[num][(count - 1) % 4]
elif num == 1 or num == -1:
continue
+ elif num == 0:
+ text_result += ' '
else:
text_result += keyboard_nums_to_letters[num][(count - 1) % 3]
return text_result
def text_to_nums(text):
text_to_lower = text.lower()
nums_result = []
for letter in text_to_lower:
digit = keyboard_letters_to_nums[letter][0]
digit_count = keyboard_letters_to_nums[letter][1]
if not len(nums_result) == 0 and nums_result[-1] == digit:
nums_result.append(-1)
nums_result += [digit] * digit_count
return nums_result
def nums_to_angle(nums):
angle = sum(num * 30 for num in nums)
angle += (nums.count(0) * 300)
return angle % 360
def my_round(x, base=30):
- if x < 0:
- return base * round((360 + x) / base)
+ while x > 360:
+ x -= 360
+ while x < 0:
+ x += 360
return base * round(x / base)
def angles_to_nums(angles):
+
round_angles = [my_round(angle) for angle in angles]
- digits_result = [digit for angle, digit in angels_to_digits.items()
- for round_angle in round_angles if round_angle == angle]
+ digits_result = []
+ for round_angle in round_angles:
+ if angles_to_digits.get(round_angle, 0):
+ digits_result.append(angles_to_digits[round_angle])
return digits_result
def is_phone_tastic(word):
+ if not len(word):
+ return False
+
word_to_digits = text_to_nums(word)
digits_to_angle = nums_to_angle(word_to_digits)
- if digits_to_angle % 30:
- return False
+ return not digits_to_angle % len(word)
- return True
-