Решение на Телефонна любов от Йоанна Кръстева

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

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

Резултати

  • 9 точки от тестове
  • 0 бонус точки
  • 9 точки общо
  • 34 успешни тест(а)
  • 3 неуспешни тест(а)

Код

decoder = {
"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": " "
}
overlap_tracker = {
0: 1,
2: 3,
3: 3,
4: 3,
5: 3,
6: 3,
7: 4,
8: 3,
9: 4
}
angles = {
1: 30,
2: 60,
3: 90,
4: 120,
5: 150,
6: 180,
7: 210,
8: 240,
9: 270,
0: 300
}
def count_duplicates(encoded_numbers):
duplicates = []
if not encoded_numbers:
return duplicates
running_count = 1
for i in range(len(encoded_numbers) - 1):
if encoded_numbers[i] == encoded_numbers[i + 1]:
running_count += 1
else:
duplicates.append(running_count)
running_count = 1
duplicates.append(running_count)
return duplicates
def nums_to_text(nums):
duplicates_counter = count_duplicates(nums)
decoded_letters = []
letter = ""
nums_index = 0
for counter in duplicates_counter:
for _ in range(counter):
if nums[nums_index] != -1:
letter += str(nums[nums_index])
nums_index += 1
if len(letter) != 0:
decoded_letters.append(letter)
letter = ""
answer_message = ""
old_message = ""
for message in decoded_letters:
old_message = message
if len(message) > 3:
first_number = int(message[0])
end_index = len(message) % overlap_tracker[first_number]
if end_index == 0:
if overlap_tracker[first_number] == 3:
end_index = 3
elif overlap_tracker[first_number] == 4:
end_index = 4
elif overlap_tracker[first_number] == 1:
end_index = 1
message = message[0:end_index]
if message in decoder and message[0] != '0':
answer_message += decoder[message]
elif message[0] == '0':
zeros = len(old_message)
answer_message += ' ' * zeros
return answer_message
def text_to_nums(text):
text = text.upper()
split_into_chars = [character for character in text]
decoded_into_numbers = []
for char in split_into_chars:
for number, letter in decoder.items():
if letter == char:
split_letter_into_numbers = [num for num in number]
decoded_into_numbers.extend(split_letter_into_numbers)
decoded_into_numbers.append(-1)
for idx, decoded_number in enumerate(decoded_into_numbers):
if decoded_number == -1 and idx != len(decoded_into_numbers) - 1:
if decoded_into_numbers[idx - 1] != decoded_into_numbers[idx + 1]:
decoded_into_numbers.pop(idx)
idx -= 1
elif decoded_number == -1 and idx == len(decoded_into_numbers) - 1:
decoded_into_numbers.pop()
return list(map(int, decoded_into_numbers))
def closest_angle(number):
whole_part = int(number / 30)
down = 30 * whole_part
if number * 30 > 0:
up = 30 * (whole_part + 1)
else:
up = 30 * (whole_part - 1)
if abs(number - down) <= abs(number - up):
return int(down)
else:
return int(up)
def normalise_angle(angle):
if angle != 0 and angle != 330:
if angle < 0:
angle = angle + 360
elif angle > 359:
angle = angle - 360
return angle
def nums_to_angle(nums):
sum_of_angles = 0
for number in nums:
if number in angles:
sum_of_angles += angles[number]
normalised = normalise_angle(sum_of_angles)
return normalised
def angles_to_nums(angles_):
phone_number = []
for angle_ in angles_:
normalised = normalise_angle(angle_)
normalised_rounded = closest_angle(normalised)
if normalised_rounded != 0 and normalised_rounded != 330:
for number, degrees in angles.items():
if degrees == normalised_rounded:
phone_number.append(number)
return phone_number
def is_phone_tastic(word):
letters = len(word)
if letters == 0:
return False
translated_numbers = text_to_nums(word)
summarised_angles = nums_to_angle(list(map(int, translated_numbers)))
normalised_sum_angles = normalise_angle(summarised_angles)
return normalised_sum_angles % letters == 0

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

