Решение на Телефонна любов от Евтим Иванов

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

Към профила на Евтим Иванов

Резултати

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

Код

def get_letter_from_number_and_counter(number, counter):
start_of_alphabet_in_integer = ord('a') - 1
normalized_counter = 0
if number <= 6 or number == 8:
normalized_counter = counter % 3
if normalized_counter == 0:
normalized_counter = 3
elif number in (7, 9):
normalized_counter = counter % 4
if normalized_counter == 0:
normalized_counter = 4
normalized_number = 0
normalized_number = number - 2
position_in_alphabet = 0
if number >= 2 and number <= 7:
position_in_alphabet = normalized_number*3 + normalized_counter
return chr(start_of_alphabet_in_integer + position_in_alphabet)
elif number == 8:
position_in_alphabet = normalized_number*3 + normalized_counter + 1 # +1 because of the 4 letters in '7'
return chr(start_of_alphabet_in_integer + position_in_alphabet)
elif number == 9:
position_in_alphabet = normalized_number*3 + normalized_counter + 1 # +1 because of the 4 letters in '7'
return chr(start_of_alphabet_in_integer + position_in_alphabet)
elif number == 0:
return " "
else:
return ""
def nums_to_text(nums):
result = ''
nums_length = len(nums)
repetead_numbers_counter = 0
if nums_length > 0:
repetead_numbers_counter = 1
current_number = nums[0]
for number in range(1, nums_length):
if current_number == nums[number]:
repetead_numbers_counter += 1
elif current_number != -1:
result += get_letter_from_number_and_counter(current_number, repetead_numbers_counter)
current_number = nums[number]
repetead_numbers_counter = 1
else:
current_number = nums[number]
repetead_numbers_counter = 1
if current_number != -1:
result += get_letter_from_number_and_counter(current_number, repetead_numbers_counter)
return result.upper()
def get_number_and_times(position_of_letter_in_alphabet):
number_to_add = 2 # starting from 2, because of the telephone 'A'
number_of_times = 0
LETTERS_TO_SIXTH_NUMBER = 15
LETTERS_TO_SEVENTH_NUMBER = 19
LETTERS_TO_EIGHTTH_NUMBER = 22
LETTERS_TO_NINTH_NUMBER = 26
if position_of_letter_in_alphabet < LETTERS_TO_SIXTH_NUMBER:
number_of_times = position_of_letter_in_alphabet % 3 + 1
number_to_add += position_of_letter_in_alphabet // 3
elif position_of_letter_in_alphabet < LETTERS_TO_SEVENTH_NUMBER:
number_of_times = (position_of_letter_in_alphabet - LETTERS_TO_SIXTH_NUMBER) % 4 + 1
number_to_add += 5
elif position_of_letter_in_alphabet < LETTERS_TO_EIGHTTH_NUMBER:
number_of_times = (position_of_letter_in_alphabet - LETTERS_TO_SEVENTH_NUMBER) % 3 + 1
number_to_add += 6
elif position_of_letter_in_alphabet < LETTERS_TO_NINTH_NUMBER:
number_of_times = (position_of_letter_in_alphabet - LETTERS_TO_EIGHTTH_NUMBER) % 4 + 1
number_to_add += 7
return number_to_add, number_of_times
def get_list_from_letter(letter):
result = []
if letter == ' ':
result.append(0)
return result
position_of_letter_in_alphabet = ord(letter) - ord('a')
number_to_add, number_of_times = get_number_and_times(position_of_letter_in_alphabet)
result.extend([number_to_add] * number_of_times)
return result
def text_to_nums(text):
result = []
text_length = len(text)
text_to_lower = text.lower()
if text_length > 0:
previous_letter = text_to_lower[0]
result += get_list_from_letter(previous_letter)
for position_of_letter in range(1,text_length):
if text_to_lower[position_of_letter] == previous_letter:
result.append(-1)
else:
previous_letter = text_to_lower[position_of_letter]
result += get_list_from_letter(text_to_lower[position_of_letter])
return result
def nums_to_angle(nums):
result = 0
for number in nums:
if number == 0:
result += 300
else:
result += number * 30
result %= 360
return result
def angles_to_nums(angles):
result = []
PI = 360
for angle in angles:
angle_after_checks = 0;
angle_after_checks = angle % 360
if angle_after_checks % 30 > 15:
normalized_angle = angle % PI + (angle % PI) % 30
else:
normalized_angle = angle % PI - (angle % PI) % 30
if normalized_angle == 300:
result.append(0)
elif normalized_angle < 300 and normalized_angle != 0:
number_to_append = normalized_angle//30
result.append(number_to_append)
return result
def is_phone_tastic(word):
word_to_nums = text_to_nums(word)
normalized_result = nums_to_angle(word_to_nums)
word_length = len(word)
return normalized_result % word_length == 0

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

