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

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

Към профила на Тина Томова

Резултати

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

Код

def press_count(number_string):
if number_string[0] == "7" or number_string[0] == "9":

Ако запазим същата логика, но се опитаме да махнем дублиращият се код, можем да получим следното:

if number_string[0] == "7" or number_string[0] == "9":
    divisor = 4
else:
    divisor = 3

if len(number_string) % divisor == 0:
    return divisor
else:
    return len(number_string) % divisor

# Алтернативно можем да напишем още по-краткото:
# divisor = 4 if number_string[0] == "7" or number_string[0] == "9" else 3
# return len(number_string) % divisor or divisor
if len(number_string) % 4 == 0:
return 4
else:
return len(number_string) % 4
else:
if len(number_string) % 3 == 0:
return 3
else:
return len(number_string) % 3
def numbers_to_string(one_letter):
number_string = ""
for button in one_letter:
number_string += str(button)
return number_string
def nums_to_text(all_numbers):
letters = {("2", 1): "A", ("2", 2): "B", ("2", 3): "C",
("3", 1): "D", ("3", 2): "E", ("3", 3): "F",
("4", 1): "G", ("4", 2): "H", ("4", 3): "I",
("5", 1): "J", ("5", 2): "K", ("5", 3): "L",
("6", 1): "M", ("6", 2): "N", ("6", 3): "O",
("7", 1): "P", ("7", 2): "Q", ("7", 3): "R", ("7", 4): "S",
("8", 1): "T", ("8", 2): "U", ("8", 3): "V",
("9", 1): "W", ("9", 2): "X", ("9", 3): "Y", ("9", 4): "Z"}
one_letter = []
result = ""
for number in all_numbers:
if len(one_letter) == 0 and (number < 2 or number > 9):
continue
elif len(one_letter) > 0 and one_letter[-1] != number:
result += letters[str(one_letter[0]), press_count(numbers_to_string(one_letter))]
one_letter.clear()
if number >= 2 and number <=9:
one_letter.append(number)
elif number == 0:
result += " "
elif len(one_letter) == 0 or one_letter[-1] == number:
one_letter.append(number)
if len(one_letter) > 0:
result += letters[str(one_letter[0]), press_count(numbers_to_string(one_letter))]
return result
def text_to_nums(text):
letters = {" ": (0, 1),
"a": (2, 1), "b": (2, 2), "c": (2, 3),
"d": (3, 1), "e": (3, 2), "f": (3, 3),
"g": (4, 1), "h": (4, 2), "i": (4, 3),
"j": (5, 1), "k": (5, 2), "l": (5, 3),
"m": (6, 1), "n": (6, 2), "o": (6, 3),
"p": (7, 1), "q": (7, 2), "r": (7, 3), "s": (7, 4),
"t": (8, 1), "u": (8, 2), "v": (8, 3),
"w": (9, 1), "x": (9, 2), "y": (9, 3), "z": (9, 4)}
text = text.lower()
result =[]
for letter in text:
letter_first, letter_second = letters[letter]
for i in range(letter_second):
result.append(letter_first)
return result
def nums_to_angle(numbers):
angle = 0
for num in numbers:
if num == 0:
angle += 300
else:
angle += num * 30
return angle % 360
def angles_to_nums(angles):
result = []
for angle in angles:
while angle < 0:
angle += 360
if angle > 360:
angle = angle % 360
if angle % 30 < 15:
angle -= angle % 30
else:
angle -= angle % 30
angle += 30
if angle == 0:
continue
else:
result.append(int(angle / 30))
return result
def is_phone_tastic(word):
word_translated = text_to_nums(word)
angle = nums_to_angle(word_translated)
return angle % len(word) == 0

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

..F....FF.E.................F.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_ignoring_over_330 (test.TestAnglesToNums)
Test that angles rounded over 330 are ignored.
----------------------------------------------------------------------
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: [11] != []

First list contains 1 additional elements.
First extra element 0:
11

- [11]
+ []

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

First differing element 2:
1
2

First list contains 3 additional elements.
First extra element 9:
8