......FF..........F..................
======================================================================
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_random_mixed_case (test.TestNumsToAngles)
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: 1950 != 150

----------------------------------------------------------------------
Ran 37 tests in 0.359s

FAILED (failures=3)

История (7 версии и 12 коментара)

Йоанна обнови решението на 02.11.2022 03:32 (преди над 1 година)

+
+decoder = {
+ "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": " "
+}
+
+overlap_tracker = {
+ 2: 3,
+ 3: 3,
+ 4: 3,
+ 5: 3,
+ 6: 3,
+ 7: 4,
+ 8: 3,
+ 9: 4
+}
+
+angles = {
+ 1: 30,
+ 2: 60,
+ 3: 90,
+ 4: 120,
+ 5: 150,
+ 6: 180,
+ 7: 210,
+ 8: 240,
+ 9: 270,
+ 0: 300
+}
+
+
+def count_duplicates(encoded_numbers):
+ duplicates = []
+ if not encoded_numbers:
+ return duplicates
+ running_count = 1
+ for i in range(len(encoded_numbers) - 1):
+ if encoded_numbers[i] == encoded_numbers[i + 1]:
+ running_count += 1
+ else:
+ duplicates.append(running_count)
+ running_count = 1
+ duplicates.append(running_count)
+ return duplicates
+
+
+def nums_to_text(nums):
+ duplicates_counter = count_duplicates(nums)
+ decoded_letters = []
+ letter = ""
+ k = 0
+ for counter in duplicates_counter:
+ for i in range(counter):
+ letter += str(nums[k])
+ k += 1
+ decoded_letters.append(letter)
+ letter = ""
+
+ answer_message = ""
+ for message in decoded_letters:
+ if len(message) > 3:
+ first_number = int(message[0])
+ end_index = len(message) % overlap_tracker[first_number]
+ if end_index == 0:
+ if overlap_tracker[first_number] == 3:
+ end_index = 3
+ else:
+ end_index = 4
+ message = message[0:end_index]
+ if message in decoder and message[0] != '0':
+ answer_message += decoder[message]
+ elif message[0] == '0':
+ zeros = len(message)
+ answer_message += ' ' * zeros
+
+ return answer_message
+
+
+def text_to_nums(text):
+ text = text.upper()
+ split_into_chars = [character for character in text]
+ decoded_into_numbers = []
+ for char in split_into_chars:
+ for number, letter in decoder.items():
+ if letter == char:
+ split_letter_into_numbers = [num for num in number]
+ decoded_into_numbers.extend(split_letter_into_numbers)
+ decoded_into_numbers.append(-1)
+ for idx, decoded_number in enumerate(decoded_into_numbers):
+ if decoded_number == -1 and idx != len(decoded_into_numbers) - 1:
+ if decoded_into_numbers[idx - 1] != decoded_into_numbers[idx + 1]:
+ decoded_into_numbers.pop(idx)
+ idx -= 1
+ elif decoded_number == -1 and idx == len(decoded_into_numbers) - 1:
+ decoded_into_numbers.pop()
+
+ return list(map(int, decoded_into_numbers))
+
+
+def round_to_multiple(number):
+ return 30 * round(number / 30)
+
+
+def normalise_angle(angle):
+ if angle != 0 and angle != 330:
+ if angle < 0:
+ angle = angle + 360
+ elif angle > 359:
+ angle = angle - 360
+ return angle
+
+
+def nums_to_angle(nums):
+ sum_of_angles = 0
+ for number in nums:
+ if number in angles:
+ sum_of_angles += angles[number]
+ normalised = normalise_angle(sum_of_angles)
+ if normalised != 0 and normalised != 330:
+ return normalised
+
+
+def angles_to_nums(angles_):
+ phone_number = []
+ for angle_ in angles_:
+ rounded = round_to_multiple(angle_)
+ normalised = normalise_angle(rounded)
+ if normalised != 0 and normalised != 330:
+ for number, degrees in angles.items():
+ if degrees == normalised:
+ phone_number.append(number)
+ return phone_number
+
+
+def is_phone_tastic(word):
+ letters = len(word)
+ translated_numbers = text_to_nums(word)
+ summarised_angles = nums_to_angle(list(map(int, translated_numbers)))
+ normalised_sum_angles = normalise_angle(summarised_angles)
+ if normalised_sum_angles % letters == 0:
+ return True
+ else:
+ return False
+