.......F..E...................F..FF..
======================================================================
ERROR: test_empty_input (test.TestIsPhonetastic)
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
ZeroDivisionError: integer division or modulo by zero

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

First differing element 7:
9
0

Second list contains 1 additional elements.
First extra element 8:
9

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


======================================================================
FAIL: test_all_chars (test.TestTextToNums)
Test for correct mapping of all chars.
----------------------------------------------------------------------
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, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4,[121 chars]9, 0] != [2, -1, 2, 2, -1, 2, 2, 2, 3, -1, 3, 3, -1, 3[193 chars]9, 0]

First differing element 1:
2
-1

Second list contains 18 additional elements.
First extra element 57:
-1

  [2,
+  -1,
   2,
   2,
+  -1,
   2,
   2,
   2,
   3,
+  -1,
   3,
   3,
+  -1,
   3,
   3,
   3,
   4,
+  -1,
   4,
   4,
+  -1,
   4,
   4,
   4,
   5,
+  -1,
   5,
   5,
+  -1,
   5,
   5,
   5,
   6,
+  -1,
   6,
   6,
+  -1,
   6,
   6,
   6,
   7,
+  -1,
+  7,
+  7,
+  -1,
   7,
   7,
   7,
+  -1,
-  7,
-  7,
   7,
   7,
   7,
   7,
   8,
+  -1,
   8,
   8,
+  -1,
   8,
   8,
   8,
   9,
+  -1,
+  9,
+  9,
+  -1,
   9,
   9,
   9,
+  -1,
-  9,
-  9,
   9,
   9,
   9,
   9,
   0]

======================================================================
FAIL: test_mixed_casing (test.TestTextToNums)
Test for both lower and capital case.
----------------------------------------------------------------------
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, 2, 2, 3, -1, 3] != [2, -1, 2, 2, 3, -1, 3]

First differing element 1:
2
-1

Second list contains 1 additional elements.
First extra element 6:
3

- [2, 2, 2, 3, -1, 3]
+ [2, -1, 2, 2, 3, -1, 3]

======================================================================
FAIL: test_random_mixed_case (test.TestTextToNums)
Test for a random mixed case.
----------------------------------------------------------------------
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: [8, 8, 8, 2, 7, 7, 7, 7, 5, 5, 6, 6, 6, 0, -1, 0, -1, 0, 5, 2, 2, 2, 2, 8, 2] not found in ([8, 8, 8, 2, 7, 7, 7, 7, 5, 5, 6, 6, 6, 0, -1, 0, -1, 0, 5, 2, -1, 2, 2, -1, 2, 8, 2], [8, 8, 8, 2, 7, 7, 7, 7, 5, 5, 6, 6, 6, 0, 0, 0, 5, 2, -1, 2, 2, -1, 2, 8, 2])

----------------------------------------------------------------------
Ran 37 tests in 0.358s

FAILED (failures=4, errors=1)

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

Евтим обнови решението на 31.10.2022 19:23 (преди над 1 година)

