Решение на Телефонна любов от Георги

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

Към профила на Георги

Резултати

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

Код

DIGITS_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: (' '),
}
# Construct a flipped DIGITS_TO_LETTERS dict
LETTER_TO_DIGITS = {}
for digit, letters in DIGITS_TO_LETTERS.items():
for i, letter in enumerate(letters):
LETTER_TO_DIGITS[letter] = [digit] * (i + 1)
DIGIT_TO_ANGLE = {}
ANGLE_TO_DIGIT = {}
for i, digit in enumerate(list(range(1, 10)) + [0]):
angle = (i + 1) * 30
DIGIT_TO_ANGLE[digit] = angle
ANGLE_TO_DIGIT[angle] = digit
def normalize_and_round_angle(angle):
normalized = angle % 360
round_ = 30 * round((normalized - 0.1) / 30)
return round_ % 360 # Ensuring 360 is still converted to 0
def nums_to_text(nums):
"""Get text from list of numbers based on phone keyboads mapping."""
break_num = -1
def get_text_from_buffer(key_sequence):
"""Get a letter from arbitrary number of digits associated with it."""
try:
letters = DIGITS_TO_LETTERS[key_sequence[0]]
except KeyError:
# Any sequence of letters not in the dict keys is simply ignored
return ''
index = (len(key_sequence) - 1) % len(letters)
return letters[index]
result = []
buffer = []
last_num = break_num
for num in nums + [break_num]:
if num == last_num or last_num == break_num:
buffer.append(num)
else:
clean_buffer = list(filter(lambda x: x != break_num, buffer))
result.append(get_text_from_buffer(clean_buffer))
buffer = [num]
last_num = num
return ''.join(result)
def text_to_nums(text):
result = []
for char in text:
try:
digits = LETTER_TO_DIGITS[char.lower()]
if result and digits and result[-1] == digits[0]:
result.append(-1)
result.extend(digits)
except KeyError:
pass # It's fine. Just ignore unexpected elements.
return result
def nums_to_angle(nums):
result = 0
for num in nums:
try:
result += DIGIT_TO_ANGLE[num]
except KeyError:
pass # It's fine. Just ignore unexpected elements.
return normalize_and_round_angle(result)
def angles_to_nums(angles):
result = []
for angle in angles:
normalized = normalize_and_round_angle(angle)
try:
result.append(ANGLE_TO_DIGIT[normalized])
except KeyError:
pass # It's fine. Just ignore unexpected elements.
return result
def is_phone_tastic(word):
if not word:
return False
nums = text_to_nums(word)
angle = nums_to_angle(nums)
return angle % len(word) == 0

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

.....................................
----------------------------------------------------------------------
Ran 37 tests in 0.337s

OK

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

Георги обнови решението на 28.10.2022 15:36 (преди над 1 година)

+DIGITS_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: (' '),
+}
+
+# Construct a flipped DIGITS_TO_LETTERS dict
+LETTER_TO_DIGITS = {}
+for digit, letters in DIGITS_TO_LETTERS.items():
+ for i, letter in enumerate(letters):
+ LETTER_TO_DIGITS[letter] = [digit] * (i + 1)
+
+DIGIT_TO_ANGLE = {}
+ANGLE_TO_DIGIT = {}
+for i, digit in enumerate(list(range(1, 10)) + [0]):
+ angle = (i + 1) * 30
+ DIGIT_TO_ANGLE[digit] = angle
+ ANGLE_TO_DIGIT[angle] = digit
+
+def normalize_and_round_angle(angle):
+ normalized = angle % 360
+ round_ = 30 * round((normalized - 0.1) / 30)
+ return round_ % 360 # Ensuring 360 is still converted to 0
+
+def nums_to_text(nums):
+ """Get text from list of numbers based on phone keyboads mapping."""
+ break_num = -1
+
+ def get_text_from_buffer(key_sequence):
+ """Get a letter from arbitrary number of digits associated with it."""
+ try:
+ letters = DIGITS_TO_LETTERS[key_sequence[0]]
+ except KeyError:
+ # Any sequence of letters not in the dict keys is simply ignored
+ return ''
+ index = (len(key_sequence) - 1) % len(letters)
+ return letters[index]
+
+ result = []
+ buffer = []
+ last_num = break_num
+ for num in nums + [break_num]:
+ if num == last_num or last_num == break_num:
+ buffer.append(num)
+ else:
+ clean_buffer = list(filter(lambda x: x != break_num, buffer))
+ result.append(get_text_from_buffer(clean_buffer))
+ buffer = [num]
+ last_num = num
+ return ''.join(result)
+
+def text_to_nums(text):
+ result = []
+ for char in text:
+ try:
+ digits = LETTER_TO_DIGITS[char.lower()]
+ if result and digits and result[-1] == digits[0]:
+ result.append(-1)
+ result.extend(digits)
+ except KeyError:
+ pass # It's fine. Just ignore unexpected elements.
+ return result
+
+def nums_to_angle(nums):
+ result = 0
+ for num in nums:
+ try:
+ result += DIGIT_TO_ANGLE[num]
+ except KeyError:
+ pass # It's fine. Just ignore unexpected elements.
+ return normalize_and_round_angle(result)
+
+def angles_to_nums(angles):
+ result = []
+ for angle in angles:
+ normalized = normalize_and_round_angle(angle)
+ try:
+ result.append(ANGLE_TO_DIGIT[normalized])
+ except KeyError:
+ pass # It's fine. Just ignore unexpected elements.
+ return result
+
+def is_phone_tastic(word):
+ if not word:
+ return False
+ nums = text_to_nums(word)
+ angle = nums_to_angle(nums)
+ return angle % len(word) == 0
+
+#print(nums_to_text([4, 4, -1, 3, 3, 5, 5, 5, -1, -1, -1, 5, 5, 5, 6, 6, 6]))
+#print(nums_to_text([1, 1, 7, 9, 9, 9, 8, 4, 4, 6, 6, 6, -1, 6, 6]))
+#print(text_to_nums('asl pls'))
+#print(nums_to_angle([1, 5, 9]))
+#print(angles_to_nums([16, 14, 90, -120]))
+#print(is_phone_tastic('GOD'))