Йоанна обнови решението на 02.11.2022 13:40 (преди над 1 година)

decoder = {
"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": " "
}
overlap_tracker = {
2: 3,
3: 3,
4: 3,
5: 3,
6: 3,
7: 4,
8: 3,
9: 4
}
angles = {
1: 30,
2: 60,
3: 90,
4: 120,
5: 150,
6: 180,
7: 210,
8: 240,
9: 270,
0: 300
}
def count_duplicates(encoded_numbers):
duplicates = []
if not encoded_numbers:
return duplicates
running_count = 1
for i in range(len(encoded_numbers) - 1):
if encoded_numbers[i] == encoded_numbers[i + 1]:
running_count += 1
else:
duplicates.append(running_count)
running_count = 1
duplicates.append(running_count)
return duplicates
def nums_to_text(nums):
duplicates_counter = count_duplicates(nums)
decoded_letters = []
letter = ""
k = 0
for counter in duplicates_counter:
for i in range(counter):
letter += str(nums[k])
k += 1
decoded_letters.append(letter)
letter = ""
answer_message = ""
for message in decoded_letters:
if len(message) > 3:
first_number = int(message[0])
end_index = len(message) % overlap_tracker[first_number]
if end_index == 0:
if overlap_tracker[first_number] == 3:
end_index = 3
else:
end_index = 4
message = message[0:end_index]
if message in decoder and message[0] != '0':
answer_message += decoder[message]
elif message[0] == '0':
zeros = len(message)
answer_message += ' ' * zeros
return answer_message
def text_to_nums(text):
text = text.upper()
split_into_chars = [character for character in text]
decoded_into_numbers = []
for char in split_into_chars:
for number, letter in decoder.items():
if letter == char:
split_letter_into_numbers = [num for num in number]
decoded_into_numbers.extend(split_letter_into_numbers)
decoded_into_numbers.append(-1)
for idx, decoded_number in enumerate(decoded_into_numbers):
if decoded_number == -1 and idx != len(decoded_into_numbers) - 1:
if decoded_into_numbers[idx - 1] != decoded_into_numbers[idx + 1]:
decoded_into_numbers.pop(idx)
idx -= 1
elif decoded_number == -1 and idx == len(decoded_into_numbers) - 1:
decoded_into_numbers.pop()
return list(map(int, decoded_into_numbers))
+def closest_number(number):
+ q = int(number / 30)
+ n1 = 30 * q
+ if number * 30 > 0:
+ n2 = 30 * (q+1)
+ else:
+ n2 = 30 * (q - 1)
+ if abs(number - n1) <= abs(number - n2):
+ return int(n1)
+ else:
+ return int(n2)
-def round_to_multiple(number):
- return 30 * round(number / 30)
-
def normalise_angle(angle):
if angle != 0 and angle != 330:
if angle < 0:
angle = angle + 360
elif angle > 359:
angle = angle - 360
return angle
def nums_to_angle(nums):
sum_of_angles = 0
for number in nums:
if number in angles:
sum_of_angles += angles[number]
normalised = normalise_angle(sum_of_angles)
if normalised != 0 and normalised != 330:
return normalised
def angles_to_nums(angles_):
phone_number = []
for angle_ in angles_:
- rounded = round_to_multiple(angle_)
+ rounded = closest_number(angle_)
normalised = normalise_angle(rounded)
if normalised != 0 and normalised != 330:
for number, degrees in angles.items():
if degrees == normalised:
phone_number.append(number)
return phone_number
def is_phone_tastic(word):
letters = len(word)
translated_numbers = text_to_nums(word)
summarised_angles = nums_to_angle(list(map(int, translated_numbers)))
normalised_sum_angles = normalise_angle(summarised_angles)
if normalised_sum_angles % letters == 0:
return True
else:
return False
+

