Решение на Телефонна любов от Дуйгу Хасан

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

Към профила на Дуйгу Хасан

Резултати

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

Код

def find_character(index, nums):
num_to_char = {2: "A", 3: "D", 4: "G", 5: "J", 6: "M", 7: "P", 8: "T", 9: "W"}
chars_in_button = 3
if nums[index] == 7 or num_to_char == 9:
chars_in_button = 4
curr_char = ord(num_to_char[nums[index]])
while index + 1 < len(nums) and nums[index] == nums[index + 1] and chars_in_button > 0:
index += 1
curr_char += 1
chars_in_button -= 1
return index, chr(curr_char)
def nums_to_text(nums):
message = ""
index = 0
while index < len(nums):
if nums[index] in range(2, 9):
index, curr_char = find_character(index, nums)
elif nums[index] == 0:
curr_char = " "
else:
curr_char = ""
index += 1
message += curr_char
return message
def num_from_letter(ascii_code):
index = 1
for ascii_range in [(65, 68), (68, 71), (71, 74), (74, 77), (77, 80), (80, 84), (84, 87), (87, 91)]:
index += 1
if ascii_code in range(*ascii_range):
return index, ascii_code - (ascii_range[0] - 1)
def text_to_nums(text):
text = text.upper()
nums = []
for char in text:
if ord(char) in range(65, 90):
num, frequency = num_from_letter(ord(char))
while frequency > 0:
nums.append(num)
frequency -= 1
else:
nums.append(0)
return nums
def nums_to_angle(nums):
angles = {1: 30, 2: 60, 3: 90, 4: 120, 5: 150, 6: 180, 7: 210, 8: 240, 9: 270, 0: 300}
result_angle = 0
for num in nums:
result_angle += angles[num]
return result_angle % 360
def round_up(angle):
if angle % 30 == 0:
return angle
else:
while angle % 30 != 0:
if angle % 30 >= 15:
angle += 1
else:
angle -= 1
return angle
def normalize(angle):
if angle in range(0, 360):
return angle
elif angle > 359:

преди да извикам тази функция извиквам друга функция, която ми round-up ва ъгъла. Така тази фунцкия не приема ъгли от вида 359, а приема 330 и тн, които са кратни на 30.В основната функция с иф игнорирам тези, които са извън рейнджа 30-300 ( разбирам условието така, че ако ъгълът, който се получава след нормализиране и закръгляне, е между 301 и 29 се игнорира.

return angle % 360
else:
angle = abs(angle) % 360
return 360 - angle
def angles_to_nums(angles):
angle_dict = {30: 1, 60: 2, 90: 3, 120: 4, 150: 5, 180: 6, 210: 7, 240: 8, 270: 9, 300: 0}
nums = []
for angle in angles:
angle = round_up(normalize(angle))
if angle in range(30, 301):
nums.append(angle_dict[angle])
return nums
def is_phone_tastic(word):
nums = text_to_nums(word)
angle = nums_to_angle(nums)
return angle % len(word) == 0

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

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

First differing element 2:
1
2

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

- [5, 1, 1, 2, 5, 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]

======================================================================
FAIL: test_all_chars (test.TestNumsToText)
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: 'abcdefghijklmnopqrstuv ' != 'abcdefghijklmnopqrstuvwxyz '
- abcdefghijklmnopqrstuv 
+ abcdefghijklmnopqrstuvwxyz 
?                       ++++


======================================================================
FAIL: test_overflow_input (test.TestNumsToText)
Test with oveflowing number of presses.
----------------------------------------------------------------------
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: '' != 'x'
+ x

======================================================================
FAIL: test_random_mixed_case (test.TestNumsToText)
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: 'fmi rumk' != 'fmi rulzzz'
- fmi rumk
+ fmi rulzzz


======================================================================
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,[112 chars]0, 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 21 additional elements.
First extra element 54:
-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,
-  0,
   0]

