Решение на Телефонна любов от Сузана Петкова

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

Към профила на Сузана Петкова

Резултати

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

Код

alphabet = {
' ': (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)
}
angles_map = {
1: 30, 2: 60, 3: 90, 4: 120, 5: 150, 6: 180, 7: 210, 8: 240, 9: 270, 0: 300
}
def nums_to_text(nums):
clicks = 1
message = []
commands = []
numbers_length = len(nums)
i = 0
flag = True
while i < numbers_length:
while flag:
if i + 1 == numbers_length or nums[i] == -1:
break
elif nums[i] == nums[i + 1]:
clicks += 1
i += 1
else:
flag = False
if nums[i] in (7, 9) and clicks >= 4:
temp = clicks % 4
if temp == 0:
clicks = 4
else:
clicks = temp % 4
elif clicks > 3:
temp = clicks % 3
if temp == 0:
clicks = 3
else:
clicks = temp % 3
commands.append((nums[i], clicks))
i += 1
clicks = 1
flag = True
for command in commands:
for key, value in alphabet.items():
if value == command:
message.append(key)
elif value[0] == 0 and value[1] != 1:
message.append(' ')
return "".join(message)
def text_to_nums(text):
letters = [letter.upper() for letter in text]
numbers = []
for letter in letters:
num, count = alphabet[letter]
if numbers:
if num == numbers[len(numbers) - 1]:
numbers.append(-1)
numbers.extend([num] * count)
return numbers
def nums_to_angle(nums):
sum_ = 0
nums = [num for num in nums if num >= 0]
for num in nums:
sum_ += angles_map[num]
if sum_ >= 360:
remainder = int(sum_ / 360)
return sum_ - 360 * remainder
return sum_
def angles_to_nums(angles):
numbers = []
format_angles = []
for angle in angles:
if angle < 0:
angle += 360
if angle in range(359):
remainder = angle % 30
if remainder == 0:
format_angles.append(angle)
elif remainder < 16:
angle -= remainder
format_angles.append(angle)
else:
angle -= remainder
angle += 30
format_angles.append(angle)
else:
remainder1 = int(angle / 360)
angle -= 360 * remainder1
if angle < 30:
angle += (30-angle)
format_angles.append(angle)
for angle in format_angles:
for key, value in angles_map.items():
if value == angle:
numbers.append(key)
return numbers
def is_phone_tastic(word):
result = nums_to_angle(text_to_nums(word))
if word:
return result % len(word) == 0
return False

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

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

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

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


----------------------------------------------------------------------
Ran 37 tests in 0.341s

FAILED (failures=1)

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

Сузана обнови решението на 30.10.2022 14:06 (преди над 1 година)

+alphabet = {
+ ' ': (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)
+}
+
+angles_map = {
+ 1: 30, 2: 60, 3: 90, 4: 120, 5: 150, 6: 180, 7: 210, 8: 240, 9: 270, 0: 300
+}
+
+
+def nums_to_text(nums):
+ clicks = 1
+ message = []
+ commands = []
+ numbers_length = len(nums)
+ i = 0
+ flag = True
+ while numbers_length:

Може да греша, но логиката, която едновременно повишава i и понижава numbers_length, ще пропусне някои символи. Виждам, че си взела мерки за промяната на тези променливи при определени условия, но все пак имам предчуствие, че лоигаката се чупи в конкретни случаи. Съветвам те да изтестваш добре, за да си сигурна, че не съм прав.

Дори да работи правилно, този похват е доста "чуплив" и труден за разбиране от читателя, така че те съветвам да се опиташ да инкрементираш само една променлива.

+ while flag:
+ if i + 1 == len(nums) or nums[i] == -1:
+ break
+ elif nums[i] == nums[i + 1]:
+ clicks += 1
+ i += 1
+ else:
+ flag = False
+ commands.append((nums[i], clicks))
+ i += 1
+ numbers_length -= clicks
+ clicks = 1
+ flag = True
+
+ for command in commands:
+ code = alphabet.items()
+ for key, letter in code:

Да, горният коментар е нужен, за да знаеш за други проекти, но като цяло и този цикъл е излишне. Можеш просто да вземеш елемент от dict по ключ: alphabet['letter'] или alphabet.get('letter'), застраховайки се с отделна проверка, че резултатът не е None или exception, в случай на нужда.

