Решение на Телефонна любов от Георги Чобанов

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

Към профила на Георги Чобанов

Резултати

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

Код

number_codes = {
2: ("A", "B", "C"),
3: ("D", "E", "F"),
4: ("G", "H", "I"),
5: ("J", "K", "L"),
6: ("M", "N", "O"),
7: ("P", "Q", "R", "S"),
8: ("T", "U", "V"),
9: ("W", "X", "Y", "Z"),
0: (" ")
}
def add_letter(text, number, click_counter):
if number in number_codes:
text += number_codes[number][click_counter - 1]
click_counter = 0
return text, click_counter
def nums_to_text(numbers):
click_counter = 0
previous_click = numbers[0]
final_text = ""
for number in numbers:
if number == 1 or number == -1:
final_text, click_counter = add_letter(final_text,
previous_click,
click_counter)
continue
else:
if number != previous_click:
final_text, click_counter = add_letter(final_text,
previous_click,
click_counter)
click_counter += 1
if click_counter > len(number_codes[number]):
click_counter = 1
previous_click = number
final_text, click_counter = add_letter(final_text,
previous_click,
click_counter)
return final_text
def text_to_nums(text):
number_code = []
previous_number = -1
for letter in text:
for number, letters in number_codes.items():

Ако предварително "обърнеш" речника (letter_to_num(s)), било то като хардкоуднат обект, или динамично преди дефиницията на функциите си, ще можеш да поопростиш логиката тук. Не е нужно да предаваш ново решение за това. Просто препоръка.

