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

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

Към профила на Йордан Глигоров

Резултати

  • 9 точки от тестове
  • 1 бонус точка
  • 10 точки общо
  • 34 успешни тест(а)
  • 3 неуспешни тест(а)

Код

def nums_to_text(nums):
from itertools import groupby
dial_numbers = {
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"] }
result = []
for number, letters in groupby(nums):
index = len(list(letters)) - 1
if number == 0:
result.append(" ")
continue
elif number == 1 or number == -1:
continue
values = dial_numbers.get(number, None)
if values is not None:
result.append(values[index % len(values)])
else:
raise ValueError(f'Unrecognized input "{number}"')
return "".join(result)
def text_to_nums(text):
strings = {
"A": "2", "B": "22", "C": "222",
"D": "3", "E": "33", "F": "333",
"G": "4", "H": "44", "I": "444",
"J": "5", "K": "55", "L": "555",
"M": "6", "N": "66", "O": "666",
"P": "7", "Q": "77", "R": "777", "S": "7777",
"T": "8", "U": "88", "V": "888",
"W": "9", "X": "99", "Y": "999", "Z": "9999" }
temp = []
result = []
last_num = -1
for character in text:
if (character == ' '):
temp.append("0")
continue
else:
number = strings.get(character.upper(), None)
if number is None:
raise ValueError(f'Unrecognised input "{character}"')
curr_num = number[0]
if last_num == curr_num:
temp.append(-1)
temp.append(number)
last_num = curr_num
for el in temp:
if el == -1:
result.append(-1)
continue
if type(el) == str:
for char in el:
result.append(int(char) - int('0'))
return result
def nums_to_angle(nums):
sum = 0
for num in nums:
if num < 0:
continue
if num == 0:
sum += 300
continue
sum += num * 30
return sum % 360
def round_angle(angle):
ranges = {
(0, 15): 0,
(15, 45): 30,
(45, 75): 60,
(75, 105): 90,
(105, 135): 120,
(135, 165): 150,
(165, 195): 180,
(195, 225): 210,
(225, 255): 240,
(255, 285): 270,
(285, 315): 300,
(315, 345): 0
}
for pair_range, val in ranges.items():
if pair_range[0] < angle <= pair_range[1]:
return val
return 0
def angles_to_nums(angles):
result = []
for angle in angles:
while angle < 0:
angle += 360
num = round_angle(angle) // 30
if num >= 10:
num = 0
if num != 0:
result.append(num)
return result
def is_phone_tastic(word):
nums = text_to_nums(word)
angle = nums_to_angle(nums)
return angle % len(word) == 0

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

......FF..E..........................
======================================================================
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_overflowing_angles (test.TestAnglesToNums)
Test with an overflowed 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: [] != [2]

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

- []
+ [2]
?  +


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

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

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

----------------------------------------------------------------------
Ran 37 tests in 0.357s

FAILED (failures=2, errors=1)

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

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

+def nums_to_text(nums):
+ mp = { 2:["A", "B", "C"],

1) Съветвам те да използваш по-описателно има на променливата. 2) След : е прието да има интервал #PEP8 3) Добре е редовете ти да са приравнени един с друг. Т.е. цифрите, които са ключ на речника, да се намират на една и съща колона във всеки ред. В момента това е валидно за всички редове без първия.

Например num_to_letters = { 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"] }

+ 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"]
+ }
+
+ last_num = -1
+ count = 0
+ result = []
+
+ for num in nums:
+
+ if num in (7,9):
+ count = count % 4
+ elif num in (2, 3, 4, 5, 6, 8):
+ count = count % 3
+
+ if last_num == -1 or last_num == 1:
+ last_num = num
+ count = 1
+ continue
+
+ if num != last_num:
+ if last_num == 0:
+ result.append(" ")
+
+ if last_num in (2, 3, 4, 5, 6, 7, 8, 9):

Тази проверка можеш да направиш с ключовете на самия речник.
mp.get(last_num, None)

После, ако е None го пренебрегваш, ако не е, значи можеш да мапнеш.

Така хем не дублираш дефиниции, хем пестиш код.