Йоанна обнови решението на 02.11.2022 13:44 (преди над 1 година)

decoder = {
"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": " "
}
overlap_tracker = {
2: 3,
3: 3,
4: 3,
5: 3,
6: 3,
7: 4,
8: 3,
9: 4
}
angles = {
1: 30,
2: 60,
3: 90,
4: 120,
5: 150,
6: 180,
7: 210,
8: 240,
9: 270,
0: 300
}
def count_duplicates(encoded_numbers):
duplicates = []
if not encoded_numbers:
return duplicates
running_count = 1
for i in range(len(encoded_numbers) - 1):
if encoded_numbers[i] == encoded_numbers[i + 1]:
running_count += 1
else:
duplicates.append(running_count)
running_count = 1
duplicates.append(running_count)
return duplicates
def nums_to_text(nums):
duplicates_counter = count_duplicates(nums)
decoded_letters = []
letter = ""
k = 0
for counter in duplicates_counter:
for i in range(counter):
letter += str(nums[k])
k += 1
decoded_letters.append(letter)
letter = ""
answer_message = ""
for message in decoded_letters:
if len(message) > 3:
first_number = int(message[0])
end_index = len(message) % overlap_tracker[first_number]
if end_index == 0:
if overlap_tracker[first_number] == 3:
end_index = 3
else:
end_index = 4
message = message[0:end_index]
if message in decoder and message[0] != '0':
answer_message += decoder[message]
elif message[0] == '0':
zeros = len(message)
answer_message += ' ' * zeros
return answer_message
def text_to_nums(text):
text = text.upper()
split_into_chars = [character for character in text]
decoded_into_numbers = []
for char in split_into_chars:
for number, letter in decoder.items():
if letter == char:
split_letter_into_numbers = [num for num in number]
decoded_into_numbers.extend(split_letter_into_numbers)
decoded_into_numbers.append(-1)
for idx, decoded_number in enumerate(decoded_into_numbers):
if decoded_number == -1 and idx != len(decoded_into_numbers) - 1:
if decoded_into_numbers[idx - 1] != decoded_into_numbers[idx + 1]:
decoded_into_numbers.pop(idx)
idx -= 1
elif decoded_number == -1 and idx == len(decoded_into_numbers) - 1:
decoded_into_numbers.pop()
return list(map(int, decoded_into_numbers))
-def closest_number(number):
- q = int(number / 30)
- n1 = 30 * q
+
+def closest_angle(number):
+ whole_part = int(number / 30)
+ down = 30 * whole_part
if number * 30 > 0:
- n2 = 30 * (q+1)
+ up = 30 * (whole_part + 1)
else:
- n2 = 30 * (q - 1)
- if abs(number - n1) <= abs(number - n2):
- return int(n1)
+ up = 30 * (whole_part - 1)
+ if abs(number - down) <= abs(number - up):
+ return int(down)
else:
- return int(n2)
+ return int(up)
def normalise_angle(angle):
if angle != 0 and angle != 330:
if angle < 0:
angle = angle + 360
elif angle > 359:
angle = angle - 360
return angle
def nums_to_angle(nums):
sum_of_angles = 0
for number in nums:
if number in angles:
sum_of_angles += angles[number]
normalised = normalise_angle(sum_of_angles)
if normalised != 0 and normalised != 330:
return normalised
def angles_to_nums(angles_):
phone_number = []
for angle_ in angles_:
- rounded = closest_number(angle_)
+ rounded = closest_angle(angle_)
normalised = normalise_angle(rounded)
if normalised != 0 and normalised != 330:
for number, degrees in angles.items():
if degrees == normalised:
phone_number.append(number)
return phone_number
def is_phone_tastic(word):
letters = len(word)
translated_numbers = text_to_nums(word)
summarised_angles = nums_to_angle(list(map(int, translated_numbers)))
normalised_sum_angles = normalise_angle(summarised_angles)
if normalised_sum_angles % letters == 0:
return True
else:
return False
-

