Соревнование: нахождение повторяющуейся последовательности в строке

Это вопрос-соревнование

Введение

Недавно пришла в голову такая задача: на входе дается строка, и нужно вывести наименьший период этой строки.

Описание

Вход

В единственной строке ввода записана последовательность символов, состоящая из английских букв любого регистра и цифр (длина <= 100).

Выход

На выход нужно вывести наименьший период строки на входе.

Если в строке нет повторяющейся последовательности, то нужно вывести её саму.

Критерии оценивания

Побеждает ответ, на котором 14.12.2022 будет максимум голосов.

Примеры

1.

вход выход
abcabc abc

Пояснение:

Наименьшим периодом строки abcabc является abc.

2.

вход выход
gnjhjgfl gnjhjgfl

Пояснение:

Строка gnjhjgfl не составлена из повторяющейся последовательности, значит нужно вывести её саму.

PS

Соревнование проводилось с 06.12.2022 по 21.12.2022, но ответы публиковать можно.

Если что-то осталось неясным, пожалуйста, пишите в комментариях, я постараюсь исправить.


Ответы (1 шт):

Автор решения: Vladimir Chistov

Мой вариант ответа такой:

s = input()

# Перебираем все длины, которые могут подойти.
for condidate in [c for c in range(1, len(s) // 2 + 1) if len(s) % c == 0]:
    repetions = [s[0:condidate]]                           # Заполням список
    for c in range(condidate * 2, len(s) + 1, condidate):  # повторений
        repetions.append(s[c - condidate:c])               # этой строки.
    for r in repetions:        # Проверям, что
        if r != repetions[0]:  # все элементы списка
            break              # равны между собой.
    else:                    # Цикл выше закончился
        print(repetions[0])  # без `break`, значит все равны.
        break                # Выводим ответ и остонавливаемся.
else:
    # Цикл выше закончился без `break`, значит повторов нет, выводим всю строку.
    print(s)

Пошаговое описание кода в комментрариях.

Пишите другие решения!

→ Ссылка