+ result.append(mp[last_num][count - 1])
+ last_num = num
+ count = 1
+ continue
+
+ count += 1
+
+ if num != -1 and num != 1 and num != 0:

if num not in (-1, 1, 0) - ако проверявваш дали променлива е това, това, или това, най-добре ги сложиш в колекция и използвай in. По-кратко и по-четимо.

+ result.append(mp[num][count - 1])
+ elif num == 0:
+ result.append(" ")
+
+ return "".join(result)
+
+def text_to_nums(text):
+ str = { "A":"2", "B":"22", "C":"222",
+ "D":"3", "E":"33", "F":"333",
+ "G":"4", "H":"44", "I":"444",
+ "J":"5", "K":"55", "L":"555",
+ "M":"6", "N":"66", "O":"666",
+ "P":"7", "Q":"77", "R":"777", "S":"7777",
+ "T":"8", "U":"88", "V":"888",
+ "W":"9", "X":"99", "Y":"999", "Z":"9999" }
+
+ temp = []
+ result = []
+ for character in text:
+ if (character == ' '):
+ temp.append("0")
+ else:
+ temp.append(str[character.upper()])
+
+ for el in temp:
+ for char in el:
+ result.append(ord(char) - ord('0'))
+ return result
+
+def nums_to_angle(nums):
+ sum = 0
+ for num in nums:
+ sum += num * 30
+ return sum % 360
+
+def round_angle(angle):
+ if angle in range(0, 15):
+ angle = 0
+ elif angle in range(15, 45):
+ angle = 30
+ elif angle in range(45, 75):
+ angle = 60
+ elif angle in range(75, 105):
+ angle = 90
+ elif angle in range(105, 135):
+ angle = 120
+ elif angle in range(135, 165):
+ angle = 150
+ elif angle in range(165, 195):
+ angle = 180
+ elif angle in range(195, 225):
+ angle = 210
+ elif angle in range(225, 255):
+ angle = 240
+ elif angle in range(255, 285):
+ angle = 270
+ elif angle in range(285, 315):
+ angle = 300
+ elif angle in range(315, 345):
+ angle = 330
+ else:
+ angle = 0
+ return angle
+
+def angles_to_nums(angles):
+ result = []
+ for angle in angles:
+
+ while angle < 0:
+ angle += 360
+
+ num = round_angle(angle) // 30
+
+ if num != 0:
+ result.append(num)
+
+ return result
+
+def is_phone_tastic(word):
+ nums = text_to_nums(word)
+ angle = nums_to_angle(nums)
+
+ return angle % len(word) == 0

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