+def get_letter_from_number_and_counter(number, counter):
+ start_of_alphabet_in_integer = 96
+ normalized_counter = 0
+ if number <= 6 or number == 8:
+ normalized_counter = counter % 3
+
+ if normalized_counter == 0:
+ normalized_counter = 3
+ elif number == 9 or number == 7:
+ normalized_counter = counter % 4
+
+ if normalized_counter == 0:
+ normalized_counter = 4
+
+ normalized_number = 0
+ normalized_number = number - 2
+ position_in_alphabet = 0
+ if number >= 2 and number <= 7:
+ position_in_alphabet = normalized_number*3 + normalized_counter
+ return chr(start_of_alphabet_in_integer + position_in_alphabet)
+ elif number == 8:
+ position_in_alphabet = normalized_number*3 + normalized_counter + 1 # +1 because of the 4 letters in '7'
+ return chr(start_of_alphabet_in_integer + position_in_alphabet)
+ elif number == 9:
+ position_in_alphabet = normalized_number*3 + normalized_counter + 2 # +2 because of the 4 letters in '7'
+ return chr(start_of_alphabet_in_integer + position_in_alphabet)
+ elif number == 0:
+ return " "
+ else:
+ return ""
+
+def nums_to_text(nums):
+ result = ''
+ nums_length = len(nums)
+ repetead_numbers_counter = 0
+
+ if nums_length > 0:
+ repetead_numbers_counter = 1
+ current_number = nums[0]
+
+ for number in range(1, nums_length):
+ if current_number == nums[number]:
+ repetead_numbers_counter += 1
+ elif current_number != -1:
+ result += get_letter_from_number_and_counter(current_number,repetead_numbers_counter)
+ current_number = nums[number]
+ repetead_numbers_counter = 1
+ else:
+ current_number = nums[number]
+ repetead_numbers_counter = 1
+ if current_number != -1:
+ result += get_letter_from_number_and_counter(current_number,repetead_numbers_counter)
+ return result.upper()
+
+def get_number_and_times(position_of_letter_in_alphabet):
+ number_to_add = 2 #starting from 2, because of the telephone 'A'
+ number_of_times = 0
+ if position_of_letter_in_alphabet < 15:

Иаползваш доста литерали. Или използвай ord(), за да ги вземеш динамично, или ги деифнирай като константи. Иначе са просто магически стойности в кода ти и не е ясно откъде идват.

+ number_of_times = position_of_letter_in_alphabet % 3 + 1
+ number_to_add += position_of_letter_in_alphabet // 3
+ elif position_of_letter_in_alphabet < 19:
+ number_of_times = (position_of_letter_in_alphabet - 15) % 4 + 1
+ number_to_add += 5
+ elif position_of_letter_in_alphabet < 22:
+ number_of_times = (position_of_letter_in_alphabet - 19) % 3 + 1
+ number_to_add += 6
+ elif position_of_letter_in_alphabet < 26:
+ number_of_times = (position_of_letter_in_alphabet - 22) % 4 + 1
+ number_to_add += 7
+ return number_to_add, number_of_times
+
+def get_list_from_letter(letter):
+ result = []
+ normalized_letter = letter.lower()
+
+ if normalized_letter == ' ':
+ result.append(0)
+ return result
+
+ position_of_letter_in_alphabet = ord(normalized_letter) - ord('a')
+ number_to_add, number_of_times = get_number_and_times(position_of_letter_in_alphabet)
+
+
+ for times in range(0,number_of_times):
+ result.append(number_to_add)
+
+ return result
+
+def text_to_nums(text):
+
+ result = []
+ text_length = len(text)
+
+ if text_length > 0:
+ previous_letter = text[0]
+ result += get_list_from_letter(previous_letter)
+
+ for position_of_letter in range(1,text_length):
+ if text[position_of_letter] == previous_letter:
+ result.append(-1)
+ else:
+ previous_letter = text[position_of_letter]
+
+ result += get_list_from_letter(text[position_of_letter])
+ return result
+
+def nums_to_angle(nums):
+ result = 0
+ for number in nums:
+ if number == 0:
+ result += 300
+ else:
+ result += number*30
+ result %= 360
+ return result
+
+def angles_to_nums(angles):
+ result = []
+ PI = 360
+ for angle in angles:
+ angle_after_checks = 0;
+ angle_after_checks = angle %360
+
+ if angle < 0 :
+ angle_after_checks+= PI
+
+
+ if angle_after_checks % 30 > 15:
+ normalized_angle = angle%PI + (angle%PI)%30
+
+ else:
+ normalized_angle = angle%PI - (angle%PI)%30
+
+ if normalized_angle == 300:
+ result.append(normalized_angle)
+ elif normalized_angle <= 330 and normalized_angle != 0:
+ number_to_append = normalized_angle//30
+ result.append(number_to_append)
+ return result
+
+def is_phone_tastic(word):
+ word_to_nums = text_to_nums(word)
+ normalized_result = nums_to_angle(word_to_nums)
+
+ word_length = len(word)
+
+ if normalized_result % word_length == 0:
+ return True
+
+ return False
+

