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

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

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

Резултати

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

Код

def nums_to_text(nums):
nums.append(1)
msg = ""
count = 0
previous = None
for elem in nums:
if previous == elem or previous == None:
count += 1
else:
if previous != -1:
mod3 = count % 3
mod4 = count % 4
match previous:
case 2:
match mod3:
case 1: msg += "a"
case 2: msg += "b"
case 0: msg += "c"
case 3:
match mod3:
case 1: msg += "d"
case 2: msg += "e"
case 0: msg += "f"
case 4:
match mod3:
case 1: msg += "g"
case 2: msg += "h"
case 0: msg += "i"
case 5:
match mod3:
case 1: msg += "j"
case 2: msg += "k"
case 0: msg += "l"
case 6:
match mod3:
case 1: msg += "m"
case 2: msg += "n"
case 0: msg += "o"
case 7:
match mod4:
case 1: msg += "p"
case 2: msg += "q"
case 3: msg += "r"
case 0: msg += "s"
case 8:
match mod3:
case 1: msg += "t"
case 2: msg += "u"
case 0: msg += "v"
case 9:
match mod4:
case 1: msg += "w"
case 2: msg += "x"
case 3: msg += "y"
case 0: msg += "z"
case 0:
msg += " "
count = 1
else:
count = 1
previous = elem
return msg
def text_to_nums(text):
button_matrix = [["a", "b", "c"], ["d", "e", "f"], ["g", "h", "i"], ["j", "k", "l"],
["m", "n", "o"], ["p", "q", "r", "s"], ["t", "u", "v"], ["z", "w", "x", "z"]]
nums = []
prev_button = None
lower_text = text.lower()
for elem in lower_text:
if elem != " ":
i = 2 # button digit
is_found = False
for button in button_matrix:
j = 1 # times the digit needs to be pressed
if not is_found:
for letter in button:
if letter == elem:
if prev_button == button:
nums.append(-1)
for times in range(j):
nums.append(i)
prev_button = button
is_found = True
break
j += 1
else:
break
i += 1
else:
nums.append(0)
return nums
def nums_to_angle(nums):
sum = 0
for number in nums:
if number >= 0 and number <= 9 or number < 0 and number >= -9: #cannot have a number thats not on the phone?
sum += number * 30
if sum > 359 or sum < -359:
sum =sum % 360
if (sum < 0):
sum += 360
return sum
pivot_angles = []
for x in range(0, 345, 15):
pivot_angles.append(x)
pivot_angles_size = len(pivot_angles)
def angles_to_nums(angles):
nums = []
for elem in angles:
#normalize
if elem > 359 or elem < -359:
elem =elem % 360
if (elem < 0):
elem += 360
#floor or ceil
i = 0
while i < pivot_angles_size - 1:
if elem >= pivot_angles[i] and elem <= pivot_angles[i + 1]:
if i % 2 == 0:
elem = pivot_angles[i]
else:
elem = pivot_angles[i + 1]
i += 1
#calculate number
if elem != 0 and elem < 330:
if elem == 300:
nums.append(0)
else:
nums.append(int(elem / 30))
return nums
def is_phone_tastic(word):
if word == "":
return False
division = nums_to_angle(text_to_nums(word)) / len(word)
return int(division) == division

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

.............F....F...........F....F.
======================================================================
FAIL: test_correct_mapping (test.TestNumsToAngles)
Test correct mapping for all numbers.
----------------------------------------------------------------------
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: 0 != 300

======================================================================
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: 90 != 150

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

First differing element 62:
9
-1

Second list contains 5 additional elements.
First extra element 70:
9

  [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,
   8,
   -1,
   8,
   8,
   -1,
   8,
   8,
   8,
   9,
+  -1,
+  9,
   9,
   -1,
   9,
   9,
   9,
   -1,
   9,
+  9,
+  9,
+  9,
   0]

======================================================================
FAIL: test_simple_word (test.TestTextToNums)
Test with a simple word that doesn't require -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: [9, 9, 8, 6] != [9, 8, 6]

First differing element 1:
9
8

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