======================================================================
FAIL: test_complex_word (test.TestTextToNums)
Test with a complex word that requires -1.
----------------------------------------------------------------------
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: [4, 6, 6] != [4, 6, -1, 6]

First differing element 2:
6
-1

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

- [4, 6, 6]
+ [4, 6, -1, 6]
?        ++++


======================================================================
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, 3] != [2, -1, 2, 2, 3, -1, 3]

First differing element 1:
2
-1

Second list contains 2 additional elements.
First extra element 5:
-1

- [2, 2, 2, 3, 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, 0, 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.352s

FAILED (failures=9, errors=1)

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

Дуйгу обнови решението на 01.11.2022 15:39 (преди над 1 година)

+
+def find_character(index, nums):
+ num_to_char = {2: "A", 3: "D", 4: "G", 5: "J", 6: "M", 7: "P", 8: "T", 9: "W"}
+ chars_in_button = 3
+ if nums[index] == 7 or num_to_char == 9:
+ chars_in_button = 4
+ curr_char = ord(num_to_char[nums[index]])
+ while index + 1 < len(nums) and nums[index] == nums[index + 1] and chars_in_button > 0:
+ index += 1
+ curr_char += 1
+ chars_in_button -= 1
+ return index, chr(curr_char)
+
+
+def nums_to_text(nums):
+ message = ""
+ index = 0
+ while index < len(nums):
+ if nums[index] in range(2, 9):
+ index, curr_char = find_character(index, nums)
+ elif nums[index] == 0:
+ curr_char = " "
+ else:
+ curr_char = ""
+ index += 1
+ message += curr_char
+ return message
+
+
+def num_from_letter(letter):
+ if letter in range(65, 68):

Внимавай с многото if-elif-ове. А ако бяха 100?

Същото може да се направи и с един for, без да е неприятно за четене (ако трябва се оставя един коментар и сме готови):

for index, ascii_range in enumerate(((65, 68), (68, 81), ...), start=2):
        if letter in range(*ascii_range):
            return index, letter - ascii_range[0] + 1
+ return 2, (letter - 64)
+ elif letter in range(68, 71):
+ return 3, (letter - 67)
+ elif letter in range(71, 74):
+ return 4, (letter - 70)
+ elif letter in range(74, 77):
+ return 5, (letter - 73)
+ elif letter in range(77, 80):
+ return 6, (letter - 76)
+ elif letter in range(80, 84):
+ return 7, (letter - 79)
+ elif letter in range(84, 87):
+ return 8, (letter - 83)
+ elif letter in range(87, 91):
+ return 9, (letter - 86)
+
+
+def text_to_nums(text):
+ text = text.upper()
+ nums = []
+ for char in text:
+ if ord(char) in range(65, 90):
+ num, frequency = num_from_letter(ord(char))
+ while frequency > 0:
+ nums.append(num)
+ frequency -= 1
+ else:
+ nums.append(0)
+
+ return nums
+
+
+def nums_to_angle(nums):
+ angles = {1: 30, 2: 60, 3: 90, 4: 120, 5: 150, 6: 180, 7: 210, 8: 240, 9: 270, 0: 300}
+ result_angle = 0
+ for num in nums:
+ result_angle += angles[num]
+ return result_angle % 360
+
+
+def round_up(angle):
+ if angle % 30 == 0:
+ return angle
+ else:
+ while angle % 30 != 0:
+ if angle % 30 >= 15:
+ angle += 1
+ else:
+ angle -= 1
+ return angle
+
+
+def normalize(angle):
+ if angle in range(0, 360):
+ return angle
+ elif angle > 359:

преди да извикам тази функция извиквам друга функция, която ми round-up ва ъгъла. Така тази фунцкия не приема ъгли от вида 359, а приема 330 и тн, които са кратни на 30.В основната функция с иф игнорирам тези, които са извън рейнджа 30-300 ( разбирам условието така, че ако ъгълът, който се получава след нормализиране и закръгляне, е между 301 и 29 се игнорира.

+ return angle % 360
+ else:
+ angle = abs(angle) % 360
+ return 360 - angle
+
+
+def angles_to_nums(angles):
+ angle_dict = {30: 1, 60: 2, 90: 3, 120: 4, 150: 5, 180: 6, 210: 7, 240: 8, 270: 9, 300: 0}
+ nums = []
+ for angle in angles:
+ angle = round_up(normalize(angle))
+ if angle in range(30, 301):
+ nums.append(angle_dict[angle])
+ return nums
+
+
+def is_phone_tastic(word):
+ nums = text_to_nums(word)
+ angle = nums_to_angle(nums)
+ return angle % len(word) == 0
+

Дуйгу обнови решението на 03.11.2022 12:40 (преди над 1 година)

-
def find_character(index, nums):
num_to_char = {2: "A", 3: "D", 4: "G", 5: "J", 6: "M", 7: "P", 8: "T", 9: "W"}
chars_in_button = 3
if nums[index] == 7 or num_to_char == 9:
chars_in_button = 4
curr_char = ord(num_to_char[nums[index]])
while index + 1 < len(nums) and nums[index] == nums[index + 1] and chars_in_button > 0:
index += 1
curr_char += 1
chars_in_button -= 1
return index, chr(curr_char)
def nums_to_text(nums):
message = ""
index = 0
while index < len(nums):
if nums[index] in range(2, 9):
index, curr_char = find_character(index, nums)
elif nums[index] == 0:
curr_char = " "
else:
curr_char = ""
index += 1
message += curr_char
return message
-def num_from_letter(letter):
- if letter in range(65, 68):
- return 2, (letter - 64)
- elif letter in range(68, 71):
- return 3, (letter - 67)
- elif letter in range(71, 74):
- return 4, (letter - 70)
- elif letter in range(74, 77):
- return 5, (letter - 73)
- elif letter in range(77, 80):
- return 6, (letter - 76)
- elif letter in range(80, 84):
- return 7, (letter - 79)
- elif letter in range(84, 87):
- return 8, (letter - 83)
- elif letter in range(87, 91):
- return 9, (letter - 86)
+def num_from_letter(ascii_code):
+ index = 1
+ for ascii_range in [(65, 68), (68, 71), (71, 74), (74, 77), (77, 80), (80, 84), (84, 87), (87, 91)]:
+ index += 1
+ if ascii_code in range(*ascii_range):
+ return index, ascii_code - (ascii_range[0] - 1)
def text_to_nums(text):
text = text.upper()
nums = []
for char in text:
if ord(char) in range(65, 90):
num, frequency = num_from_letter(ord(char))
while frequency > 0:
nums.append(num)
frequency -= 1
else:
nums.append(0)
return nums
def nums_to_angle(nums):
angles = {1: 30, 2: 60, 3: 90, 4: 120, 5: 150, 6: 180, 7: 210, 8: 240, 9: 270, 0: 300}
result_angle = 0
for num in nums:
result_angle += angles[num]
return result_angle % 360
def round_up(angle):
if angle % 30 == 0:
return angle
else:
while angle % 30 != 0:
if angle % 30 >= 15:
angle += 1
else:
angle -= 1
return angle
def normalize(angle):
if angle in range(0, 360):
return angle
elif angle > 359:
return angle % 360
else:
angle = abs(angle) % 360
return 360 - angle
def angles_to_nums(angles):
angle_dict = {30: 1, 60: 2, 90: 3, 120: 4, 150: 5, 180: 6, 210: 7, 240: 8, 270: 9, 300: 0}
nums = []
for angle in angles:
angle = round_up(normalize(angle))
if angle in range(30, 301):
nums.append(angle_dict[angle])
return nums
def is_phone_tastic(word):
nums = text_to_nums(word)
angle = nums_to_angle(nums)
return angle % len(word) == 0
+