+ if letter == command:
+ message.append(key)
+
+ return "".join(message)
+
+
+def text_to_nums(text):
+ letters = [letter.upper() for letter in text]
+ numbers = []
+ for letter in letters:
+ num, count = alphabet[letter]
+ for i in range(count):
+ numbers.append(num)
+ return numbers
+
+
+def nums_to_angle(nums):
+ sum_ = 0
+ for num in nums:
+ sum_ += angles_map[num]
+ if sum_ >= 360:
+ return sum_ - 360
+ return sum_
+
+
+def angles_to_nums(angles):
+ numbers = []
+ for angle in angles:
+ if angle < 0:
+ angle = 360 + angle
+ if 15 < angle < 45:
+ numbers.append(1)
+ elif 45 <= angle < 75:
+ numbers.append(2)
+ elif 75 <= angle < 105:
+ numbers.append(3)
+ elif 105 <= angle < 135:
+ numbers.append(4)
+ elif 135 <= angle < 165:
+ numbers.append(5)
+ elif 165 <= angle < 195:
+ numbers.append(6)
+ elif 195 <= angle < 225:
+ numbers.append(7)
+ elif 225 <= angle < 255:
+ numbers.append(8)
+ elif 255 <= angle < 285:
+ numbers.append(9)
+ return numbers
+
+
+def is_phone_tastic(word):
+ result = nums_to_angle(text_to_nums(word))
+ if result % 30 == 0:
+ return True
+ else:
+ return False

Сузана обнови решението на 31.10.2022 18:00 (преди над 1 година)

alphabet = {
' ': (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)
}
angles_map = {
1: 30, 2: 60, 3: 90, 4: 120, 5: 150, 6: 180, 7: 210, 8: 240, 9: 270, 0: 300
}
def nums_to_text(nums):
clicks = 1
message = []
commands = []
numbers_length = len(nums)
i = 0
flag = True
- while numbers_length:
+ while i < numbers_length:
while flag:
- if i + 1 == len(nums) or nums[i] == -1:
+ if i + 1 == numbers_length or nums[i] == -1:
break
elif nums[i] == nums[i + 1]:
clicks += 1
i += 1
else:
flag = False
+ if nums[i] in (7, 9) and clicks > 4:
+ temp = clicks % 4
+ if temp == 0:
+ clicks = 4
+ else:
+ clicks = temp % 4
+ elif clicks > 3:
+ temp = clicks % 3
+ if temp == 0:
+ clicks = 3
+ else:
+ clicks = temp % 3
commands.append((nums[i], clicks))
i += 1
- numbers_length -= clicks
+ # numbers_length -= clicks
clicks = 1
flag = True
for command in commands:
- code = alphabet.items()
- for key, letter in code:
- if letter == command:
+ for key, value in alphabet.items():
+ if value == command:
message.append(key)
return "".join(message)
def text_to_nums(text):
letters = [letter.upper() for letter in text]
numbers = []
for letter in letters:
num, count = alphabet[letter]
- for i in range(count):
- numbers.append(num)
+ numbers.extend([num] * count)
return numbers
def nums_to_angle(nums):
sum_ = 0
for num in nums:
sum_ += angles_map[num]
if sum_ >= 360:
return sum_ - 360
return sum_
def angles_to_nums(angles):
numbers = []
+ format_angles = []
for angle in angles:
- if angle < 0:
- angle = 360 + angle
- if 15 < angle < 45:
- numbers.append(1)
- elif 45 <= angle < 75:
- numbers.append(2)
- elif 75 <= angle < 105:
- numbers.append(3)
- elif 105 <= angle < 135:
- numbers.append(4)
- elif 135 <= angle < 165:
- numbers.append(5)
- elif 165 <= angle < 195:
- numbers.append(6)
- elif 195 <= angle < 225:
- numbers.append(7)
- elif 225 <= angle < 255:
- numbers.append(8)
- elif 255 <= angle < 285:
- numbers.append(9)
+ if angle in range(359):
+ temp = angle % 30
+ if temp == 0:
+ format_angles.append(angle)
+ elif temp < 16:
+ angle -= temp
+ format_angles.append(angle)
+ else:
+ angle -= temp
+ angle += 30
+ format_angles.append(angle)
+ else:
+ angle += 360
+ angles.append(angle)
+
+ for angle in format_angles:
+ for key, value in angles_map.items():
+ if value == angle:
+ numbers.append(key)
return numbers
def is_phone_tastic(word):
result = nums_to_angle(text_to_nums(word))
- if result % 30 == 0:
- return True
+ return result % len(word) == 0
- else:
- return False

Сузана обнови решението на 02.11.2022 11:23 (преди над 1 година)