Евтим обнови решението на 01.11.2022 19:40 (преди над 1 година)

def get_letter_from_number_and_counter(number, counter):
- start_of_alphabet_in_integer = 96
+ start_of_alphabet_in_integer = ord('a') - 1
normalized_counter = 0
if number <= 6 or number == 8:
normalized_counter = counter % 3
if normalized_counter == 0:
normalized_counter = 3
- elif number == 9 or number == 7:
+ elif number in (7, 9):
normalized_counter = counter % 4
if normalized_counter == 0:
normalized_counter = 4
normalized_number = 0
normalized_number = number - 2
position_in_alphabet = 0
if number >= 2 and number <= 7:
position_in_alphabet = normalized_number*3 + normalized_counter
return chr(start_of_alphabet_in_integer + position_in_alphabet)
elif number == 8:
position_in_alphabet = normalized_number*3 + normalized_counter + 1 # +1 because of the 4 letters in '7'
return chr(start_of_alphabet_in_integer + position_in_alphabet)
elif number == 9:
- position_in_alphabet = normalized_number*3 + normalized_counter + 2 # +2 because of the 4 letters in '7'
+ position_in_alphabet = normalized_number*3 + normalized_counter + 1 # +1 because of the 4 letters in '7'
return chr(start_of_alphabet_in_integer + position_in_alphabet)
elif number == 0:
return " "
else:
return ""
def nums_to_text(nums):
result = ''
nums_length = len(nums)
repetead_numbers_counter = 0
if nums_length > 0:
repetead_numbers_counter = 1
current_number = nums[0]
for number in range(1, nums_length):
if current_number == nums[number]:
repetead_numbers_counter += 1
elif current_number != -1:
- result += get_letter_from_number_and_counter(current_number,repetead_numbers_counter)
+ result += get_letter_from_number_and_counter(current_number, repetead_numbers_counter)
current_number = nums[number]
repetead_numbers_counter = 1
else:
current_number = nums[number]
repetead_numbers_counter = 1
if current_number != -1:
- result += get_letter_from_number_and_counter(current_number,repetead_numbers_counter)
+ result += get_letter_from_number_and_counter(current_number, repetead_numbers_counter)
return result.upper()
def get_number_and_times(position_of_letter_in_alphabet):
- number_to_add = 2 #starting from 2, because of the telephone 'A'
+ number_to_add = 2 # starting from 2, because of the telephone 'A'
number_of_times = 0
- if position_of_letter_in_alphabet < 15:
+ LETTERS_TO_SIXTH_NUMBER = 15
+ LETTERS_TO_SEVENTH_NUMBER = 19
+ LETTERS_TO_EIGHTTH_NUMBER = 22
+ LETTERS_TO_NINTH_NUMBER = 26
+
+ if position_of_letter_in_alphabet < LETTERS_TO_SIXTH_NUMBER:
number_of_times = position_of_letter_in_alphabet % 3 + 1
number_to_add += position_of_letter_in_alphabet // 3
- elif position_of_letter_in_alphabet < 19:
- number_of_times = (position_of_letter_in_alphabet - 15) % 4 + 1
+ elif position_of_letter_in_alphabet < LETTERS_TO_SEVENTH_NUMBER:
+ number_of_times = (position_of_letter_in_alphabet - LETTERS_TO_SIXTH_NUMBER) % 4 + 1
number_to_add += 5
- elif position_of_letter_in_alphabet < 22:
- number_of_times = (position_of_letter_in_alphabet - 19) % 3 + 1
+ elif position_of_letter_in_alphabet < LETTERS_TO_EIGHTTH_NUMBER:
+ number_of_times = (position_of_letter_in_alphabet - LETTERS_TO_SEVENTH_NUMBER) % 3 + 1
number_to_add += 6
- elif position_of_letter_in_alphabet < 26:
- number_of_times = (position_of_letter_in_alphabet - 22) % 4 + 1
+ elif position_of_letter_in_alphabet < LETTERS_TO_NINTH_NUMBER:
+ number_of_times = (position_of_letter_in_alphabet - LETTERS_TO_EIGHTTH_NUMBER) % 4 + 1
number_to_add += 7
return number_to_add, number_of_times
def get_list_from_letter(letter):
result = []
- normalized_letter = letter.lower()
-
- if normalized_letter == ' ':
+
+ if letter == ' ':
result.append(0)
return result
- position_of_letter_in_alphabet = ord(normalized_letter) - ord('a')
+ position_of_letter_in_alphabet = ord(letter) - ord('a')
number_to_add, number_of_times = get_number_and_times(position_of_letter_in_alphabet)
-
-
- for times in range(0,number_of_times):
- result.append(number_to_add)
-
+ result.extend([number_to_add] * number_of_times)
+
return result
def text_to_nums(text):
result = []
text_length = len(text)
+ text_to_lower = text.lower()
+
if text_length > 0:
- previous_letter = text[0]
+ previous_letter = text_to_lower[0]
result += get_list_from_letter(previous_letter)
for position_of_letter in range(1,text_length):
- if text[position_of_letter] == previous_letter:
+ if text_to_lower[position_of_letter] == previous_letter:
result.append(-1)
else:
- previous_letter = text[position_of_letter]
+ previous_letter = text_to_lower[position_of_letter]
- result += get_list_from_letter(text[position_of_letter])
+ result += get_list_from_letter(text_to_lower[position_of_letter])
return result
def nums_to_angle(nums):
result = 0
for number in nums:
if number == 0:
result += 300
else:
- result += number*30
+ result += number * 30
result %= 360
return result
def angles_to_nums(angles):
result = []
PI = 360
for angle in angles:
angle_after_checks = 0;
- angle_after_checks = angle %360
+ angle_after_checks = angle % 360
- if angle < 0 :
- angle_after_checks+= PI
-
-
if angle_after_checks % 30 > 15:
- normalized_angle = angle%PI + (angle%PI)%30
+ normalized_angle = angle % PI + (angle % PI) % 30
else:
- normalized_angle = angle%PI - (angle%PI)%30
+ normalized_angle = angle % PI - (angle % PI) % 30
if normalized_angle == 300:
- result.append(normalized_angle)
- elif normalized_angle <= 330 and normalized_angle != 0:
+ result.append(0)
+ elif normalized_angle < 300 and normalized_angle != 0:
number_to_append = normalized_angle//30
result.append(number_to_append)
return result
def is_phone_tastic(word):
word_to_nums = text_to_nums(word)
normalized_result = nums_to_angle(word_to_nums)
word_length = len(word)
- if normalized_result % word_length == 0:
- return True
+ return normalized_result % word_length == 0
-
- return False
-