Йоанна обнови решението на 02.11.2022 19:58 (преди над 1 година)

decoder = {
"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": " "
}
overlap_tracker = {
2: 3,
3: 3,
4: 3,
5: 3,
6: 3,
7: 4,
8: 3,
9: 4
}
angles = {
1: 30,
2: 60,
3: 90,
4: 120,
5: 150,
6: 180,
7: 210,
8: 240,
9: 270,
0: 300
}
def count_duplicates(encoded_numbers):
duplicates = []
if not encoded_numbers:
return duplicates
running_count = 1
for i in range(len(encoded_numbers) - 1):
if encoded_numbers[i] == encoded_numbers[i + 1]:
running_count += 1
else:
duplicates.append(running_count)
running_count = 1
duplicates.append(running_count)
return duplicates
def nums_to_text(nums):
duplicates_counter = count_duplicates(nums)
decoded_letters = []
letter = ""
k = 0
for counter in duplicates_counter:
for i in range(counter):
- letter += str(nums[k])
+ if nums[k] != -1:
+ letter += str(nums[k])
k += 1
- decoded_letters.append(letter)
- letter = ""
+ if len(letter) != 0:
+ decoded_letters.append(letter)
+ letter = ""
answer_message = ""
for message in decoded_letters:
if len(message) > 3:
first_number = int(message[0])
end_index = len(message) % overlap_tracker[first_number]
if end_index == 0:
if overlap_tracker[first_number] == 3:
end_index = 3
else:
end_index = 4
message = message[0:end_index]
if message in decoder and message[0] != '0':
answer_message += decoder[message]
elif message[0] == '0':
zeros = len(message)
answer_message += ' ' * zeros
return answer_message
def text_to_nums(text):
text = text.upper()
split_into_chars = [character for character in text]
decoded_into_numbers = []
for char in split_into_chars:
for number, letter in decoder.items():
if letter == char:
split_letter_into_numbers = [num for num in number]
decoded_into_numbers.extend(split_letter_into_numbers)
decoded_into_numbers.append(-1)
for idx, decoded_number in enumerate(decoded_into_numbers):
if decoded_number == -1 and idx != len(decoded_into_numbers) - 1:
if decoded_into_numbers[idx - 1] != decoded_into_numbers[idx + 1]:
decoded_into_numbers.pop(idx)
idx -= 1
elif decoded_number == -1 and idx == len(decoded_into_numbers) - 1:
decoded_into_numbers.pop()
return list(map(int, decoded_into_numbers))
def closest_angle(number):
whole_part = int(number / 30)
down = 30 * whole_part
if number * 30 > 0:
up = 30 * (whole_part + 1)
else:
up = 30 * (whole_part - 1)
if abs(number - down) <= abs(number - up):
return int(down)
else:
return int(up)
def normalise_angle(angle):
if angle != 0 and angle != 330:
if angle < 0:
angle = angle + 360
elif angle > 359:
angle = angle - 360
return angle
def nums_to_angle(nums):
sum_of_angles = 0
for number in nums:
if number in angles:
sum_of_angles += angles[number]
normalised = normalise_angle(sum_of_angles)
if normalised != 0 and normalised != 330:
return normalised
def angles_to_nums(angles_):
phone_number = []
for angle_ in angles_:
- rounded = closest_angle(angle_)
- normalised = normalise_angle(rounded)
- if normalised != 0 and normalised != 330:
+ normalised = normalise_angle(angle_)
+ normalised_rounded = closest_angle(normalised)
+ if normalised_rounded != 0 and normalised_rounded != 330:
for number, degrees in angles.items():
- if degrees == normalised:
+ if degrees == normalised_rounded:
phone_number.append(number)
return phone_number
def is_phone_tastic(word):
letters = len(word)
translated_numbers = text_to_nums(word)
summarised_angles = nums_to_angle(list(map(int, translated_numbers)))
normalised_sum_angles = normalise_angle(summarised_angles)
if normalised_sum_angles % letters == 0:
return True
else:
return False
+

