Решение на Телефонна любов от Боян Богданов

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

Към профила на Боян Богданов

Резултати

  • 6 точки от тестове
  • 0 бонус точки
  • 6 точки общо
  • 24 успешни тест(а)
  • 13 неуспешни тест(а)

Код

keyboard = {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: [' ']}
# digits -> degrees
dial_digits = {x: x * 30 for x in range(1, 10)}
dial_digits.update({0: 300})
# degrees -> digits
dial_degrees = {degree: digit for digit, degree in dial_digits.items()}
def append_letter(message, button_digit, press_cnt):
letters = keyboard.get(button_digit)
if press_cnt > len(letters):
press_cnt = press_cnt % len(letters)
letter = letters[press_cnt - 1]
message += letter
return message
def normalize_angle(angle, strict=True):
if angle >= 360:
angle = angle - ((round(angle / 360) - 1) * 360)
if angle < 0:
while (angle < 0):
angle += 360
if strict == True and angle >= 330 or angle <= 0:
return None
return angle
def normalize_angles(angles):
normalized_angles = []
for angle in angles:
normalized = normalize_angle(angle)
if normalized is not None:
normalized_angles.append(normalized)
return normalized_angles
def round_angles(angles):
def round_angle(angle):
return 30 * round(angle / 30)
return list(map(round_angle, angles))
def nums_to_text(nums):
# While seeing the same number - increment counter
# If we see a different number - reset counter
# If we see -1 - reset counter and number
message = ''
prev_digit = nums[0]
press_cnt = 1
for curr_digit in nums[1:]:
if curr_digit != -1 and keyboard.get(curr_digit) == None:
continue
if curr_digit == prev_digit and curr_digit != -1:
press_cnt += 1
continue
message = append_letter(message, prev_digit, press_cnt)
if curr_digit != -1:
prev_digit = curr_digit
press_cnt = 1
else:
press_cnt = 0
message = append_letter(message, prev_digit, press_cnt)
return message
def text_to_nums(text):
text = text.upper()
button = None
nums = []
for char in text:
for items in keyboard.items():
if char in items[1]:
if button == items[0]:
nums.append(-1)
button = items[0]
break
index = keyboard.get(button).index(char)
nums.extend([button] * (index + 1))
return nums
def nums_to_angle(nums, strict=True):
total_angle = 0
for num in nums:
curr_angle = dial_digits.get(num)
if curr_angle is not None:
total_angle += curr_angle
return normalize_angle(total_angle, strict)
def angles_to_nums(angles):
angles = normalize_angles(round_angles(angles))
res = []
for angle in angles:
res.append(dial_degrees.get(angle))
return res
def is_phone_tastic(word):
letter_count = len(word)
digits = text_to_nums(word)
angle = nums_to_angle(digits, False)
return angle % letter_count == 0

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

......FFF.E...F..FF.E.EFF.E..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
TypeError: unsupported operand type(s) for %: 'NoneType' and 'int'

======================================================================
ERROR: test_all_chars (test.TestNumsToText)
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
TypeError: object of type 'NoneType' has no len()

======================================================================
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

======================================================================
ERROR: test_random_mixed_case (test.TestNumsToText)
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
TypeError: object of type 'NoneType' has no len()

======================================================================
ERROR: test_starting_with_timeout (test.TestNumsToText)
Test with a sequence starting 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
TypeError: object of type 'NoneType' has no len()

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

First differing element 5:
8
1

Second list contains 1 additional elements.
First extra element 8:
9