alphabet = {
' ': (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)
}
angles_map = {
1: 30, 2: 60, 3: 90, 4: 120, 5: 150, 6: 180, 7: 210, 8: 240, 9: 270, 0: 300
}
def nums_to_text(nums):
clicks = 1
message = []
commands = []
numbers_length = len(nums)
i = 0
flag = True
while i < numbers_length:
while flag:
if i + 1 == numbers_length or nums[i] == -1:
break
elif nums[i] == nums[i + 1]:
clicks += 1
i += 1
else:
flag = False
- if nums[i] in (7, 9) and clicks > 4:
+ if nums[i] in (7, 9) and clicks >= 4:
temp = clicks % 4
if temp == 0:
clicks = 4
else:
clicks = temp % 4
elif clicks > 3:
temp = clicks % 3
if temp == 0:
clicks = 3
else:
clicks = temp % 3
commands.append((nums[i], clicks))
i += 1
- # numbers_length -= clicks
clicks = 1
flag = True
for command in commands:
for key, value in alphabet.items():
if value == command:
message.append(key)
+ elif value[0] == 0 and value[1] != 1:
+ message.append(' ')
return "".join(message)
def text_to_nums(text):
letters = [letter.upper() for letter in text]
numbers = []
for letter in letters:
num, count = alphabet[letter]
+ if numbers:
+ if num == numbers[len(numbers) - 1]:
+ numbers.append(-1)
+
numbers.extend([num] * count)
return numbers
def nums_to_angle(nums):
sum_ = 0
+ nums = [num for num in nums if num > 0 ]
for num in nums:
sum_ += angles_map[num]
if sum_ >= 360:
- return sum_ - 360
+ remainder = int(sum_ / 360)
+ return sum_ - 360 * remainder
return sum_
def angles_to_nums(angles):
numbers = []
format_angles = []
for angle in angles:
+ if angle < 0:
+ angle += 360
if angle in range(359):
- temp = angle % 30
- if temp == 0:
+ remainder = angle % 30
+ if remainder == 0:
format_angles.append(angle)
- elif temp < 16:
- angle -= temp
+ elif remainder < 16:
+ angle -= remainder
format_angles.append(angle)
else:
- angle -= temp
+ angle -= remainder
angle += 30
format_angles.append(angle)
else:
- angle += 360
- angles.append(angle)
+ remainder1 = int(angle / 360)
+ angle -= 360 * remainder1
+ format_angles.append(angle)
for angle in format_angles:
for key, value in angles_map.items():
if value == angle:
numbers.append(key)
return numbers
def is_phone_tastic(word):
result = nums_to_angle(text_to_nums(word))
return result % len(word) == 0

Сузана обнови решението на 03.11.2022 16:01 (преди над 1 година)

alphabet = {
' ': (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)
}
angles_map = {
1: 30, 2: 60, 3: 90, 4: 120, 5: 150, 6: 180, 7: 210, 8: 240, 9: 270, 0: 300
}
def nums_to_text(nums):
clicks = 1
message = []
commands = []
numbers_length = len(nums)
i = 0
flag = True
while i < numbers_length:
while flag:
if i + 1 == numbers_length or nums[i] == -1:
break
elif nums[i] == nums[i + 1]:
clicks += 1
i += 1
else:
flag = False
if nums[i] in (7, 9) and clicks >= 4:
temp = clicks % 4
if temp == 0:
clicks = 4
else:
clicks = temp % 4
elif clicks > 3:
temp = clicks % 3
if temp == 0:
clicks = 3
else:
clicks = temp % 3
commands.append((nums[i], clicks))
i += 1
clicks = 1
flag = True
for command in commands:
for key, value in alphabet.items():
if value == command:
message.append(key)
elif value[0] == 0 and value[1] != 1:
message.append(' ')
return "".join(message)
def text_to_nums(text):
letters = [letter.upper() for letter in text]
numbers = []
for letter in letters:
num, count = alphabet[letter]
if numbers:
if num == numbers[len(numbers) - 1]:
numbers.append(-1)
numbers.extend([num] * count)
return numbers
def nums_to_angle(nums):
sum_ = 0
- nums = [num for num in nums if num > 0 ]
+ nums = [num for num in nums if num >= 0]
for num in nums:
sum_ += angles_map[num]
if sum_ >= 360:
remainder = int(sum_ / 360)
return sum_ - 360 * remainder
return sum_
def angles_to_nums(angles):
numbers = []
format_angles = []
for angle in angles:
if angle < 0:
angle += 360
if angle in range(359):
remainder = angle % 30
if remainder == 0:
format_angles.append(angle)
elif remainder < 16:
angle -= remainder
format_angles.append(angle)
else:
angle -= remainder
angle += 30
format_angles.append(angle)
else:
remainder1 = int(angle / 360)
angle -= 360 * remainder1
+ if angle < 30:
+ angle += (30-angle)
format_angles.append(angle)
for angle in format_angles:
for key, value in angles_map.items():
if value == angle:
numbers.append(key)
return numbers
def is_phone_tastic(word):
result = nums_to_angle(text_to_nums(word))
- return result % len(word) == 0
+ if word:
+ return result % len(word) == 0
+ return False