Йоанна обнови решението на 02.11.2022 21:19 (преди над 1 година)

decoder = {
"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": " "
}
overlap_tracker = {
2: 3,
3: 3,
4: 3,
5: 3,
6: 3,
7: 4,
8: 3,
9: 4
}
angles = {
1: 30,
2: 60,
3: 90,
4: 120,
5: 150,
6: 180,
7: 210,
8: 240,
9: 270,
0: 300
}
def count_duplicates(encoded_numbers):
duplicates = []
if not encoded_numbers:
return duplicates
running_count = 1
for i in range(len(encoded_numbers) - 1):
if encoded_numbers[i] == encoded_numbers[i + 1]:
running_count += 1
else:
duplicates.append(running_count)
running_count = 1
duplicates.append(running_count)
return duplicates
def nums_to_text(nums):
duplicates_counter = count_duplicates(nums)
decoded_letters = []
letter = ""
k = 0
for counter in duplicates_counter:
for i in range(counter):
if nums[k] != -1:
letter += str(nums[k])
k += 1
if len(letter) != 0:
decoded_letters.append(letter)
letter = ""
answer_message = ""
for message in decoded_letters:
if len(message) > 3:
first_number = int(message[0])
end_index = len(message) % overlap_tracker[first_number]
if end_index == 0:
if overlap_tracker[first_number] == 3:
end_index = 3
else:
end_index = 4
message = message[0:end_index]
if message in decoder and message[0] != '0':
answer_message += decoder[message]
elif message[0] == '0':
zeros = len(message)
answer_message += ' ' * zeros
return answer_message
def text_to_nums(text):
text = text.upper()
split_into_chars = [character for character in text]
decoded_into_numbers = []
for char in split_into_chars:
for number, letter in decoder.items():
if letter == char:
split_letter_into_numbers = [num for num in number]
decoded_into_numbers.extend(split_letter_into_numbers)
decoded_into_numbers.append(-1)
for idx, decoded_number in enumerate(decoded_into_numbers):
if decoded_number == -1 and idx != len(decoded_into_numbers) - 1:
if decoded_into_numbers[idx - 1] != decoded_into_numbers[idx + 1]:
decoded_into_numbers.pop(idx)
idx -= 1
elif decoded_number == -1 and idx == len(decoded_into_numbers) - 1:
decoded_into_numbers.pop()
return list(map(int, decoded_into_numbers))
def closest_angle(number):
whole_part = int(number / 30)
down = 30 * whole_part
if number * 30 > 0:
up = 30 * (whole_part + 1)
else:
up = 30 * (whole_part - 1)
if abs(number - down) <= abs(number - up):
return int(down)
else:
return int(up)
def normalise_angle(angle):
if angle != 0 and angle != 330:
if angle < 0:
angle = angle + 360
elif angle > 359:
angle = angle - 360
return angle
def nums_to_angle(nums):
sum_of_angles = 0
for number in nums:
if number in angles:
sum_of_angles += angles[number]
normalised = normalise_angle(sum_of_angles)
- if normalised != 0 and normalised != 330:
- return normalised
+ return normalised
def angles_to_nums(angles_):
phone_number = []
for angle_ in angles_:
normalised = normalise_angle(angle_)
normalised_rounded = closest_angle(normalised)
if normalised_rounded != 0 and normalised_rounded != 330:
for number, degrees in angles.items():
if degrees == normalised_rounded:
phone_number.append(number)
return phone_number
def is_phone_tastic(word):
letters = len(word)
+ if letters == 0:
+ return False
translated_numbers = text_to_nums(word)
summarised_angles = nums_to_angle(list(map(int, translated_numbers)))
normalised_sum_angles = normalise_angle(summarised_angles)
if normalised_sum_angles % letters == 0:
return True
else:
return False
-

