Автор оригинала: Robin Andrews.
Python Programming Challenge – Интервалы последовательных персонажей
Вот забавная проблема программирования Python:
Напишите функцию, которая принимает строку в качестве ввода и возвращает список кортежей, содержащих начало и конечное положение интервалов, содержащих каждый символ.
Этот алгоритм тесно связан с Кодировка длиной работы , что является формой сжатия данных. Вот функциональная заглушка вместе с несколькими утверждениями, чтобы выполнить задачу.
def find_intervals(data):
pass
data = 'A'
assert find_intervals(data) == [(0, 0, 'A')]
data = 'BBABBA'
assert find_intervals(data) == [(0, 1, 'B'), (2, 2, 'A'), (3, 4, 'B'), (5, 5, 'A')]
data = 'ABBAABBAA'
assert find_intervals(data) == [(0, 0, 'A'), (1, 2, 'B'), (3, 4, 'A'), (5, 6, 'B'), (7, 8, 'A')]
data = ''
assert find_intervals(data) is None
Ключ к этому алгоритму сравнивает каждый символ рядом с ним. Это может быть сделано либо «с нетерпением жду» «глядя назад» (подумайте I + 1 или I - 1 Если I – это ваша переменная петли). Этот вид логики поднимается несколькими общими алгоритмами, охватываемыми на курсах компьютерных наук, таких как сортировка вставки и пузырь.
Если вы не знакомы с Assert В Python это очень удобный способ настроить очень основные тесты. Если условие после Assert Ключевое слово правильное, ничего не отобразится, но если нет, вы получите AssertionError Когда вы запускаете код. Очевидно, с просто пройти В определении функции все утверждения потерпят неудачу.
Одна потенциальная трудность с таким алгоритмом, и что-то, что вы могли бы захотеть дать некоторую мысль заранее, это именно то, что должно быть диапазон итерации.
Промежучие интервалы Python Challenge.
Вот одно возможное решение последовательных интервалов:
def find_intervals(data):
if len(data) < 1:
return
intervals = []
current_char = data[0]
start_of_interval = 0
for i in range(len(data) - 1):
if data[i + 1] != current_char:
intervals.append((start_of_interval, i, current_char))
start_of_interval = i + 1
current_char = data[i + 1]
intervals.append((start_of_interval, len(data) - 1, current_char))
return intervals
data = 'A'
assert find_intervals(data) == [(0, 0, 'A')]
data = 'BBABBA'
assert find_intervals(data) == [(0, 1, 'B'), (2, 2, 'A'), (3, 4, 'B'), (5, 5, 'A')]
data = 'ABBAABBAA'
assert find_intervals(data) == [(0, 0, 'A'), (1, 2, 'B'), (3, 4, 'A'), (5, 6, 'B'), (7, 8, 'A')]
data = ''
assert find_intervals(data) is None
Уточнение в Python Specient Intervals Solution Solution
Данное решение работает, но вы можете заметить, что есть некоторое повторение кода, так как последний интервал обрабатывается отдельно. С помощью небольшого регулировки этот вопрос может быть адресована и может быть написано более компактное и элегантное решение. Подумайте о том, как вы можете сделать это и попытаться уточнить свое собственное решение, прежде чем смотреть на мой.
def find_intervals2(data):
if len(data) < 1:
return
data = data + "!"
intervals = []
current_char = data[0]
start_of_interval = 0
for i in range(len(data) - 1):
if data[i + 1] != current_char:
intervals.append((start_of_interval, i, current_char))
start_of_interval = i + 1
current_char = data[i + 1]
return intervals
data = 'A'
assert find_intervals2(data) == [(0, 0, 'A')]
data = 'BBABBA'
assert find_intervals2(data) == [(0, 1, 'B'), (2, 2, 'A'), (3, 4, 'B'), (5, 5, 'A')]
data = 'ABBAABBAA'
assert find_intervals2(data) == [(0, 0, 'A'), (1, 2, 'B'), (3, 4, 'A'), (5, 6, 'B'), (7, 8, 'A')]
data = ''
assert find_intervals2(data) is None
То, что мы сделали здесь, было добавить «манекен» персонажа, чтобы позволить нам полностью повторять строку. Что вы думаете об этом решении? В этом конкретном примере мы не экономяли огромное количество кода. Однако, если в повторном коде было больше программных операторов, преимущества второго подхода могут быть более значительными. Это, безусловно, полезное и интересное упражнение, чтобы прийти с альтернативными подходами к решению такой же проблемы.
Я надеюсь, вам понравился этот вызов программирования Python. Чтобы сохранить в курсе новостей и предложений, почему бы не подписаться на нашу рассылку, если вы еще этого не зарегистрируетесь?
Счастливые вычисления!