Решение на Телефонна любов от Ивана Дончевска

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

Към профила на Ивана Дончевска

Резултати

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

Код

digit_options = {0: ' ',
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')}
def nums_to_text(numbers):
letters = []
output_string = ""
for index in range(0, len(numbers)):
counter = 1
if numbers[index] == numbers[index - 1] and index > 0:
continue
while index in range(len(numbers) - 1) and numbers[index] == numbers[index + 1]:
index += 1
counter += 1
if numbers[index] in [2, 3, 4, 5, 6, 8]:
if counter > 3: # When button is pressed more times then wanted
counter %= 3 # Get reminder when divided by 3
elif numbers[index] in [7, 9]:
if counter > 4:
counter %= 4
elif numbers[index] in [-1, 1]:
continue
elif numbers[index] == 0:
counter = 1 # In case of zero, always set counter to 1, because value of 0 is only one space
letters.append(digit_options[numbers[index]][counter - 1])
index += counter - 1
output_string = output_string.join(letters)
return output_string
letter_options = {'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)}
def text_to_nums(text):
output_list = []
text = map(str.lower, text)
stack = [(' ', 0)] # To check if there are two or more consecutive equal letters or button numbers
for letter in text:
if letter == ' ':
stack.append((' ', 0))
output_list.append(0)
continue
if stack[-1][0] == letter or stack[-1][1] == letter_options[letter][0]:
output_list.append(-1)
for i in range(0, letter_options[letter][1]):
output_list.append(letter_options[letter][0])
stack.append((letter, letter_options[letter][0]))
return output_list
angle_values = {1: 30, 2: 60, 3: 90, 4: 120, 5: 150, 6: 180, 7: 210, 8: 240, 9: 270, 0: 300}
def nums_to_angle(numbers):
sum_angles = 0
for number in numbers:
if number == -1:
continue
sum_angles += angle_values[number]
while sum_angles >= 360:
sum_angles -= 360
return sum_angles
def normalize_angle(angle):
while angle > 360:
angle -= 360
while angle < 0:
angle += 360
if angle % 30 != 0:
reminder = angle % 30
if reminder <= 15:
angle -= reminder
else:
angle += (30 - reminder)
return angle
number_values = {30: 1, 60: 2, 90: 3, 120: 4, 150: 5, 180: 6, 210: 7, 240: 8, 270: 9, 300: 0}
def angles_to_nums(angles):
list_output = []
normalized = map(normalize_angle, angles)
for normalized_angle in normalized:
if normalized_angle == 0 or normalized_angle > 300:
continue
list_output.append(number_values[normalized_angle])
return list_output
def is_phone_tastic(word):
if len(word) == 0:
return False
numbers = text_to_nums(word)
angles = nums_to_angle(numbers)
return angles % len(word) == 0

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

.....................................
----------------------------------------------------------------------
Ran 37 tests in 0.437s

OK

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

Ивана обнови решението на 31.10.2022 11:17 (преди над 1 година)

+digit_options = {0: ' ', 2: ('a', 'b', 'c'), 3: ('d', 'e', 'f'), 4: ('g', 'h', 'i'),
+ 5: ('j', 'l', 'k'), 6: ('m', 'n', 'o'), 7: ('p', 'q', 'r', 's'),
+ 8: ('t', 'u', 'v'), 9: ('w', 'x', 'y', 'z')}
+
+
+def nums_to_text(numbers):
+ letters = []
+ output_string = ""
+ for index in range(0, len(numbers)):
+ counter = 1
+ if numbers[index] == numbers[index - 1] and index > 0:
+ continue
+ while index in range(len(numbers) - 1) and numbers[index] == numbers[index + 1]:
+ index += 1
+ counter += 1
+ if numbers[index] in [2, 3, 4, 5, 6, 8]:
+ if counter > 3:

Нужно ли е да проверяш дали е повече от 3, за да вземеш остатъка при деление на 3? Според мен не. Можеш директно да приложиш следващия ред. Не съм вникнал в логиката напълно, така че ме извини, ако греша.

+ counter %= 3
+ elif numbers[index] in [7, 9]:
+ if counter > 4:
+ counter %= 4
+ elif numbers[index] in [-1, 1]:
+ continue
+ letters.append(digit_options[numbers[index]][counter - 1])
+ index += counter - 1
+ output_string = output_string.join(letters)
+ return output_string
+
+
+letter_options = {'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)}
+
+
+def text_to_nums(text):
+ output_list = []
+ text = map(str.lower, text)
+ stack = [""] # To check if there are two or more consecutive equal letters
+ for letter in text:
+ if stack[-1] == letter:
+ output_list.append((-1))
+ for i in range(0, letter_options[letter][1]):
+ output_list.append(letter_options[letter][0])
+ stack.append(letter)
+ return output_list
+
+
+angle_values = {1: 30, 2: 60, 3: 90, 4: 120, 5: 150, 6: 180, 7: 210, 8: 240, 9: 270, 0: 300}
+
+
+def nums_to_angle(numbers):
+ sum_angles = 0
+ for number in numbers:
+ sum_angles += angle_values[number]
+ if sum_angles > 360:
+ while sum_angles > 360:
+ sum_angles -= 360
+ return sum_angles
+
+
+def normalize_angle(angle):
+ if angle > 360:
+ while angle > 360:
+ angle -= 360
+ elif angle < 0:
+ while angle < 0:
+ angle += 360
+ if angle % 30 != 0:
+ reminder = angle % 30
+ if reminder <= 15:
+ angle -= reminder
+ else:
+ angle += (30 - reminder)
+ return angle
+
+
+number_values = {30: 1, 60: 2, 90: 3, 120: 4, 150: 5, 180: 6, 210: 7, 240: 8, 270: 9, 300: 0}
+
+
+def angles_to_nums(angles):
+ list_output = []
+ normalized = []
+ for angle in angles:
+ normalized.append(normalize_angle(angle))
+ for normalized_angle in normalized:
+ if normalized_angle == 0 or normalized_angle > 300:
+ continue
+ list_output.append(number_values[normalized_angle])
+ return list_output
+
+
+def is_phone_tastic(word):
+ word_length = len(word)
+ numbers = text_to_nums(word)
+ angles = nums_to_angle(numbers)
+ if angles % word_length == 0:
+ return True
+ return False

Ивана обнови решението на 03.11.2022 01:47 (преди над 1 година)

-digit_options = {0: ' ', 2: ('a', 'b', 'c'), 3: ('d', 'e', 'f'), 4: ('g', 'h', 'i'),
- 5: ('j', 'l', 'k'), 6: ('m', 'n', 'o'), 7: ('p', 'q', 'r', 's'),
- 8: ('t', 'u', 'v'), 9: ('w', 'x', 'y', 'z')}
+digit_options = {0: ' ',
+ 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')}
def nums_to_text(numbers):
letters = []
output_string = ""
for index in range(0, len(numbers)):
counter = 1
if numbers[index] == numbers[index - 1] and index > 0:
continue
while index in range(len(numbers) - 1) and numbers[index] == numbers[index + 1]:
index += 1
counter += 1
if numbers[index] in [2, 3, 4, 5, 6, 8]:
- if counter > 3:
- counter %= 3
+ if counter > 3: # When button is pressed more times then wanted
+ counter %= 3 # Get reminder when divided by 3
elif numbers[index] in [7, 9]:
if counter > 4:
counter %= 4
elif numbers[index] in [-1, 1]:
continue
+ elif numbers[index] == 0:
+ counter = 1 # In case of zero, always set counter to 1, because value of 0 is only one space
letters.append(digit_options[numbers[index]][counter - 1])
index += counter - 1
output_string = output_string.join(letters)
return output_string
letter_options = {'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)}
def text_to_nums(text):
output_list = []
text = map(str.lower, text)
- stack = [""] # To check if there are two or more consecutive equal letters
+ stack = [(" ", 0)] # To check if there are two or more consecutive equal letters or button numbers
for letter in text:
- if stack[-1] == letter:
- output_list.append((-1))
+ if stack[-1][0] == letter or stack[-1][1] == letter_options[letter][0]:
+ output_list.append(-1)
for i in range(0, letter_options[letter][1]):
output_list.append(letter_options[letter][0])
- stack.append(letter)
+ stack.append((letter, letter_options[letter][0]))
return output_list
angle_values = {1: 30, 2: 60, 3: 90, 4: 120, 5: 150, 6: 180, 7: 210, 8: 240, 9: 270, 0: 300}
def nums_to_angle(numbers):
sum_angles = 0
for number in numbers:
+ if number == -1:
+ continue
sum_angles += angle_values[number]
- if sum_angles > 360:
- while sum_angles > 360:
- sum_angles -= 360
+ while sum_angles > 360:
+ sum_angles -= 360
return sum_angles
def normalize_angle(angle):
- if angle > 360:
- while angle > 360:
- angle -= 360
- elif angle < 0:
- while angle < 0:
- angle += 360
+ while angle > 360:
+ angle -= 360
+ while angle < 0:
+ angle += 360
if angle % 30 != 0:
reminder = angle % 30
if reminder <= 15:
angle -= reminder
else:
angle += (30 - reminder)
return angle
number_values = {30: 1, 60: 2, 90: 3, 120: 4, 150: 5, 180: 6, 210: 7, 240: 8, 270: 9, 300: 0}
def angles_to_nums(angles):
list_output = []
- normalized = []
- for angle in angles:
- normalized.append(normalize_angle(angle))
+ normalized = map(normalize_angle, angles)
for normalized_angle in normalized:
if normalized_angle == 0 or normalized_angle > 300:
continue
list_output.append(number_values[normalized_angle])
return list_output
def is_phone_tastic(word):
- word_length = len(word)
+ if len(word) == 0:
+ return False
numbers = text_to_nums(word)
angles = nums_to_angle(numbers)
- if angles % word_length == 0:
- return True
+ return angles % len(word) == 0
- return False
+
+

Ивана обнови решението на 03.11.2022 02:45 (преди над 1 година)

digit_options = {0: ' ',
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')}
def nums_to_text(numbers):
letters = []
output_string = ""
for index in range(0, len(numbers)):
counter = 1
if numbers[index] == numbers[index - 1] and index > 0:
continue
while index in range(len(numbers) - 1) and numbers[index] == numbers[index + 1]:
index += 1
counter += 1
if numbers[index] in [2, 3, 4, 5, 6, 8]:
if counter > 3: # When button is pressed more times then wanted
counter %= 3 # Get reminder when divided by 3
elif numbers[index] in [7, 9]:
if counter > 4:
counter %= 4
elif numbers[index] in [-1, 1]:
continue
elif numbers[index] == 0:
counter = 1 # In case of zero, always set counter to 1, because value of 0 is only one space
letters.append(digit_options[numbers[index]][counter - 1])
index += counter - 1
output_string = output_string.join(letters)
return output_string
letter_options = {'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)}
def text_to_nums(text):
output_list = []
text = map(str.lower, text)
- stack = [(" ", 0)] # To check if there are two or more consecutive equal letters or button numbers
+ stack = [(' ', 0)] # To check if there are two or more consecutive equal letters or button numbers
for letter in text:
+ if letter == ' ':
+ stack.append((' ', 0))
+ output_list.append(0)
+ continue
if stack[-1][0] == letter or stack[-1][1] == letter_options[letter][0]:
output_list.append(-1)
for i in range(0, letter_options[letter][1]):
output_list.append(letter_options[letter][0])
stack.append((letter, letter_options[letter][0]))
return output_list
angle_values = {1: 30, 2: 60, 3: 90, 4: 120, 5: 150, 6: 180, 7: 210, 8: 240, 9: 270, 0: 300}
def nums_to_angle(numbers):
sum_angles = 0
for number in numbers:
if number == -1:
continue
sum_angles += angle_values[number]
- while sum_angles > 360:
+ while sum_angles >= 360:
sum_angles -= 360
return sum_angles
def normalize_angle(angle):
while angle > 360:
angle -= 360
while angle < 0:
angle += 360
if angle % 30 != 0:
reminder = angle % 30
if reminder <= 15:
angle -= reminder
else:
angle += (30 - reminder)
return angle
number_values = {30: 1, 60: 2, 90: 3, 120: 4, 150: 5, 180: 6, 210: 7, 240: 8, 270: 9, 300: 0}
def angles_to_nums(angles):
list_output = []
normalized = map(normalize_angle, angles)
for normalized_angle in normalized:
if normalized_angle == 0 or normalized_angle > 300:
continue
list_output.append(number_values[normalized_angle])
return list_output
def is_phone_tastic(word):
if len(word) == 0:
return False
numbers = text_to_nums(word)
angles = nums_to_angle(numbers)
return angles % len(word) == 0
+
+