def nums_to_text(nums):
- mp = { 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"]
- }
+ from itertools import groupby
- last_num = -1
- count = 0
+ dial_numbers = {
+ 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"] }
result = []
- for num in nums:
+ for number, letters in groupby(nums):
+ length = len(list(letters)) - 1
- if num in (7,9):
- count = count % 4
- elif num in (2, 3, 4, 5, 6, 8):
- count = count % 3
-
- if last_num == -1 or last_num == 1:
- last_num = num
- count = 1
+ if number == 0:
+ result.append(" ")
continue
-
- if num != last_num:
- if last_num == 0:
- result.append(" ")
-
- if last_num in (2, 3, 4, 5, 6, 7, 8, 9):
- result.append(mp[last_num][count - 1])
- last_num = num
- count = 1
+ elif number == 1 or number == -1:
continue
- count += 1
-
- if num != -1 and num != 1 and num != 0:
- result.append(mp[num][count - 1])
- elif num == 0:
- result.append(" ")
-
+ values = dial_numbers.get(number, None)
+ if values is not None:
+ result.append(values[length % len(values)])
+ else:
+ raise ValueError(f'Unrecognized input "{number}"')
return "".join(result)
+
def text_to_nums(text):
- str = { "A":"2", "B":"22", "C":"222",
- "D":"3", "E":"33", "F":"333",
- "G":"4", "H":"44", "I":"444",
- "J":"5", "K":"55", "L":"555",
- "M":"6", "N":"66", "O":"666",
- "P":"7", "Q":"77", "R":"777", "S":"7777",
- "T":"8", "U":"88", "V":"888",
- "W":"9", "X":"99", "Y":"999", "Z":"9999" }
+ strings = {
+ "A": "2", "B": "22", "C": "222",
+ "D": "3", "E": "33", "F": "333",
+ "G": "4", "H": "44", "I": "444",
+ "J": "5", "K": "55", "L": "555",
+ "M": "6", "N": "66", "O": "666",
+ "P": "7", "Q": "77", "R": "777", "S": "7777",
+ "T": "8", "U": "88", "V": "888",
+ "W": "9", "X": "99", "Y": "999", "Z": "9999" }
temp = []
result = []
+
+ last_num = -1
+
for character in text:
if (character == ' '):
temp.append("0")
+ continue
else:
- temp.append(str[character.upper()])
-
+ number = strings.get(character.upper(), None)
+ if number is None:
+ raise ValueError(f'Unrecognised input "{character}"')
+ curr_num = number[0]
+
+ if last_num == curr_num:
+ temp.append(-1)
+
+ temp.append(number)
+
+ last_num = curr_num
+
for el in temp:
- for char in el:
- result.append(ord(char) - ord('0'))
+ if el == -1:
+ result.append(-1)
+ continue
+ if type(el) == str:
+ for char in el:
+ result.append(int(char) - int('0'))
return result
def nums_to_angle(nums):
sum = 0
for num in nums:
sum += num * 30
return sum % 360
def round_angle(angle):
- if angle in range(0, 15):
- angle = 0
- elif angle in range(15, 45):
- angle = 30
- elif angle in range(45, 75):
- angle = 60
- elif angle in range(75, 105):
- angle = 90
- elif angle in range(105, 135):
- angle = 120
- elif angle in range(135, 165):
- angle = 150
- elif angle in range(165, 195):
- angle = 180
- elif angle in range(195, 225):
- angle = 210
- elif angle in range(225, 255):
- angle = 240
- elif angle in range(255, 285):
- angle = 270
- elif angle in range(285, 315):
- angle = 300
- elif angle in range(315, 345):
- angle = 330
- else:
- angle = 0
- return angle
+ ranges = {
+ (0, 15): 0,
+ (15, 45): 30,
+ (45, 75): 60,
+ (75, 105): 90,
+ (105, 135): 120,
+ (135, 165): 150,
+ (165, 195): 180,
+ (195, 225): 210,
+ (225, 255): 240,
+ (255, 285): 270,
+ (285, 315): 300,
+ (315, 345): 330
+ }
+
+ for pair_range, val in ranges.items():
+ if pair_range[0] <= angle < pair_range[1]:
+ return val
+ return 0
def angles_to_nums(angles):
result = []
for angle in angles:
while angle < 0:
angle += 360
num = round_angle(angle) // 30
if num != 0:
result.append(num)
return result
def is_phone_tastic(word):
nums = text_to_nums(word)
angle = nums_to_angle(nums)
return angle % len(word) == 0

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

def nums_to_text(nums):
from itertools import groupby
dial_numbers = {
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"] }
result = []
for number, letters in groupby(nums):
length = len(list(letters)) - 1
if number == 0:
result.append(" ")
continue
elif number == 1 or number == -1:
continue
values = dial_numbers.get(number, None)
if values is not None:
result.append(values[length % len(values)])
else:
raise ValueError(f'Unrecognized input "{number}"')
return "".join(result)
def text_to_nums(text):
strings = {
"A": "2", "B": "22", "C": "222",
"D": "3", "E": "33", "F": "333",
"G": "4", "H": "44", "I": "444",
"J": "5", "K": "55", "L": "555",
"M": "6", "N": "66", "O": "666",
"P": "7", "Q": "77", "R": "777", "S": "7777",
"T": "8", "U": "88", "V": "888",
"W": "9", "X": "99", "Y": "999", "Z": "9999" }
temp = []
result = []
last_num = -1
for character in text:
if (character == ' '):
temp.append("0")
continue
else:
number = strings.get(character.upper(), None)
if number is None:
raise ValueError(f'Unrecognised input "{character}"')
curr_num = number[0]
if last_num == curr_num:
temp.append(-1)
temp.append(number)
last_num = curr_num
for el in temp:
if el == -1:
result.append(-1)
continue
if type(el) == str:
for char in el:
result.append(int(char) - int('0'))
return result
def nums_to_angle(nums):
sum = 0
for num in nums:
+ if num < 0:
+ continue
sum += num * 30
return sum % 360
def round_angle(angle):
ranges = {
(0, 15): 0,
(15, 45): 30,
(45, 75): 60,
(75, 105): 90,
(105, 135): 120,
(135, 165): 150,
(165, 195): 180,
(195, 225): 210,
(225, 255): 240,
(255, 285): 270,
(285, 315): 300,
(315, 345): 330
}
for pair_range, val in ranges.items():
if pair_range[0] <= angle < pair_range[1]:
return val
return 0
def angles_to_nums(angles):
result = []
for angle in angles:
while angle < 0:
angle += 360
num = round_angle(angle) // 30
if num != 0:
result.append(num)
return result
def is_phone_tastic(word):
nums = text_to_nums(word)
angle = nums_to_angle(nums)
return angle % len(word) == 0

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

def nums_to_text(nums):
from itertools import groupby
dial_numbers = {
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"] }
result = []
for number, letters in groupby(nums):
- length = len(list(letters)) - 1
+ index = len(list(letters)) - 1
if number == 0:
result.append(" ")
continue
elif number == 1 or number == -1:
continue
values = dial_numbers.get(number, None)
if values is not None:
- result.append(values[length % len(values)])
+ result.append(values[index % len(values)])
else:
raise ValueError(f'Unrecognized input "{number}"')
return "".join(result)
def text_to_nums(text):
strings = {
"A": "2", "B": "22", "C": "222",
"D": "3", "E": "33", "F": "333",
"G": "4", "H": "44", "I": "444",
"J": "5", "K": "55", "L": "555",
"M": "6", "N": "66", "O": "666",
"P": "7", "Q": "77", "R": "777", "S": "7777",
"T": "8", "U": "88", "V": "888",
"W": "9", "X": "99", "Y": "999", "Z": "9999" }
temp = []
result = []
last_num = -1
for character in text:
if (character == ' '):
temp.append("0")
continue
else:
number = strings.get(character.upper(), None)
if number is None:
raise ValueError(f'Unrecognised input "{character}"')
curr_num = number[0]
if last_num == curr_num:
temp.append(-1)
temp.append(number)
last_num = curr_num
for el in temp:
if el == -1:
result.append(-1)
continue
if type(el) == str:
for char in el:
result.append(int(char) - int('0'))
return result
def nums_to_angle(nums):
sum = 0
for num in nums:
if num < 0:
continue
sum += num * 30
return sum % 360
def round_angle(angle):
ranges = {
(0, 15): 0,
(15, 45): 30,
(45, 75): 60,
(75, 105): 90,
(105, 135): 120,
(135, 165): 150,
(165, 195): 180,
(195, 225): 210,
(225, 255): 240,
(255, 285): 270,
(285, 315): 300,
(315, 345): 330
}
for pair_range, val in ranges.items():
if pair_range[0] <= angle < pair_range[1]:
return val
return 0
def angles_to_nums(angles):
result = []
for angle in angles:
while angle < 0:
angle += 360
num = round_angle(angle) // 30
if num != 0:
result.append(num)
return result
def is_phone_tastic(word):
nums = text_to_nums(word)
angle = nums_to_angle(nums)
return angle % len(word) == 0

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

def nums_to_text(nums):
from itertools import groupby
dial_numbers = {
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"] }
result = []
for number, letters in groupby(nums):
index = len(list(letters)) - 1
if number == 0:
result.append(" ")
continue
elif number == 1 or number == -1:
continue
values = dial_numbers.get(number, None)
if values is not None:
result.append(values[index % len(values)])
else:
raise ValueError(f'Unrecognized input "{number}"')
return "".join(result)
def text_to_nums(text):
strings = {
"A": "2", "B": "22", "C": "222",
"D": "3", "E": "33", "F": "333",
"G": "4", "H": "44", "I": "444",
"J": "5", "K": "55", "L": "555",
"M": "6", "N": "66", "O": "666",
"P": "7", "Q": "77", "R": "777", "S": "7777",
"T": "8", "U": "88", "V": "888",
"W": "9", "X": "99", "Y": "999", "Z": "9999" }
temp = []
result = []
last_num = -1
for character in text:
if (character == ' '):
temp.append("0")
continue
else:
number = strings.get(character.upper(), None)
if number is None:
raise ValueError(f'Unrecognised input "{character}"')
curr_num = number[0]
if last_num == curr_num:
temp.append(-1)
temp.append(number)
last_num = curr_num
for el in temp:
if el == -1:
result.append(-1)
continue
if type(el) == str:
for char in el:
result.append(int(char) - int('0'))
return result
def nums_to_angle(nums):
sum = 0
for num in nums:
if num < 0:
continue
+ if num == 0:
+ sum += 300
+ continue
sum += num * 30
return sum % 360
def round_angle(angle):
ranges = {
(0, 15): 0,
(15, 45): 30,
(45, 75): 60,
(75, 105): 90,
(105, 135): 120,
(135, 165): 150,
(165, 195): 180,
(195, 225): 210,
(225, 255): 240,
(255, 285): 270,
(285, 315): 300,
- (315, 345): 330
+ (315, 345): 0
}
for pair_range, val in ranges.items():
- if pair_range[0] <= angle < pair_range[1]:
+ if pair_range[0] < angle <= pair_range[1]:
return val
return 0
def angles_to_nums(angles):
result = []
for angle in angles:
while angle < 0:
angle += 360
num = round_angle(angle) // 30
if num != 0:
result.append(num)
return result
def is_phone_tastic(word):
nums = text_to_nums(word)
angle = nums_to_angle(nums)
return angle % len(word) == 0

Йордан обнови решението на 02.11.2022 12:14 (преди над 1 година)

def nums_to_text(nums):
from itertools import groupby
dial_numbers = {
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"] }
result = []
for number, letters in groupby(nums):
index = len(list(letters)) - 1
if number == 0:
result.append(" ")
continue
elif number == 1 or number == -1:
continue
values = dial_numbers.get(number, None)
if values is not None:
result.append(values[index % len(values)])
else:
raise ValueError(f'Unrecognized input "{number}"')
return "".join(result)
def text_to_nums(text):
strings = {
"A": "2", "B": "22", "C": "222",
"D": "3", "E": "33", "F": "333",
"G": "4", "H": "44", "I": "444",
"J": "5", "K": "55", "L": "555",
"M": "6", "N": "66", "O": "666",
"P": "7", "Q": "77", "R": "777", "S": "7777",
"T": "8", "U": "88", "V": "888",
"W": "9", "X": "99", "Y": "999", "Z": "9999" }
temp = []
result = []
last_num = -1
for character in text:
if (character == ' '):
temp.append("0")
continue
else:
number = strings.get(character.upper(), None)
if number is None:
raise ValueError(f'Unrecognised input "{character}"')
curr_num = number[0]
if last_num == curr_num:
temp.append(-1)
temp.append(number)
last_num = curr_num
for el in temp:
if el == -1:
result.append(-1)
continue
if type(el) == str:
for char in el:
result.append(int(char) - int('0'))
return result
def nums_to_angle(nums):
sum = 0
for num in nums:
if num < 0:
continue
if num == 0:
sum += 300
continue
sum += num * 30
return sum % 360
def round_angle(angle):
ranges = {
(0, 15): 0,
(15, 45): 30,
(45, 75): 60,
(75, 105): 90,
(105, 135): 120,
(135, 165): 150,
(165, 195): 180,
(195, 225): 210,
(225, 255): 240,
(255, 285): 270,
(285, 315): 300,
(315, 345): 0
}
for pair_range, val in ranges.items():
if pair_range[0] < angle <= pair_range[1]:
return val
return 0
def angles_to_nums(angles):
result = []
for angle in angles:
while angle < 0:
angle += 360
num = round_angle(angle) // 30
-
+ if num >= 10:
+ num = 0
if num != 0:
result.append(num)
return result
def is_phone_tastic(word):
nums = text_to_nums(word)
angle = nums_to_angle(nums)
return angle % len(word) == 0