upper_letter = letter.upper()
if upper_letter in letters:
if number == previous_number and number != 0:
number_code.append(-1)
for _ in range(letters.index(upper_letter) + 1):
number_code.append(number)
previous_number = number
break
return number_code
def nums_to_angle(numbers):
angle_sum = 0
for number in numbers:
number = 10 if number == 0 else number
angle_sum += number*30
normalized_angle = angle_sum % 360
return normalized_angle
def round_angle(angle):
multiplier = angle // 30
mod = angle % 30
closer_angle = 0
if mod > 15:
closer_angle = 30 * (multiplier + 1)
else:
closer_angle = 30 * (multiplier)
return closer_angle
def make_angle_positive(angle):
return 360 - (angle * -1) if angle < 0 else angle
def angles_to_nums(angles):
number_code = []
for angle in angles:
angle = make_angle_positive(angle)
normalized_angle = angle % 360
rounded_angle = round_angle(normalized_angle)
if rounded_angle in [330, 360, 0]:
continue
rounded_angle = 0 if rounded_angle == 300 else rounded_angle
number_code.append(rounded_angle // 30)
return number_code
def is_phone_tastic(text):
normalized_angle = nums_to_angle(text_to_nums(text))
return normalized_angle % len(text) == 0

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

..........E...........EFF............
======================================================================
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

======================================================================
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_ending_with_timeout (test.TestNumsToText)
Test with a sequence ending with a -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: 'oo' != 'o'
- oo
? -
+ o


======================================================================
FAIL: test_multiple_timeouts (test.TestNumsToText)
Test with multiple '-1's next to each other.
----------------------------------------------------------------------
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: 'jlllmopsst' != 'jmpt'
- jlllmopsst
+ jmpt


----------------------------------------------------------------------
Ran 37 tests in 0.317s

FAILED (failures=2, errors=2)

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

Георги обнови решението на 30.10.2022 21:49 (преди над 1 година)

+number_codes = {
+ 2 : ("A", "B", "C"),
+ 3 : ("D", "E", "F"),
+ 4 : ("G", "H", "I"),
+ 5 : ("J", "K", "L"),
+ 6 : ("M", "N", "O"),
+ 7 : ("P", "Q", "R", "S"),
+ 8 : ("T", "U", "V"),
+ 9 : ("W", "X", "Y", "Z"),
+ 0 : (" ")
+}
+
+def add_letter(text, number, click_counter):
+ if number in number_codes:
+ text += number_codes[number][click_counter - 1]
+ click_counter = 0
+ return text, click_counter
+
+def nums_to_text(numbers):
+ click_counter = 0
+ previous_click = numbers[0]
+ final_text = ""
+ for number in numbers:
+ if number == 1 or number == -1:
+ final_text, click_counter = add_letter(final_text, previous_click, click_counter)
+ continue
+ else:
+ if number != previous_click:
+ final_text, click_counter = add_letter(final_text, previous_click, click_counter)
+ click_counter += 1
+ if click_counter > len(number_codes[number]):
+ click_counter = 1
+ previous_click = number
+ final_text, click_counter = add_letter(final_text, previous_click, click_counter)
+ return final_text
+
+def text_to_nums(text):
+ number_code = []
+ previous_number = -1
+ for letter in text:
+ for number, letters in number_codes.items():
+ upper_letter = letter.upper()
+ if upper_letter in letters:
+ if number == previous_number and number != 0:
+ number_code.append(-1)
+ for _ in range(letters.index(upper_letter) + 1):
+ number_code.append(number)
+ previous_number = number
+ break
+ return number_code
+
+def nums_to_angle(numbers):
+ angle_sum = 0
+ for number in numbers:
+ number = 10 if number == 0 else number
+ angle_sum += number*30
+ normalized_angle = angle_sum % 360
+ return normalized_angle
+
+def round_angle(angle):
+ multiplier = angle // 30
+ mod = angle % 30
+ closer_angle = 0
+ if mod > 15:
+ closer_angle = 30 * (multiplier + 1)
+ else:
+ closer_angle = 30 * (multiplier)
+ return closer_angle
+
+def make_angle_positive(angle):
+ return 360 - (angle * -1) if angle < 0 else angle
+
+def angles_to_nums(angles):
+ number_code = []
+ for angle in angles:
+ angle = make_angle_positive(angle)
+ normalized_angle = angle % 360
+ rounded_angle = round_angle(normalized_angle)
+ if rounded_angle in [330,360,0]:
+ continue
+ rounded_angle = 0 if rounded_angle == 300 else rounded_angle
+ number_code.append(rounded_angle // 30)
+ return number_code
+
+def is_phone_tastic(text):
+ normalized_angle = nums_to_angle(text_to_nums(text))
+ return normalized_angle % len(text) == 0
+

Георги обнови решението на 30.10.2022 22:10 (преди над 1 година)

number_codes = {
- 2 : ("A", "B", "C"),
- 3 : ("D", "E", "F"),
- 4 : ("G", "H", "I"),
- 5 : ("J", "K", "L"),
- 6 : ("M", "N", "O"),
- 7 : ("P", "Q", "R", "S"),
- 8 : ("T", "U", "V"),
- 9 : ("W", "X", "Y", "Z"),
- 0 : (" ")
+ 2: ("A", "B", "C"),
+ 3: ("D", "E", "F"),
+ 4: ("G", "H", "I"),
+ 5: ("J", "K", "L"),
+ 6: ("M", "N", "O"),
+ 7: ("P", "Q", "R", "S"),
+ 8: ("T", "U", "V"),
+ 9: ("W", "X", "Y", "Z"),
+ 0: (" ")
}
+
def add_letter(text, number, click_counter):
if number in number_codes:
text += number_codes[number][click_counter - 1]
click_counter = 0
return text, click_counter
+
def nums_to_text(numbers):
click_counter = 0
previous_click = numbers[0]
final_text = ""
- for number in numbers:
+ for number in numbers:
if number == 1 or number == -1:
- final_text, click_counter = add_letter(final_text, previous_click, click_counter)
+ final_text, click_counter = add_letter(final_text,
+ previous_click,
+ click_counter)
continue
else:
if number != previous_click:
- final_text, click_counter = add_letter(final_text, previous_click, click_counter)
+ final_text, click_counter = add_letter(final_text,
+ previous_click,
+ click_counter)
click_counter += 1
if click_counter > len(number_codes[number]):
- click_counter = 1
+ click_counter = 1
previous_click = number
- final_text, click_counter = add_letter(final_text, previous_click, click_counter)
+ final_text, click_counter = add_letter(final_text,
+ previous_click,
+ click_counter)
return final_text
+
def text_to_nums(text):
number_code = []
previous_number = -1
for letter in text:
for number, letters in number_codes.items():

Ако предварително "обърнеш" речника (letter_to_num(s)), било то като хардкоуднат обект, или динамично преди дефиницията на функциите си, ще можеш да поопростиш логиката тук. Не е нужно да предаваш ново решение за това. Просто препоръка.

upper_letter = letter.upper()
if upper_letter in letters:
if number == previous_number and number != 0:
number_code.append(-1)
for _ in range(letters.index(upper_letter) + 1):
number_code.append(number)
previous_number = number
break
return number_code
+
def nums_to_angle(numbers):
angle_sum = 0
for number in numbers:
number = 10 if number == 0 else number
angle_sum += number*30
normalized_angle = angle_sum % 360
return normalized_angle
+
def round_angle(angle):
multiplier = angle // 30
mod = angle % 30
closer_angle = 0
if mod > 15:
closer_angle = 30 * (multiplier + 1)
else:
closer_angle = 30 * (multiplier)
return closer_angle
+
def make_angle_positive(angle):
return 360 - (angle * -1) if angle < 0 else angle
+
def angles_to_nums(angles):
number_code = []
for angle in angles:
angle = make_angle_positive(angle)
normalized_angle = angle % 360
rounded_angle = round_angle(normalized_angle)
- if rounded_angle in [330,360,0]:
+ if rounded_angle in [330, 360, 0]:
continue
rounded_angle = 0 if rounded_angle == 300 else rounded_angle
number_code.append(rounded_angle // 30)
return number_code
+
def is_phone_tastic(text):
normalized_angle = nums_to_angle(text_to_nums(text))
return normalized_angle % len(text) == 0
-