- [9, 9, 8, 6]
?     ---

+ [9, 8, 6]

----------------------------------------------------------------------
Ran 37 tests in 0.327s

FAILED (failures=4)

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

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

+def nums_to_text(nums):
+ nums.append(1)
+ msg = ""
+ count = 0
+ previous = None
+
+ for elem in nums:
+ if previous == elem or previous == None:
+ count += 1
+ else:
+ if previous != -1:
+ mod3 = count % 3
+ mod4 = count % 4
+
+ match previous:
+ case 2:
+ match mod3:
+ case 1: msg += "a"
+ case 2: msg += "b"
+ case 0: msg += "c"
+ case 3:
+ match mod3:
+ case 1: msg += "d"
+ case 2: msg += "e"
+ case 0: msg += "f"
+ case 4:
+ match mod3:
+ case 1: msg += "g"
+ case 2: msg += "h"
+ case 0: msg += "i"
+ case 5:
+ match mod3:
+ case 1: msg += "j"
+ case 2: msg += "k"
+ case 0: msg += "l"
+ case 6:
+ match mod3:
+ case 1: msg += "m"
+ case 2: msg += "n"
+ case 0: msg += "o"
+ case 7:
+ match mod4:
+ case 1: msg += "p"
+ case 2: msg += "q"
+ case 3: msg += "r"
+ case 0: msg += "s"
+ case 8:
+ match mod3:
+ case 1: msg += "t"
+ case 2: msg += "u"
+ case 0: msg += "v"
+ case 9:
+ match mod4:
+ case 1: msg += "w"
+ case 2: msg += "x"
+ case 3: msg += "y"
+ case 0: msg += "z"
+ case 0:
+ msg += " "
+ count = 1
+ else:
+ count = 1
+ previous = elem
+ return msg
+
+def text_to_nums(text):
+ button_matrix = [["a", "b", "c"], ["d", "e", "f"], ["g", "h", "i"], ["j", "k", "l"],
+ ["m", "n", "o"], ["p", "q", "r", "s"], ["t", "u", "v"], ["w", "x", "y", "z"]]
+ nums = []
+ prev_letter = None
+ lower_text = text.lower()
+
+ for elem in lower_text:
+ if elem != " ":
+ i = 2 # button digit
+ is_found = False
+
+ for button in button_matrix:
+ j = 1 # times the digit needs to be pressed
+ if not is_found:
+ for letter in button:
+ if letter == elem:
+ for same_button in button:
+ if prev_letter == same_button:
+ nums.append(-1)
+ break
+ for times in range(j):
+ nums.append(i)
+
+ is_found = True
+ break
+ j += 1
+ else:
+ break
+ i += 1
+ else:
+ nums.append(0)
+ prev_letter = elem
+ return nums
+
+def nums_to_angle(nums):
+ sum = 0
+ for number in nums:
+ if number >= 0 and number <= 9 or number < 0 and number >= -9: #cannot have a number thats not on the phone?
+ sum += number * 30
+
+ if sum > 359 or sum < -359:
+ sum =sum % 360
+ if (sum < 0):
+ sum += 360
+ return sum
+
+pivot_angles = []
+for x in range(0, 345, 15):
+ pivot_angles.append(x)
+pivot_angles_size = len(pivot_angles)
+
+def angles_to_nums(angles):
+ nums = []
+ for elem in angles:
+ #normalize
+ if elem > 359 or elem < -359:
+ elem =elem % 360
+ if (elem < 0):
+ elem += 360
+ #floor or ceil
+ i = 0
+ while i < pivot_angles_size - 1:
+ if elem >= pivot_angles[i] and elem <= pivot_angles[i + 1]:
+ if i % 2 == 0:
+ elem = pivot_angles[i]
+ else:
+ elem = pivot_angles[i + 1]
+ i += 1
+ #calculate number
+ if elem != 0 and elem < 330:
+ if elem == 300:
+ nums.append(0)
+ else:
+ nums.append(int(elem / 30))
+ return nums
+
+def is_phone_tastic(word):
+ if word == "":
+ return False
+ nums = text_to_nums(word)
+ angle = nums_to_angle(nums)
+ division = angle / len(word)
+ return int(division) == division

