Решение на Телефонна любов от Весела Петрова

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

Към профила на Весела Петрова

Резултати

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

Код

def check_buttons_with_3_letters(count, first_letter, second_letter, third_letter):

Това би могла да постигнеш по-динамично, за да избегнеш ръчната проверка в if-овете. Например, тази и следващата функция биха могли да се обединият вcheck_buttons(count, *letters)и да базираш логиката си на бройката елементи вletters`.

Разбира се, биха могили да се приложат и други модификации по дока по-долу, така че тези функции да са излишни, но ако се концентрираме само върху тях, това е коментарът ми.

if count % 3 == 1:
return first_letter
elif count % 3 == 2:
return second_letter
else:
return third_letter
def check_buttons_with_4_letters(count, first_letter, second_letter, third_letter, fourth_letter):
if count % 4 == 1:
return first_letter
elif count % 4 == 2:
return second_letter
elif count % 4 == 3:
return third_letter
else:
return fourth_letter
def nums_to_text(nums):
final_text = ''
index = 0
while index < len(nums):
count = 1
while (index + 1) < len(nums) and nums[index] == nums[index + 1]:
count += 1
index += 1
match nums[index]:
case 1:
index += 1
continue
case 2:
final_text += check_buttons_with_3_letters(count, 'a', 'b', 'c')
case 3:
final_text += check_buttons_with_3_letters(count, 'd', 'e', 'f')
case 4:
final_text += check_buttons_with_3_letters(count, 'g', 'h', 'i')
case 5:
final_text += check_buttons_with_3_letters(count, 'j', 'k', 'l')
case 6:
final_text += check_buttons_with_3_letters(count, 'm', 'n', 'o')
case 7:
final_text += check_buttons_with_4_letters(count, 'p', 'q', 'r', 's')
case 8:
final_text += check_buttons_with_3_letters(count, 't', 'u', 'v')
case 9:
final_text += check_buttons_with_4_letters(count, 'w', 'x', 'y', 'z')
case 0:
final_text += ' ' * count
case -1:
index += 1
continue
index += 1
return final_text.upper()
def text_to_nums(text):
final_list = []
letters_to_lists = {
'': [],
' ': [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],
}
previous_char = ''
for char in text.lower():
if previous_char in letters_to_lists and len(
set(letters_to_lists[previous_char]).intersection(set(letters_to_lists[char]))) > 0:

При положение, че всеки list от стойностите съдържа едни и същи символи, не е нужно да цепиш сетове. Просто сравни първите им елементи.
letters_to_lists[previous_char][0] == letters_to_lists[char][0]

final_list.extend([-1])
previous_char = char
if char in letters_to_lists:
final_list.extend(letters_to_lists[char])
return final_list
def normalize_angle(angle):
return angle % 360
def nums_to_angle(nums):
numbers_to_degrees = {
0: 300,
1: 30,
2: 60,
3: 90,
4: 120,
5: 150,
6: 180,
7: 210,
8: 240,
9: 270,
}
sum_of_degrees = 0
for n in nums:
if n in numbers_to_degrees:
sum_of_degrees += numbers_to_degrees[n]
return normalize_angle(sum_of_degrees)
def angles_to_nums(angles):
final_numbers = []
for angle in angles:
normalized_angle = normalize_angle(angle)
if normalized_angle // 15 == 0 or normalized_angle == 15 or normalized_angle > 285:
continue
if normalized_angle % 30 == 15:
final_numbers.append(normalized_angle // 30)
else:
final_numbers.append(int(round(normalized_angle / 30)))
return final_numbers
def is_phone_tastic(word):
if word == '':
return False
num_list = text_to_nums(word)
sum_of_angles = nums_to_angle(num_list)
return sum_of_angles % len(word) == 0

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

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

First differing element 7:
9
0

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

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


----------------------------------------------------------------------
Ran 37 tests in 0.316s

FAILED (failures=1)

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

Весела обнови решението на 03.11.2022 02:19 (преди над 1 година)

+def check_buttons_with_3_letters(count, first_letter, second_letter, third_letter):
+ if count % 3 == 1:
+ return first_letter
+ elif count % 3 == 2:
+ return second_letter
+ else:
+ return third_letter
+
+
+def check_buttons_with_4_letters(count, first_letter, second_letter, third_letter, fourth_letter):
+ if count % 4 == 1:
+ return first_letter
+ elif count % 4 == 2:
+ return second_letter
+ elif count % 4 == 3:
+ return third_letter
+ else:
+ return fourth_letter
+
+
+def nums_to_text(nums):
+ final_text = ''
+ index = 0
+
+ while index < len(nums):
+ count = 1
+ while (index + 1) < len(nums) and nums[index] == nums[index + 1]:
+ count += 1
+ index += 1
+ match nums[index]:
+ case 1:
+ index += 1
+ continue
+ case 2:
+ final_text += check_buttons_with_3_letters(count, 'a', 'b', 'c')
+ case 3:
+ final_text += check_buttons_with_3_letters(count, 'd', 'e', 'f')
+ case 4:
+ final_text += check_buttons_with_3_letters(count, 'g', 'h', 'i')
+ case 5:
+ final_text += check_buttons_with_3_letters(count, 'j', 'k', 'l')
+ case 6:
+ final_text += check_buttons_with_3_letters(count, 'm', 'n', 'o')
+ case 7:
+ final_text += check_buttons_with_4_letters(count, 'p', 'q', 'r', 's')
+ case 8:
+ final_text += check_buttons_with_3_letters(count, 't', 'u', 'v')
+ case 9:
+ final_text += check_buttons_with_4_letters(count, 'w', 'x', 'y', 'z')
+ case 0:
+ final_text += ' ' * count
+ case -1:
+ index += 1
+ continue
+ index += 1
+ return final_text.upper()
+
+
+def text_to_nums(text):
+ final_list = []
+
+ letters_to_lists = {
+ ' ': [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],
+ }
+
+ previous_char = ''
+ for char in text.lower():
+ if previous_char == char or (previous_char in letters_to_lists and
+ len(set(letters_to_lists[previous_char]).intersection(
+ set(letters_to_lists[char]))) > 0):
+ final_list.extend([-1])
+ previous_char = char
+ if char in letters_to_lists:
+ final_list.extend(letters_to_lists[char])
+
+ return final_list
+
+
+def normalize_angle(angle):
+ return angle % 360
+
+
+def nums_to_angle(nums):
+ numbers_to_degrees = {
+ 0: 300,
+ 1: 30,
+ 2: 60,
+ 3: 90,
+ 4: 120,
+ 5: 150,
+ 6: 180,
+ 7: 210,
+ 8: 240,
+ 9: 270,
+ }
+ sum_of_degrees = 0
+
+ for n in nums:
+ if n in numbers_to_degrees:
+ sum_of_degrees += numbers_to_degrees[n]
+ return normalize_angle(sum_of_degrees)
+
+
+def angles_to_nums(angles):
+ final_numbers = []
+ for angle in angles:
+ normalized_angle = normalize_angle(angle)
+
+ if normalized_angle // 15 == 0 or normalized_angle > 285:
+ continue
+ if normalized_angle % 30 == 15:
+ final_numbers.append(normalized_angle // 30)
+ else:
+ final_numbers.append(int(round(normalized_angle / 30)))
+ return final_numbers
+
+
+def is_phone_tastic(word):
+ num_list = text_to_nums(word)
+ sum_of_angles = nums_to_angle(num_list)
+ return sum_of_angles % len(word) == 0

Весела обнови решението на 03.11.2022 02:53 (преди над 1 година)

def check_buttons_with_3_letters(count, first_letter, second_letter, third_letter):

Това би могла да постигнеш по-динамично, за да избегнеш ръчната проверка в if-овете. Например, тази и следващата функция биха могли да се обединият вcheck_buttons(count, *letters)и да базираш логиката си на бройката елементи вletters`.