Георги обнови решението на 28.10.2022 15:36 (преди над 1 година)

DIGITS_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: (' '),
}
# Construct a flipped DIGITS_TO_LETTERS dict
LETTER_TO_DIGITS = {}
for digit, letters in DIGITS_TO_LETTERS.items():
for i, letter in enumerate(letters):
LETTER_TO_DIGITS[letter] = [digit] * (i + 1)
DIGIT_TO_ANGLE = {}
ANGLE_TO_DIGIT = {}
for i, digit in enumerate(list(range(1, 10)) + [0]):
angle = (i + 1) * 30
DIGIT_TO_ANGLE[digit] = angle
ANGLE_TO_DIGIT[angle] = digit
def normalize_and_round_angle(angle):
normalized = angle % 360
round_ = 30 * round((normalized - 0.1) / 30)
return round_ % 360 # Ensuring 360 is still converted to 0
def nums_to_text(nums):
"""Get text from list of numbers based on phone keyboads mapping."""
break_num = -1
def get_text_from_buffer(key_sequence):
"""Get a letter from arbitrary number of digits associated with it."""
try:
letters = DIGITS_TO_LETTERS[key_sequence[0]]
except KeyError:
# Any sequence of letters not in the dict keys is simply ignored
return ''
index = (len(key_sequence) - 1) % len(letters)
return letters[index]
result = []
buffer = []
last_num = break_num
for num in nums + [break_num]:
if num == last_num or last_num == break_num:
buffer.append(num)
else:
clean_buffer = list(filter(lambda x: x != break_num, buffer))
result.append(get_text_from_buffer(clean_buffer))
buffer = [num]
last_num = num
return ''.join(result)
def text_to_nums(text):
result = []
for char in text:
try:
digits = LETTER_TO_DIGITS[char.lower()]
if result and digits and result[-1] == digits[0]:
result.append(-1)
result.extend(digits)
except KeyError:
pass # It's fine. Just ignore unexpected elements.
return result
def nums_to_angle(nums):
result = 0
for num in nums:
try:
result += DIGIT_TO_ANGLE[num]
except KeyError:
pass # It's fine. Just ignore unexpected elements.
return normalize_and_round_angle(result)
def angles_to_nums(angles):
result = []
for angle in angles:
normalized = normalize_and_round_angle(angle)
try:
result.append(ANGLE_TO_DIGIT[normalized])
except KeyError:
pass # It's fine. Just ignore unexpected elements.
return result
def is_phone_tastic(word):
if not word:
return False
nums = text_to_nums(word)
angle = nums_to_angle(nums)
return angle % len(word) == 0
-
-#print(nums_to_text([4, 4, -1, 3, 3, 5, 5, 5, -1, -1, -1, 5, 5, 5, 6, 6, 6]))
-#print(nums_to_text([1, 1, 7, 9, 9, 9, 8, 4, 4, 6, 6, 6, -1, 6, 6]))
-#print(text_to_nums('asl pls'))
-#print(nums_to_angle([1, 5, 9]))
-#print(angles_to_nums([16, 14, 90, -120]))
-#print(is_phone_tastic('GOD'))