правя в момента оптимизации:

(1) на първата функция защото може да е по-елегантно от switch-case

(2) на втората функция може да се избегне един цикъл, ако следя кой бутон е натиснат, а не коя буква

пиша този коментар, ако случайно не успея да предам ново решение, да спестя градивната критика

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

def nums_to_text(nums):
nums.append(1)
msg = ""
count = 0
previous = None
for elem in nums:
if previous == elem or previous == None:
count += 1
else:
if previous != -1:
mod3 = count % 3
mod4 = count % 4
match previous:
case 2:
match mod3:
case 1: msg += "a"
case 2: msg += "b"
case 0: msg += "c"
case 3:
match mod3:
case 1: msg += "d"
case 2: msg += "e"
case 0: msg += "f"
case 4:
match mod3:
case 1: msg += "g"
case 2: msg += "h"
case 0: msg += "i"
case 5:
match mod3:
case 1: msg += "j"
case 2: msg += "k"
case 0: msg += "l"
case 6:
match mod3:
case 1: msg += "m"
case 2: msg += "n"
case 0: msg += "o"
case 7:
match mod4:
case 1: msg += "p"
case 2: msg += "q"
case 3: msg += "r"
case 0: msg += "s"
case 8:
match mod3:
case 1: msg += "t"
case 2: msg += "u"
case 0: msg += "v"
case 9:
match mod4:
case 1: msg += "w"
case 2: msg += "x"
case 3: msg += "y"
case 0: msg += "z"
case 0:
msg += " "
count = 1
else:
count = 1
previous = elem
return msg
def text_to_nums(text):
button_matrix = [["a", "b", "c"], ["d", "e", "f"], ["g", "h", "i"], ["j", "k", "l"],
- ["m", "n", "o"], ["p", "q", "r", "s"], ["t", "u", "v"], ["w", "x", "y", "z"]]
+ ["m", "n", "o"], ["p", "q", "r", "s"], ["t", "u", "v"], ["z", "w", "x", "z"]]
nums = []
- prev_letter = None
+ prev_button = None
lower_text = text.lower()
for elem in lower_text:
if elem != " ":
i = 2 # button digit
is_found = False
for button in button_matrix:
j = 1 # times the digit needs to be pressed
if not is_found:
for letter in button:
if letter == elem:
- for same_button in button:
- if prev_letter == same_button:
- nums.append(-1)
- break
+ if prev_button == button:
+ nums.append(-1)
for times in range(j):
nums.append(i)
+ prev_button = button
is_found = True
break
j += 1
else:
break
i += 1
else:
nums.append(0)
- prev_letter = elem
return nums
def nums_to_angle(nums):
sum = 0
for number in nums:
if number >= 0 and number <= 9 or number < 0 and number >= -9: #cannot have a number thats not on the phone?
sum += number * 30
if sum > 359 or sum < -359:
sum =sum % 360
if (sum < 0):
sum += 360
return sum
pivot_angles = []
for x in range(0, 345, 15):
pivot_angles.append(x)
pivot_angles_size = len(pivot_angles)
def angles_to_nums(angles):
nums = []
for elem in angles:
#normalize
if elem > 359 or elem < -359:
elem =elem % 360
if (elem < 0):
elem += 360
#floor or ceil
i = 0
while i < pivot_angles_size - 1:
if elem >= pivot_angles[i] and elem <= pivot_angles[i + 1]:
if i % 2 == 0:
elem = pivot_angles[i]
else:
elem = pivot_angles[i + 1]
i += 1
#calculate number
if elem != 0 and elem < 330:
if elem == 300:
nums.append(0)
else:
nums.append(int(elem / 30))
return nums
def is_phone_tastic(word):
if word == "":
return False
- nums = text_to_nums(word)
- angle = nums_to_angle(nums)
- division = angle / len(word)
+ division = nums_to_angle(text_to_nums(word)) / len(word)
return int(division) == division