- [5, 1, 2, 4, 9, 8, 0, 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_empty_input (test.TestNumsToAngles)
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
AssertionError: None != 0

======================================================================
FAIL: test_normalizing_for_top_boundary (test.TestNumsToAngles)
Test normalizing when the sum is full circle.
----------------------------------------------------------------------
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: None != 0

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

======================================================================
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.360s

FAILED (failures=8, errors=5)

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

Боян обнови решението на 30.10.2022 11:17 (преди над 1 година)

+keyboard = {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: [' ']}
+
+# digits -> degrees
+dial_digits = {x: x * 30 for x in range(1,10)}
+dial_digits.update({0:300})
+
+# degrees -> digits
+dial_degrees = {degree: digit for digit,degree in dial_digits.items()}
+
+def nums_to_text(nums):
+ # While seeing the same number - increment counter
+ # If we see a different number - reset counter
+ # If we see -1 - reset counter and number
+ message = ''
+
+ prevNumber = nums[0]
+ pressCount = 1
+ for currNumber in nums[1:]:
+ if (currNumber != -1 and keyboard.get(currNumber) == None):
+ continue
+ if (currNumber == prevNumber and currNumber != -1):
+ pressCount += 1
+ continue
+
+ message = append_letter(message, prevNumber, pressCount)
+
+ if (currNumber != -1):
+ prevNumber = currNumber
+ pressCount = 1
+ else:
+ pressCount = 0
+
+ message = append_letter(message, prevNumber, pressCount)
+ return message
+
+def text_to_nums(text):
+ text = text.upper()
+ button = None
+ nums = []
+ for c in text:
+ for items in keyboard.items():
+ if (c in items[1]):
+ if(button == items[0]):
+ nums.append(-1)
+ button = items[0]
+ break
+ index = keyboard.get(button).index(c)
+ nums.extend([button] * (index + 1))
+ return nums
+
+def nums_to_angle(nums,strict = True):
+ total_angle = 0
+ for num in nums:
+ curr_angle = dial_digits.get(num)
+ if(curr_angle is not None):
+ total_angle += curr_angle
+
+ return normalize_angle(total_angle,strict)
+
+def angles_to_nums(angles):
+ angles = normalize_angles(round_angles(angles))
+ res = []
+ for angle in angles:
+ res.append(dial_degrees.get(angle))
+ return res
+
+def is_phone_tastic(word):
+ letter_count = len(word)
+ digits = text_to_nums(word)
+ angle = nums_to_angle(digits,False)
+ if(angle % letter_count == 0):
+ return True
+
+ return False
+
+
+def append_letter(message, buttonNumber, pressCnt):
+ letters = keyboard.get(buttonNumber)
+ if (pressCnt > len(letters)):
+ pressCnt = pressCnt % len(letters)
+
+ letter = letters[pressCnt - 1]
+ message += letter
+ return message
+
+def normalize_angle(angle,strict = True):
+ if(angle >= 360):
+ angle = angle - ((round(angle / 360) - 1) * 360)
+ if(angle < 0):
+ while(angle < 0):
+ angle += 360
+ if(strict == True and angle >= 330 or angle <= 0):
+ return None
+ return angle
+
+def normalize_angles(angles):
+ normalized_angles = []
+ for angle in angles:
+ normalized = normalize_angle(angle)
+ if(normalized is not None):
+ normalized_angles.append(normalized)
+
+ return normalized_angles
+
+def round_angles(angles):
+ def round_angle(angle):
+ return 30 * round(angle / 30)
+ return list(map(round_angle,angles))

Боян обнови решението на 30.10.2022 11:22 (преди над 1 година)

keyboard = {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: [' ']}
# digits -> degrees
dial_digits = {x: x * 30 for x in range(1,10)}
dial_digits.update({0:300})
# degrees -> digits
dial_degrees = {degree: digit for digit,degree in dial_digits.items()}
def nums_to_text(nums):
# While seeing the same number - increment counter
# If we see a different number - reset counter
# If we see -1 - reset counter and number
message = ''
- prevNumber = nums[0]
- pressCount = 1
- for currNumber in nums[1:]:
- if (currNumber != -1 and keyboard.get(currNumber) == None):
+ prev_digit = nums[0]
+ press_cnt = 1
+ for curr_digit in nums[1:]:
+ if (curr_digit != -1 and keyboard.get(curr_digit) == None):
continue
- if (currNumber == prevNumber and currNumber != -1):
- pressCount += 1
+ if (curr_digit == prev_digit and curr_digit != -1):
+ press_cnt += 1
continue
- message = append_letter(message, prevNumber, pressCount)
+ message = append_letter(message, prev_digit, press_cnt)
- if (currNumber != -1):
- prevNumber = currNumber
- pressCount = 1
+ if (curr_digit != -1):
+ prev_digit = curr_digit
+ press_cnt = 1
else:
- pressCount = 0
+ press_cnt = 0
- message = append_letter(message, prevNumber, pressCount)
+ message = append_letter(message, prev_digit, press_cnt)
return message
def text_to_nums(text):
text = text.upper()
button = None
nums = []
for c in text:
for items in keyboard.items():
if (c in items[1]):
if(button == items[0]):
nums.append(-1)
button = items[0]
break
index = keyboard.get(button).index(c)
nums.extend([button] * (index + 1))
return nums
def nums_to_angle(nums,strict = True):
total_angle = 0
for num in nums:
curr_angle = dial_digits.get(num)
if(curr_angle is not None):
total_angle += curr_angle
return normalize_angle(total_angle,strict)
def angles_to_nums(angles):
angles = normalize_angles(round_angles(angles))
res = []
for angle in angles:
res.append(dial_degrees.get(angle))
return res
def is_phone_tastic(word):
letter_count = len(word)
digits = text_to_nums(word)
angle = nums_to_angle(digits,False)
if(angle % letter_count == 0):
return True
return False
-def append_letter(message, buttonNumber, pressCnt):
- letters = keyboard.get(buttonNumber)
- if (pressCnt > len(letters)):
- pressCnt = pressCnt % len(letters)
+def append_letter(message, button_digit, press_cnt):
+ letters = keyboard.get(button_digit)
+ if (press_cnt > len(letters)):
+ press_cnt = press_cnt % len(letters)
- letter = letters[pressCnt - 1]
+ letter = letters[press_cnt - 1]
message += letter
return message
def normalize_angle(angle,strict = True):
if(angle >= 360):
angle = angle - ((round(angle / 360) - 1) * 360)
if(angle < 0):
while(angle < 0):
angle += 360
if(strict == True and angle >= 330 or angle <= 0):
return None
return angle
def normalize_angles(angles):
normalized_angles = []
for angle in angles:
normalized = normalize_angle(angle)
if(normalized is not None):
normalized_angles.append(normalized)
return normalized_angles
def round_angles(angles):
def round_angle(angle):
return 30 * round(angle / 30)
return list(map(round_angle,angles))

Боян обнови решението на 30.10.2022 11:22 (преди над 1 година)

keyboard = {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: [' ']}
# digits -> degrees
-dial_digits = {x: x * 30 for x in range(1,10)}
-dial_digits.update({0:300})
+dial_digits = {x: x * 30 for x in range(1, 10)}
+dial_digits.update({0: 300})
# degrees -> digits
-dial_degrees = {degree: digit for digit,degree in dial_digits.items()}
+dial_degrees = {degree: digit for digit, degree in dial_digits.items()}
+
def nums_to_text(nums):
# While seeing the same number - increment counter
# If we see a different number - reset counter
# If we see -1 - reset counter and number
message = ''
prev_digit = nums[0]
press_cnt = 1
for curr_digit in nums[1:]:
if (curr_digit != -1 and keyboard.get(curr_digit) == None):
continue
if (curr_digit == prev_digit and curr_digit != -1):
press_cnt += 1
continue
message = append_letter(message, prev_digit, press_cnt)
if (curr_digit != -1):
prev_digit = curr_digit
press_cnt = 1
else:
press_cnt = 0
message = append_letter(message, prev_digit, press_cnt)
return message
+
def text_to_nums(text):
text = text.upper()
button = None
nums = []
for items in keyboard.items():
if (c in items[1]):
- if(button == items[0]):
+ if (button == items[0]):
nums.append(-1)
button = items[0]
break
index = keyboard.get(button).index(c)
nums.extend([button] * (index + 1))
return nums
-def nums_to_angle(nums,strict = True):
+
+def nums_to_angle(nums, strict=True):
total_angle = 0
for num in nums:
curr_angle = dial_digits.get(num)
- if(curr_angle is not None):
+ if (curr_angle is not None):
total_angle += curr_angle
- return normalize_angle(total_angle,strict)
+ return normalize_angle(total_angle, strict)
+
def angles_to_nums(angles):
angles = normalize_angles(round_angles(angles))
res = []
for angle in angles:
res.append(dial_degrees.get(angle))
return res
+
def is_phone_tastic(word):
letter_count = len(word)
digits = text_to_nums(word)
- angle = nums_to_angle(digits,False)
- if(angle % letter_count == 0):
+ angle = nums_to_angle(digits, False)
+ if (angle % letter_count == 0):
return True
return False
def append_letter(message, button_digit, press_cnt):
letters = keyboard.get(button_digit)
if (press_cnt > len(letters)):
press_cnt = press_cnt % len(letters)
letter = letters[press_cnt - 1]
message += letter
return message
-def normalize_angle(angle,strict = True):
- if(angle >= 360):
+
+def normalize_angle(angle, strict=True):
+ if (angle >= 360):
angle = angle - ((round(angle / 360) - 1) * 360)
- if(angle < 0):
- while(angle < 0):
+ if (angle < 0):
+ while (angle < 0):
angle += 360
- if(strict == True and angle >= 330 or angle <= 0):
+ if (strict == True and angle >= 330 or angle <= 0):
return None
- return angle
+ return angle
+
def normalize_angles(angles):
normalized_angles = []
for angle in angles:
normalized = normalize_angle(angle)
- if(normalized is not None):
+ if (normalized is not None):
normalized_angles.append(normalized)
return normalized_angles
+
def round_angles(angles):
def round_angle(angle):
return 30 * round(angle / 30)
- return list(map(round_angle,angles))
+ return list(map(round_angle, angles))

Боян обнови решението на 31.10.2022 10:36 (преди над 1 година)

keyboard = {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: [' ']}
# digits -> degrees
dial_digits = {x: x * 30 for x in range(1, 10)}
dial_digits.update({0: 300})
# degrees -> digits
dial_degrees = {degree: digit for digit, degree in dial_digits.items()}
+def append_letter(message, button_digit, press_cnt):
+ letters = keyboard.get(button_digit)
+ if press_cnt > len(letters):
+ press_cnt = press_cnt % len(letters)
+
+ letter = letters[press_cnt - 1]
+ message += letter
+ return message
+
+
+def normalize_angle(angle, strict=True):
+ if angle >= 360:
+ angle = angle - ((round(angle / 360) - 1) * 360)
+ if angle < 0:
+ while (angle < 0):
+ angle += 360
+ if strict == True and angle >= 330 or angle <= 0:
+ return None
+ return angle
+
+
+def normalize_angles(angles):
+ normalized_angles = []
+ for angle in angles:
+ normalized = normalize_angle(angle)
+ if normalized is not None:
+ normalized_angles.append(normalized)
+
+ return normalized_angles
+
+
+def round_angles(angles):
+ def round_angle(angle):
+ return 30 * round(angle / 30)
+ return list(map(round_angle, angles))
+
+
def nums_to_text(nums):
# While seeing the same number - increment counter
# If we see a different number - reset counter
# If we see -1 - reset counter and number
message = ''
prev_digit = nums[0]
press_cnt = 1
for curr_digit in nums[1:]:
- if (curr_digit != -1 and keyboard.get(curr_digit) == None):
+ if curr_digit != -1 and keyboard.get(curr_digit) == None:
continue
- if (curr_digit == prev_digit and curr_digit != -1):
+ if curr_digit == prev_digit and curr_digit != -1:
press_cnt += 1
continue
message = append_letter(message, prev_digit, press_cnt)
- if (curr_digit != -1):
+ if curr_digit != -1:
prev_digit = curr_digit
press_cnt = 1
else:
press_cnt = 0
message = append_letter(message, prev_digit, press_cnt)
return message
def text_to_nums(text):
text = text.upper()
button = None
nums = []
- for c in text:
+ for char in text:
for items in keyboard.items():
- if (c in items[1]):
- if (button == items[0]):
+ if char in items[1]:
+ if button == items[0]:
nums.append(-1)
button = items[0]
break
- index = keyboard.get(button).index(c)
+ index = keyboard.get(button).index(char)
nums.extend([button] * (index + 1))
return nums
def nums_to_angle(nums, strict=True):
total_angle = 0
for num in nums:
curr_angle = dial_digits.get(num)
- if (curr_angle is not None):
+ if curr_angle is not None:
total_angle += curr_angle
return normalize_angle(total_angle, strict)
def angles_to_nums(angles):
angles = normalize_angles(round_angles(angles))
res = []
for angle in angles:
res.append(dial_degrees.get(angle))
return res
def is_phone_tastic(word):
letter_count = len(word)
digits = text_to_nums(word)
angle = nums_to_angle(digits, False)
- if (angle % letter_count == 0):
- return True
+ return angle % letter_count == 0
-
- return False
-
-
-def append_letter(message, button_digit, press_cnt):
- letters = keyboard.get(button_digit)
- if (press_cnt > len(letters)):
- press_cnt = press_cnt % len(letters)
-
- letter = letters[press_cnt - 1]
- message += letter
- return message
-
-
-def normalize_angle(angle, strict=True):
- if (angle >= 360):
- angle = angle - ((round(angle / 360) - 1) * 360)
- if (angle < 0):
- while (angle < 0):
- angle += 360
- if (strict == True and angle >= 330 or angle <= 0):
- return None
- return angle
-
-
-def normalize_angles(angles):
- normalized_angles = []
- for angle in angles:
- normalized = normalize_angle(angle)
- if (normalized is not None):
- normalized_angles.append(normalized)
-
- return normalized_angles
-
-
-def round_angles(angles):
- def round_angle(angle):
- return 30 * round(angle / 30)
- return list(map(round_angle, angles))