Йоанна обнови решението на 03.11.2022 15:25 (преди над 1 година)

decoder = {
"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": " "
}
overlap_tracker = {
2: 3,
3: 3,
4: 3,
5: 3,
6: 3,
7: 4,
8: 3,
9: 4
}
angles = {
1: 30,
2: 60,
3: 90,
4: 120,
5: 150,
6: 180,
7: 210,
8: 240,
9: 270,
0: 300
}
def count_duplicates(encoded_numbers):
duplicates = []
if not encoded_numbers:
return duplicates
running_count = 1
for i in range(len(encoded_numbers) - 1):
if encoded_numbers[i] == encoded_numbers[i + 1]:
running_count += 1
else:
duplicates.append(running_count)
running_count = 1
duplicates.append(running_count)
return duplicates
def nums_to_text(nums):
duplicates_counter = count_duplicates(nums)
decoded_letters = []
letter = ""
- k = 0
+ nums_index = 0
for counter in duplicates_counter:
- for i in range(counter):
- if nums[k] != -1:
- letter += str(nums[k])
- k += 1
+ for _ in range(counter):
+ if nums[nums_index] != -1:
+ letter += str(nums[nums_index])
+ nums_index += 1
if len(letter) != 0:
decoded_letters.append(letter)
letter = ""
answer_message = ""
for message in decoded_letters:
if len(message) > 3:
first_number = int(message[0])
end_index = len(message) % overlap_tracker[first_number]
if end_index == 0:
if overlap_tracker[first_number] == 3:
end_index = 3
else:
end_index = 4
message = message[0:end_index]
if message in decoder and message[0] != '0':
answer_message += decoder[message]
elif message[0] == '0':
zeros = len(message)
answer_message += ' ' * zeros
return answer_message
def text_to_nums(text):
text = text.upper()
split_into_chars = [character for character in text]
decoded_into_numbers = []
for char in split_into_chars:
for number, letter in decoder.items():
if letter == char:
split_letter_into_numbers = [num for num in number]
decoded_into_numbers.extend(split_letter_into_numbers)
decoded_into_numbers.append(-1)
for idx, decoded_number in enumerate(decoded_into_numbers):
if decoded_number == -1 and idx != len(decoded_into_numbers) - 1:
if decoded_into_numbers[idx - 1] != decoded_into_numbers[idx + 1]:
decoded_into_numbers.pop(idx)
idx -= 1
elif decoded_number == -1 and idx == len(decoded_into_numbers) - 1:
decoded_into_numbers.pop()
return list(map(int, decoded_into_numbers))
def closest_angle(number):
whole_part = int(number / 30)
down = 30 * whole_part
if number * 30 > 0:
up = 30 * (whole_part + 1)
else:
up = 30 * (whole_part - 1)
if abs(number - down) <= abs(number - up):
return int(down)
else:
return int(up)
def normalise_angle(angle):
if angle != 0 and angle != 330:
if angle < 0:
angle = angle + 360
elif angle > 359:
angle = angle - 360
return angle
def nums_to_angle(nums):
sum_of_angles = 0
for number in nums:
if number in angles:
sum_of_angles += angles[number]
normalised = normalise_angle(sum_of_angles)
return normalised
def angles_to_nums(angles_):
phone_number = []
for angle_ in angles_:
normalised = normalise_angle(angle_)
normalised_rounded = closest_angle(normalised)
if normalised_rounded != 0 and normalised_rounded != 330:
for number, degrees in angles.items():
if degrees == normalised_rounded:
phone_number.append(number)
return phone_number
def is_phone_tastic(word):
letters = len(word)
if letters == 0:
return False
translated_numbers = text_to_nums(word)
summarised_angles = nums_to_angle(list(map(int, translated_numbers)))
normalised_sum_angles = normalise_angle(summarised_angles)
- if normalised_sum_angles % letters == 0:
- return True
- else:
- return False
+ return normalised_sum_angles % letters == 0

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