- [5, 1, 1, 2, 5, 9, 11, 11, 2, 8, 10, 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_spaces_only (test.TestNumsToText)
Test for input of only whitespaces with or without -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: '' not found in ('   ', '      ')

======================================================================
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_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.350s

FAILED (failures=8, errors=1)

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

Тина обнови решението на 01.11.2022 17:01 (преди над 1 година)

+def nums_to_text(all_numbers):
+ letters = {("2", 1): "A", ("2", 2): "B", ("2", 3): "C", ("3", 1): "D", ("3", 2): "E", ("3", 3): "F", ("4", 1): "G", ("4", 2): "H", ("4", 3): "I", ("5", 1): "J", ("5", 2): "K", ("5", 3): "L", ("6", 1): "M", ("6", 2): "N", ("6", 3): "O", ("7", 1): "P", ("7", 2): "Q", ("7", 3): "R", ("7", 4): "S", ("8", 1): "T", ("8", 2): "U", ("8", 3): "V", ("9", 1): "W", ("9", 2): "X", ("9", 3): "Y", ("9", 4): "Z"}
+ numbers = []
+ result = ""
+ for num in all_numbers:
+ if num < 0 or num == 1 or num > 9:
+ if len(numbers) != 0:
+ numbers_to_string = ""
+ for n in numbers:
+ if n == 0:
+ continue
+ numbers_to_string += str(n)
+ if len(numbers_to_string) != 0:
+ num_count = 0
+ if numbers_to_string[0] == "7" or numbers_to_string[0] == "9":
+ if len(numbers_to_string) % 4 == 0:
+ num_count = 4
+ else:
+ num_count = len(numbers_to_string) % 4
+ else:
+ if len(numbers_to_string) % 3 == 0:
+ num_count = 3
+ else:
+ num_count = len(numbers_to_string) % 3
+ result += letters[(numbers_to_string[0], num_count)]
+ numbers.clear()
+ elif len(numbers) == 0 or numbers[-1] == num:
+ numbers.append(num)
+ elif len(numbers) != 0 and numbers[-1] != num and num != -1:
+ numbers_to_string = ""
+ for n in numbers:
+ if n == 0:
+ result += " "
+ continue
+ numbers_to_string += str(n)
+ if len(numbers_to_string) != 0:
+ num_count = 0
+ if numbers_to_string[0] == "7" or numbers_to_string[0] == "9":
+ if len(numbers_to_string) % 4 == 0:
+ num_count = 4
+ else:
+ num_count = len(numbers_to_string) % 4
+ else:
+ if len(numbers_to_string) % 3 == 0:
+ num_count = 3
+ else:
+ num_count = len(numbers_to_string) % 3
+ result += letters[(numbers_to_string[0], num_count)]
+ numbers.clear()
+ numbers.append(num)
+ numbers_to_string = ""
+ for n in numbers:
+ if n == 0:
+ result += " "
+ continue
+ numbers_to_string += str(n)
+ if len(numbers_to_string) != 0:
+ num_count = 0
+ if numbers_to_string[0] == "7" or numbers_to_string[0] == "9":
+ if len(numbers_to_string) % 4 == 0:
+ num_count = 4
+ else:
+ num_count = len(numbers_to_string) % 4
+ else:
+ if len(numbers_to_string) % 3 == 0:
+ num_count = 3
+ else:
+ num_count = len(numbers_to_string) % 3
+ result += letters[(numbers_to_string[0], num_count)]
+ return result
+#print(nums_to_text([2, 2, 1, 1, 2, 1]))
+
+def text_to_nums(text):
+ letters = {" ": (0, 1), "a": (2, 1), "b": (2, 2), "c": (2, 3), "d": (3, 1), "e": (3, 2), "f": (3, 3), "g": (4, 1), "h": (4, 2), "i": (4, 3), "j": (5, 1), "k": (5, 2), "l": (5, 3), "m": (6, 1), "n": (6, 2), "o": (6, 3), "p": (7, 1), "q": (7, 2), "r": (7, 3), "s": (7, 4), "t": (8, 1), "u": (8, 2), "v": (8, 3), "w": (9, 1), "x": (9, 2), "y": (9, 3), "z": (9, 4)}
+ text = text.lower()
+ result =[]
+ for letter in text:
+ letter_first, letter_second = letters[letter]
+ for i in range(letter_second):
+ result.append(letter_first)
+ return result
+#print(text_to_nums('asl pls'))
+
+def nums_to_angle(numbers):
+ angle = 0
+ for num in numbers:
+ if num == 0:
+ angle += 300
+ else:
+ angle += num * 30
+ return angle % 360
+#print(nums_to_angle([1, 5, 9]))
+
+def angles_to_nums(angles):
+ result = []
+ for angle in angles:
+ while angle < 0:
+ angle += 360
+ if angle > 360:
+ angle = angle % 360
+ if angle % 30 < 15:
+ angle -= angle % 30
+ else:
+ angle -= angle % 30
+ angle += 30
+ if angle == 0:
+ continue
+ else:
+ result.append(int(angle / 30))
+ return result
+#print(angles_to_nums([16, 14, 90, -120, 570, -660]))
+
+def is_phone_tastic(word):
+ word_translated = text_to_nums(word)
+ angle = nums_to_angle(word_translated)
+ return angle % len(word) == 0
+#print(is_phone_tastic('GOD'))

Тина обнови решението на 01.11.2022 19:12 (преди над 1 година)

+def press_count(number_string):
+ if number_string[0] == "7" or number_string[0] == "9":

Ако запазим същата логика, но се опитаме да махнем дублиращият се код, можем да получим следното:

if number_string[0] == "7" or number_string[0] == "9":
    divisor = 4
else:
    divisor = 3

if len(number_string) % divisor == 0:
    return divisor
else:
    return len(number_string) % divisor

# Алтернативно можем да напишем още по-краткото:
# divisor = 4 if number_string[0] == "7" or number_string[0] == "9" else 3
# return len(number_string) % divisor or divisor
+ if len(number_string) % 4 == 0:
+ return 4
+ else:
+ return len(number_string) % 4
+ else:
+ if len(number_string) % 3 == 0:
+ return 3
+ else:
+ return len(number_string) % 3
+
+def numbers_to_string(one_letter):
+ number_string = ""
+ for button in one_letter:
+ number_string += str(button)
+ return number_string
+
def nums_to_text(all_numbers):
- letters = {("2", 1): "A", ("2", 2): "B", ("2", 3): "C", ("3", 1): "D", ("3", 2): "E", ("3", 3): "F", ("4", 1): "G", ("4", 2): "H", ("4", 3): "I", ("5", 1): "J", ("5", 2): "K", ("5", 3): "L", ("6", 1): "M", ("6", 2): "N", ("6", 3): "O", ("7", 1): "P", ("7", 2): "Q", ("7", 3): "R", ("7", 4): "S", ("8", 1): "T", ("8", 2): "U", ("8", 3): "V", ("9", 1): "W", ("9", 2): "X", ("9", 3): "Y", ("9", 4): "Z"}
- numbers = []
+ letters = {("2", 1): "A", ("2", 2): "B", ("2", 3): "C",
+ ("3", 1): "D", ("3", 2): "E", ("3", 3): "F",
+ ("4", 1): "G", ("4", 2): "H", ("4", 3): "I",
+ ("5", 1): "J", ("5", 2): "K", ("5", 3): "L",
+ ("6", 1): "M", ("6", 2): "N", ("6", 3): "O",
+ ("7", 1): "P", ("7", 2): "Q", ("7", 3): "R", ("7", 4): "S",
+ ("8", 1): "T", ("8", 2): "U", ("8", 3): "V",
+ ("9", 1): "W", ("9", 2): "X", ("9", 3): "Y", ("9", 4): "Z"}
+ one_letter = []
result = ""
- for num in all_numbers:
- if num < 0 or num == 1 or num > 9:
- if len(numbers) != 0:
- numbers_to_string = ""
- for n in numbers:
- if n == 0:
- continue
- numbers_to_string += str(n)
- if len(numbers_to_string) != 0:
- num_count = 0
- if numbers_to_string[0] == "7" or numbers_to_string[0] == "9":
- if len(numbers_to_string) % 4 == 0:
- num_count = 4
- else:
- num_count = len(numbers_to_string) % 4
- else:
- if len(numbers_to_string) % 3 == 0:
- num_count = 3
- else:
- num_count = len(numbers_to_string) % 3
- result += letters[(numbers_to_string[0], num_count)]
- numbers.clear()
- elif len(numbers) == 0 or numbers[-1] == num:
- numbers.append(num)
- elif len(numbers) != 0 and numbers[-1] != num and num != -1:
- numbers_to_string = ""
- for n in numbers:
- if n == 0:
- result += " "
- continue
- numbers_to_string += str(n)
- if len(numbers_to_string) != 0:
- num_count = 0
- if numbers_to_string[0] == "7" or numbers_to_string[0] == "9":
- if len(numbers_to_string) % 4 == 0:
- num_count = 4
- else:
- num_count = len(numbers_to_string) % 4
- else:
- if len(numbers_to_string) % 3 == 0:
- num_count = 3
- else:
- num_count = len(numbers_to_string) % 3
- result += letters[(numbers_to_string[0], num_count)]
- numbers.clear()
- numbers.append(num)
- numbers_to_string = ""
- for n in numbers:
- if n == 0:
- result += " "
+ for number in all_numbers:
+ if len(one_letter) == 0 and (number < 2 or number > 9):
continue
- numbers_to_string += str(n)
- if len(numbers_to_string) != 0:
- num_count = 0
- if numbers_to_string[0] == "7" or numbers_to_string[0] == "9":
- if len(numbers_to_string) % 4 == 0:
- num_count = 4
- else:
- num_count = len(numbers_to_string) % 4
- else:
- if len(numbers_to_string) % 3 == 0:
- num_count = 3
- else:
- num_count = len(numbers_to_string) % 3
- result += letters[(numbers_to_string[0], num_count)]
+ elif len(one_letter) > 0 and one_letter[-1] != number:
+ result += letters[str(one_letter[0]), press_count(numbers_to_string(one_letter))]
+ one_letter.clear()
+ if number >= 2 and number <=9:
+ one_letter.append(number)
+ elif number == 0:
+ result += " "
+ elif len(one_letter) == 0 or one_letter[-1] == number:
+ one_letter.append(number)
+ if len(one_letter) > 0:
+ result += letters[str(one_letter[0]), press_count(numbers_to_string(one_letter))]
return result
-#print(nums_to_text([2, 2, 1, 1, 2, 1]))
def text_to_nums(text):
- letters = {" ": (0, 1), "a": (2, 1), "b": (2, 2), "c": (2, 3), "d": (3, 1), "e": (3, 2), "f": (3, 3), "g": (4, 1), "h": (4, 2), "i": (4, 3), "j": (5, 1), "k": (5, 2), "l": (5, 3), "m": (6, 1), "n": (6, 2), "o": (6, 3), "p": (7, 1), "q": (7, 2), "r": (7, 3), "s": (7, 4), "t": (8, 1), "u": (8, 2), "v": (8, 3), "w": (9, 1), "x": (9, 2), "y": (9, 3), "z": (9, 4)}
+ letters = {" ": (0, 1),
+ "a": (2, 1), "b": (2, 2), "c": (2, 3),
+ "d": (3, 1), "e": (3, 2), "f": (3, 3),
+ "g": (4, 1), "h": (4, 2), "i": (4, 3),
+ "j": (5, 1), "k": (5, 2), "l": (5, 3),
+ "m": (6, 1), "n": (6, 2), "o": (6, 3),
+ "p": (7, 1), "q": (7, 2), "r": (7, 3), "s": (7, 4),
+ "t": (8, 1), "u": (8, 2), "v": (8, 3),
+ "w": (9, 1), "x": (9, 2), "y": (9, 3), "z": (9, 4)}
text = text.lower()
result =[]
for letter in text:
letter_first, letter_second = letters[letter]
for i in range(letter_second):
result.append(letter_first)
return result
-#print(text_to_nums('asl pls'))
def nums_to_angle(numbers):
angle = 0
for num in numbers:
if num == 0:
angle += 300
else:
angle += num * 30
return angle % 360
-#print(nums_to_angle([1, 5, 9]))
def angles_to_nums(angles):
result = []
for angle in angles:
while angle < 0:
angle += 360
if angle > 360:
angle = angle % 360
if angle % 30 < 15:
angle -= angle % 30
else:
angle -= angle % 30
angle += 30
if angle == 0:
continue
else:
result.append(int(angle / 30))
return result
-#print(angles_to_nums([16, 14, 90, -120, 570, -660]))
def is_phone_tastic(word):
word_translated = text_to_nums(word)
angle = nums_to_angle(word_translated)
- return angle % len(word) == 0
-#print(is_phone_tastic('GOD'))
+ return angle % len(word) == 0