Соревнование: нахождение повторяющуейся последовательности в строке
Это вопрос-соревнование
Введение
Недавно пришла в голову такая задача: на входе дается строка, и нужно вывести наименьший период этой строки.
Описание
Вход
В единственной строке ввода записана последовательность символов, состоящая из английских букв любого регистра и цифр (длина <= 100).
Выход
На выход нужно вывести наименьший период строки на входе.
Если в строке нет повторяющейся последовательности, то нужно вывести её саму.
Критерии оценивания
Побеждает ответ, на котором 14.12.2022 будет максимум голосов.
Примеры
1.
| вход | выход |
|---|---|
| abcabc | abc |
Пояснение:
Наименьшим периодом строки abcabc является abc.
2.
| вход | выход |
|---|---|
| gnjhjgfl | gnjhjgfl |
Пояснение:
Строка gnjhjgfl не составлена из повторяющейся последовательности, значит нужно вывести её саму.
PS
Соревнование проводилось с 06.12.2022 по 21.12.2022, но ответы публиковать можно.
Если что-то осталось неясным, пожалуйста, пишите в комментариях, я постараюсь исправить.
Ответы (1 шт):
Мой вариант ответа такой:
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)
Пошаговое описание кода в комментрариях.
Пишите другие решения!