Решение на Телефонна любов от Айше Джинджи

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

Към профила на Айше Джинджи

Резултати

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

Код

SEQUENCE_TO_LETTER = {
'1': '',
'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': ' '
}
DIGIT_TO_ANGLE = {
1: 30,
2: 60,
3: 90,
4: 120,
5: 150,
6: 180,
7: 210,
8: 240,
9: 270,
0: 300
}
LETTER_TO_SEQUENCE = dict([(value, key) for key, value in SEQUENCE_TO_LETTER.items()])
ANGLES_TO_DIGITS = dict([(value, key) for key, value in DIGIT_TO_ANGLE.items()])
BASE_ANGLE = 30
MAX_ANGLE = 300
def is_valid_sequence(sequence, number):
return (sequence <= 3 and number not in [7, 9]) or (sequence <= 4 and number in [7, 9])
def get_bound(number):
if number in [7, 9]:
return 4
return 3
def normalize(angle):
return angle % 360
def round_degrees(angle):
rounded_angle = BASE_ANGLE * round(angle / BASE_ANGLE)
if rounded_angle > MAX_ANGLE:
return 0
return rounded_angle
def nums_to_text(nums):
previous_number = nums[0]
count = 0
number_seq = []
result = ''
for num in nums:
if num == previous_number:
count += 1
else:
number_seq.append((previous_number, count))
count = 1
previous_number = num
number_seq.append((previous_number, count))
for num, repetition in number_seq:
if num == 0:
result += ' ' * repetition
elif num == -1 or num == 1:
continue
elif is_valid_sequence(repetition, num):
result += SEQUENCE_TO_LETTER[str(num) * repetition]
else:
bound = get_bound(num)
repetition = repetition % bound or get_bound(num)
result += SEQUENCE_TO_LETTER[str(num) * repetition]
return result
def text_to_nums(text):
text = text.upper()
prev_digit = 0
result = []
for letter in text:
digit = int(LETTER_TO_SEQUENCE[letter][0])
if digit == prev_digit and digit != 0:
result.append(-1)
sequence = LETTER_TO_SEQUENCE[letter]
for seq_letter in sequence:
result.append(int(seq_letter))
prev_digit = digit
return result
def nums_to_angle(nums):
result = 0
for num in nums:
if num < 0:
continue
angle = DIGIT_TO_ANGLE[num]
result += angle
return normalize(result)
def angles_to_nums(angles):
numbers = []
for angle in angles:
normalized_angle = normalize(angle)
rounded_angle = round_degrees(normalized_angle)
if not rounded_angle:
continue
numbers.append(ANGLES_TO_DIGITS[rounded_angle])
return numbers
def is_phone_tastic(word):
if not word:
return False
digits = text_to_nums(word)
angle = normalize(nums_to_angle(digits))
return angle % len(word) == 0

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

.......FF.............E..............
======================================================================
ERROR: test_empty_input (test.TestNumsToText)
Test with empty 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
IndexError: list index out of range

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

First differing element 5:
2
1

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

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


======================================================================
FAIL: test_round_angle_direction (test.TestAnglesToNums)
Test with an angle requiring explicit rounding to floor.
----------------------------------------------------------------------
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] != [1]

First differing element 0:
2
1

- [2]
+ [1]

----------------------------------------------------------------------
Ran 37 tests in 0.333s

FAILED (failures=2, errors=1)

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

Айше обнови решението на 03.11.2022 01:39 (преди над 1 година)

+SEQUENCE_TO_LETTER = {
+ '1': '',
+ '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': ' '
+}
+
+DIGIT_TO_ANGLE = {
+ 1: 30,
+ 2: 60,
+ 3: 90,
+ 4: 120,
+ 5: 150,
+ 6: 180,
+ 7: 210,
+ 8: 240,
+ 9: 270,
+ 0: 300
+}
+
+LETTER_TO_SEQUENCE = dict([(value, key) for key, value in SEQUENCE_TO_LETTER.items()])
+ANGLES_TO_DIGITS = dict([(value, key) for key, value in DIGIT_TO_ANGLE.items()])
+BASE_ANGLE = 30
+MAX_ANGLE = 300
+
+def is_valid_sequence(sequence, number):
+ return (sequence <= 3 and number not in [7, 9]) or (sequence <= 4 and number in [7, 9])
+
+def get_bound(number):
+ if number in [7, 9]:
+ return 4
+ return 3
+
+def normalize(angle):
+ return angle % 360
+
+def round_degrees(angle):
+ rounded_angle = BASE_ANGLE * round(angle / BASE_ANGLE)
+ if rounded_angle > MAX_ANGLE:
+ return 0
+ return rounded_angle
+
+def nums_to_text(nums):
+ previous_number = nums[0]
+ count = 0
+ number_seq = []
+ result = ''
+
+ for num in nums:
+ if num == previous_number:
+ count += 1
+ else:
+ number_seq.append((previous_number, count))
+ count = 1
+ previous_number = num
+
+ number_seq.append((previous_number, count))
+
+ for num, repetition in number_seq:
+ if num == 0:
+ result += ' ' * repetition
+ elif num == -1 or num == 1:
+ continue
+ elif is_valid_sequence(repetition, num):
+ result += SEQUENCE_TO_LETTER[str(num) * repetition]
+ else:
+ bound = get_bound(num)
+ repetition = repetition % bound or get_bound(num)
+ result += SEQUENCE_TO_LETTER[str(num) * repetition]
+
+ return result
+
+def text_to_nums(text):
+ text = text.upper()
+ prev_digit = 0
+ result = []
+
+ for letter in text:
+ digit = int(LETTER_TO_SEQUENCE[letter][0])
+
+ if digit == prev_digit and digit != 0:
+ result.append(-1)
+
+ sequence = LETTER_TO_SEQUENCE[letter]
+ for seq_letter in sequence:
+ result.append(int(seq_letter))
+ prev_digit = digit
+
+ return result
+
+def nums_to_angle(nums):
+ result = 0
+ for num in nums:
+ if num < 0:
+ continue
+
+ angle = DIGIT_TO_ANGLE[num]
+ result += angle
+
+ return normalize(result)
+
+def angles_to_nums(angles):
+ numbers = []
+ for angle in angles:
+ normalized_angle = normalize(angle)
+ rounded_angle = round_degrees(normalized_angle)
+
+ if not rounded_angle:
+ continue
+
+ numbers.append(ANGLES_TO_DIGITS[rounded_angle])
+
+ return numbers
+
+def is_phone_tastic(word):
+ if not word:
+ return False
+
+ digits = text_to_nums(word)
+ angle = normalize(nums_to_angle(digits))
+
+ return angle % len(word) == 0