Разбира се, биха могили да се приложат и други модификации по дока по-долу, така че тези функции да са излишни, но ако се концентрираме само върху тях, това е коментарът ми.

if count % 3 == 1:
return first_letter
elif count % 3 == 2:
return second_letter
else:
return third_letter
def check_buttons_with_4_letters(count, first_letter, second_letter, third_letter, fourth_letter):
if count % 4 == 1:
return first_letter
elif count % 4 == 2:
return second_letter
elif count % 4 == 3:
return third_letter
else:
return fourth_letter
def nums_to_text(nums):
final_text = ''
index = 0
while index < len(nums):
count = 1
while (index + 1) < len(nums) and nums[index] == nums[index + 1]:
count += 1
index += 1
match nums[index]:
case 1:
index += 1
continue
case 2:
final_text += check_buttons_with_3_letters(count, 'a', 'b', 'c')
case 3:
final_text += check_buttons_with_3_letters(count, 'd', 'e', 'f')
case 4:
final_text += check_buttons_with_3_letters(count, 'g', 'h', 'i')
case 5:
final_text += check_buttons_with_3_letters(count, 'j', 'k', 'l')
case 6:
final_text += check_buttons_with_3_letters(count, 'm', 'n', 'o')
case 7:
final_text += check_buttons_with_4_letters(count, 'p', 'q', 'r', 's')
case 8:
final_text += check_buttons_with_3_letters(count, 't', 'u', 'v')
case 9:
final_text += check_buttons_with_4_letters(count, 'w', 'x', 'y', 'z')
case 0:
final_text += ' ' * count
case -1:
index += 1
continue
index += 1
return final_text.upper()
def text_to_nums(text):
final_list = []
letters_to_lists = {
+ '': [],
' ': [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],
}
previous_char = ''
for char in text.lower():
- if previous_char == char or (previous_char in letters_to_lists and
- len(set(letters_to_lists[previous_char]).intersection(
- set(letters_to_lists[char]))) > 0):
+ if previous_char in letters_to_lists and len(
+ set(letters_to_lists[previous_char]).intersection(set(letters_to_lists[char]))) > 0:

При положение, че всеки list от стойностите съдържа едни и същи символи, не е нужно да цепиш сетове. Просто сравни първите им елементи.
letters_to_lists[previous_char][0] == letters_to_lists[char][0]

final_list.extend([-1])
previous_char = char
if char in letters_to_lists:
final_list.extend(letters_to_lists[char])
return final_list
def normalize_angle(angle):
return angle % 360
def nums_to_angle(nums):
numbers_to_degrees = {
0: 300,
1: 30,
2: 60,
3: 90,
4: 120,
5: 150,
6: 180,
7: 210,
8: 240,
9: 270,
}
sum_of_degrees = 0
for n in nums:
if n in numbers_to_degrees:
sum_of_degrees += numbers_to_degrees[n]
return normalize_angle(sum_of_degrees)
def angles_to_nums(angles):
final_numbers = []
for angle in angles:
normalized_angle = normalize_angle(angle)
- if normalized_angle // 15 == 0 or normalized_angle > 285:
+ if normalized_angle // 15 == 0 or normalized_angle == 15 or normalized_angle > 285:
continue
if normalized_angle % 30 == 15:
final_numbers.append(normalized_angle // 30)
else:
final_numbers.append(int(round(normalized_angle / 30)))
return final_numbers
def is_phone_tastic(word):
+ if word == '':
+ return False
num_list = text_to_nums(word)
sum_of_angles = nums_to_angle(num_list)
return sum_of_angles % len(word) == 0