decoder = {
"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": " "
}
overlap_tracker = {
+ 0: 1,
2: 3,
3: 3,
4: 3,
5: 3,
6: 3,
7: 4,
8: 3,
9: 4
}
angles = {
1: 30,
2: 60,
3: 90,
4: 120,
5: 150,
6: 180,
7: 210,
8: 240,
9: 270,
0: 300
}
def count_duplicates(encoded_numbers):
duplicates = []
if not encoded_numbers:
return duplicates
running_count = 1
for i in range(len(encoded_numbers) - 1):
if encoded_numbers[i] == encoded_numbers[i + 1]:
running_count += 1
else:
duplicates.append(running_count)
running_count = 1
duplicates.append(running_count)
return duplicates
def nums_to_text(nums):
duplicates_counter = count_duplicates(nums)
decoded_letters = []
letter = ""
nums_index = 0
for counter in duplicates_counter:
for _ in range(counter):
if nums[nums_index] != -1:
letter += str(nums[nums_index])
nums_index += 1
if len(letter) != 0:
decoded_letters.append(letter)
letter = ""
answer_message = ""
+ old_message = ""
for message in decoded_letters:
+ old_message = message
if len(message) > 3:
first_number = int(message[0])
end_index = len(message) % overlap_tracker[first_number]
if end_index == 0:
if overlap_tracker[first_number] == 3:
end_index = 3
- else:
+ elif overlap_tracker[first_number] == 4:
end_index = 4
+ elif overlap_tracker[first_number] == 1:
+ end_index = 1
message = message[0:end_index]
if message in decoder and message[0] != '0':
answer_message += decoder[message]
elif message[0] == '0':
- zeros = len(message)
+ zeros = len(old_message)
answer_message += ' ' * zeros
-
return answer_message
def text_to_nums(text):
text = text.upper()
split_into_chars = [character for character in text]
decoded_into_numbers = []
for char in split_into_chars:
for number, letter in decoder.items():
if letter == char:
split_letter_into_numbers = [num for num in number]
decoded_into_numbers.extend(split_letter_into_numbers)
decoded_into_numbers.append(-1)
for idx, decoded_number in enumerate(decoded_into_numbers):
if decoded_number == -1 and idx != len(decoded_into_numbers) - 1:
if decoded_into_numbers[idx - 1] != decoded_into_numbers[idx + 1]:
decoded_into_numbers.pop(idx)
idx -= 1
elif decoded_number == -1 and idx == len(decoded_into_numbers) - 1:
decoded_into_numbers.pop()
return list(map(int, decoded_into_numbers))
def closest_angle(number):
whole_part = int(number / 30)
down = 30 * whole_part
if number * 30 > 0:
up = 30 * (whole_part + 1)
else:
up = 30 * (whole_part - 1)
if abs(number - down) <= abs(number - up):
return int(down)
else:
return int(up)
def normalise_angle(angle):
if angle != 0 and angle != 330:
if angle < 0:
angle = angle + 360
elif angle > 359:
angle = angle - 360
return angle
def nums_to_angle(nums):
sum_of_angles = 0
for number in nums:
if number in angles:
sum_of_angles += angles[number]
normalised = normalise_angle(sum_of_angles)
return normalised
def angles_to_nums(angles_):
phone_number = []
for angle_ in angles_:
normalised = normalise_angle(angle_)
normalised_rounded = closest_angle(normalised)
if normalised_rounded != 0 and normalised_rounded != 330:
for number, degrees in angles.items():
if degrees == normalised_rounded:
phone_number.append(number)
return phone_number
def is_phone_tastic(word):
letters = len(word)
if letters == 0:
return False
translated_numbers = text_to_nums(word)
summarised_angles = nums_to_angle(list(map(int, translated_numbers)))
normalised_sum_angles = normalise_angle(summarised_angles)
return normalised_sum_angles % letters == 0