Решение на Телефонна любов от Димитър Аврамов

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

Към профила на Димитър Аврамов

Резултати

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

Код

def nums_to_text(nums):
numbers_letters = {
0: ' ', 2: 'ABC', 3: 'DEF', 4: 'GHI',
5: 'JKL', 6: 'MNO', 7: 'PQRS', 8: 'TUV', 9: 'WXYZ'
}
nums_count = len(nums)
counter = 0
result = ''
while counter < nums_count:
current_num = nums[counter]
if current_num == -1 or current_num == 1:
counter += 1
continue
current_sequence_len = 1
temp_counter = counter + 1
while temp_counter < nums_count:
if nums[temp_counter] == current_num:
current_sequence_len += 1
temp_counter += 1
else:
break
current_letter_index = (current_sequence_len % len(numbers_letters[current_num])) - 1
letter = numbers_letters[current_num][current_letter_index]
result += letter
counter = temp_counter
return result
def text_to_nums(text):
def find_number_count(letter):
letters_numbers = {
' ': 0, 'ABC': 2, 'DEF': 3, 'GHI': 4, 'JKL': 5,
'MNO': 6, 'PQRS': 7, 'TUV': 8, 'WXYZ': 9
}
digit_value = ()
for key in letters_numbers:
if letter in key:
digit_value = letters_numbers[key], key.index(letter) + 1
return digit_value
result = []
text = text.upper()
previous_num = -1
for current_letter in text:
number_count = find_number_count(current_letter)
number = number_count[0]
count = number_count[1]
if previous_num == number:
result.append(-1)
for i in range(count):
result.append(number)
previous_num = number
return result
def nums_to_angle(nums):
result = 0
for num in nums:
if num == 0:
result += 10 * 30
else:
result += num * 30
result %= 360
return result
def angles_to_nums(angles):
def normalize(not_normalized):

Това спокойно можеш да извадиш от тази функция. Далеч-по четимо ще е, а и ще можеш да използваш функцията и извън текущата. Освен това, не е нужно при есяко изивкане на angles_to_nums да се дефинира нова normalize.

lower_bound = int((not_normalized / 30)) * 30
upper_bound = int((not_normalized / 30 + 1)) * 30
normalized = not_normalized
diff_with_lower_bound = not_normalized - lower_bound
diff_with_upper_bound = upper_bound - not_normalized
if diff_with_lower_bound < diff_with_upper_bound:
normalized = lower_bound
elif diff_with_lower_bound > diff_with_upper_bound:
normalized = upper_bound
else:
normalized = lower_bound
return normalized
result = []
for angle in angles:
while angle < 0:
angle += 360
angle %= 360
normalized_angle = angle
if angle % 30 != 0:
normalized_angle = normalize(angle)
if normalized_angle == 330 or normalized_angle == 0 or normalized_angle == 360:
continue
if normalized_angle == 300:
result.append(0)
else:
result.append(int(normalized_angle/30))
return result
def is_phone_tastic(word):
if len(word) == 0:
return False
nums = text_to_nums(word)
angle = nums_to_angle(nums)
return angle % len(word) == 0

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

.....................................
----------------------------------------------------------------------
Ran 37 tests in 0.331s

OK

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

Димитър обнови решението на 02.11.2022 19:52 (преди над 1 година)

