Рубрики
Без рубрики

Python Programming Challenge – Интервалы последовательных персонажей

Программирование Python Programming – интервалы последовательных символов. Забавный вызов Python для разработки навыков программирования и алгоритмического мышления.

Автор оригинала: 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. Чтобы сохранить в курсе новостей и предложений, почему бы не подписаться на нашу рассылку, если вы еще этого не зарегистрируетесь?

Счастливые вычисления!