+def nums_to_text(nums):
+ numbers_letters = {
+ 0: ' ', 2: 'ABC', 3: 'DEF', 4: 'GHI',
+ 5: 'JKL', 6: 'MNO', 7: 'PQRS', 8: 'TUV', 9: 'WXYZ'
+ }
+
+ nums_count = len(nums)
+ counter = 0
+ result = ''
+
+ while counter < nums_count:
+
+ current_num = nums[counter]
+
+ if current_num == -1 or current_num == 1:
+ counter += 1
+ continue
+
+ current_sequence_len = 1
+ temp_counter = counter + 1
+
+ while temp_counter < nums_count:
+ if nums[temp_counter] == current_num:
+ current_sequence_len += 1
+ temp_counter += 1
+ else:
+ break
+
+ current_letter_index = (current_sequence_len % len(numbers_letters[current_num])) - 1
+ letter = numbers_letters[current_num][current_letter_index]
+ result += letter
+ counter = temp_counter
+
+ return result
+
+
+def text_to_nums(text):
+ def find_number_count(letter):
+ letters_numbers = {
+ ' ': 0, 'ABC': 2, 'DEF': 3, 'GHI': 4, 'JKL': 5,
+ 'MNO': 6, 'PQRS': 7, 'TUV': 8, 'WXYZ': 9
+ }
+
+ digit_value = ()
+
+ for key in letters_numbers:
+ if letter in key:
+ digit_value = letters_numbers[key], key.index(letter) + 1
+
+ return digit_value
+
+ result = []
+ text = text.upper()
+ previous_num = -1
+
+ for current_letter in text:
+ number_count = find_number_count(current_letter)
+ number = number_count[0]
+ count = number_count[1]
+
+ if previous_num == number:
+ result.append(-1)
+
+ for i in range(count):
+ result.append(number)
+
+ previous_num = number
+
+ return result
+
+
+def nums_to_angle(nums):
+ result = 0
+
+ for num in nums:
+ if num == 0:
+ result += 10 * 30
+ else:
+ result += num * 30
+
+ result %= 360
+
+ return result
+
+
+def angles_to_nums(angles):
+ def normalize(not_normalized):
+ lower_bound = int((not_normalized / 30)) * 30
+ upper_bound = int((not_normalized / 30 + 1)) * 30
+
+ normalized = not_normalized
+
+ diff_with_lower_bound = not_normalized - lower_bound
+ diff_with_upper_bound = upper_bound - not_normalized
+
+ if diff_with_lower_bound < diff_with_upper_bound:
+ normalized = lower_bound
+ elif diff_with_lower_bound > diff_with_upper_bound:
+ normalized = upper_bound
+ else:
+ normalized = lower_bound
+
+ return normalized
+
+ result = []
+ for angle in angles:
+
+ while angle < 0:
+ angle += 360
+
+ angle %= 360
+
+ normalized_angle = angle
+ if angle % 30 != 0:
+ normalized_angle = normalize(angle)
+
+ if normalized_angle == 330 or normalized_angle == 0 or normalized_angle == 360:
+ continue
+
+ if normalized_angle == 300:
+ result.append(0)
+ else:
+ result.append(int(normalized_angle/30))
+
+ return result
+
+
+def is_phone_tastic(word):
+ nums = text_to_nums(word)
+ angle = nums_to_angle(nums)
+
+ return angle % len(word) == 0

Димитър обнови решението на 02.11.2022 22:37 (преди над 1 година)

def nums_to_text(nums):
numbers_letters = {
0: ' ', 2: 'ABC', 3: 'DEF', 4: 'GHI',
5: 'JKL', 6: 'MNO', 7: 'PQRS', 8: 'TUV', 9: 'WXYZ'
}
nums_count = len(nums)
counter = 0
result = ''
while counter < nums_count:
current_num = nums[counter]
if current_num == -1 or current_num == 1:
counter += 1
continue
current_sequence_len = 1
temp_counter = counter + 1
while temp_counter < nums_count:
if nums[temp_counter] == current_num:
current_sequence_len += 1
temp_counter += 1
else:
break
current_letter_index = (current_sequence_len % len(numbers_letters[current_num])) - 1
letter = numbers_letters[current_num][current_letter_index]
result += letter
counter = temp_counter
return result
def text_to_nums(text):
def find_number_count(letter):
letters_numbers = {
' ': 0, 'ABC': 2, 'DEF': 3, 'GHI': 4, 'JKL': 5,
'MNO': 6, 'PQRS': 7, 'TUV': 8, 'WXYZ': 9
}
digit_value = ()
for key in letters_numbers:
if letter in key:
digit_value = letters_numbers[key], key.index(letter) + 1
return digit_value
result = []
text = text.upper()
previous_num = -1
for current_letter in text:
number_count = find_number_count(current_letter)
number = number_count[0]
count = number_count[1]
if previous_num == number:
result.append(-1)
for i in range(count):
result.append(number)
previous_num = number
return result
def nums_to_angle(nums):
result = 0
for num in nums:
if num == 0:
result += 10 * 30
else:
result += num * 30
result %= 360
return result
def angles_to_nums(angles):
def normalize(not_normalized):

Това спокойно можеш да извадиш от тази функция. Далеч-по четимо ще е, а и ще можеш да използваш функцията и извън текущата. Освен това, не е нужно при есяко изивкане на angles_to_nums да се дефинира нова normalize.

lower_bound = int((not_normalized / 30)) * 30
upper_bound = int((not_normalized / 30 + 1)) * 30
normalized = not_normalized
diff_with_lower_bound = not_normalized - lower_bound
diff_with_upper_bound = upper_bound - not_normalized
if diff_with_lower_bound < diff_with_upper_bound:
normalized = lower_bound
elif diff_with_lower_bound > diff_with_upper_bound:
normalized = upper_bound
else:
normalized = lower_bound
return normalized
result = []
for angle in angles:
while angle < 0:
angle += 360
angle %= 360
normalized_angle = angle
if angle % 30 != 0:
normalized_angle = normalize(angle)
if normalized_angle == 330 or normalized_angle == 0 or normalized_angle == 360:
continue
if normalized_angle == 300:
result.append(0)
else:
result.append(int(normalized_angle/30))
return result
def is_phone_tastic(word):
+ if len(word) == 0:
+ return False
+
nums = text_to_nums(word)
angle = nums_to_angle(nums)
return angle % len(word) == 0
+
+