Местные периоды
Возьмите непустую строку s . Локальный период из S в индексе я это наименьшее натуральное число п такое , что для каждого 0 ≤ к <п , мы имеем с [I + K] = s [я-п + K] всякий раз , когда обе стороны определены. С другой стороны , это минимальная длина непустой строки ж такое , что если конкатенация WW стоит рядом с так , что второй экземпляр ш начинается с индекса я в с , то две строки соглашаются , где они перекрываются.
В качестве примера давайте вычислим локальный период s = "abaabbab" с индексом 2 (на основе 0).
- Попробуйте n = 1 : тогда s [2 + 0] ≠ s [2-1 + 0] , поэтому этот выбор не верен.
- Попробуйте n = 2 : тогда s [2 + 0] = s [2-2 + 0], но s [2 + 1] ≠ s [2-2 + 1] , так что это тоже не правильно.
- Попробуйте n = 3 : тогда s [2 + 0-3] не определено, s [2 + 1] = s [2-3 + 1] и s [2 + 2] = s [2-3 + 2] . Таким образом, местный период равен 3.
Вот визуализация локальных периодов с использованием второго определения, с точкой с запятой, добавленной между двумя копиями w для ясности:
index a b a a b b a b period
0 a;a 1
1 b a;b a 2
2 a a b;a a b 3
3 a;a 1
4 b b a b a a;b b a b a a 6
5 b;b 1
6 a b b;a b b 3
7 b a;b a 2
Обратите внимание, что w не обязательно является подстрокой s . Это происходит здесь, в случае индекса 4.
Задание
Ваш вклад непустой строки s из строчных символов ASCII. При желании его можно принять за список символов. Ваш вывод должен быть списком, содержащим локальный период s для каждого из его индексов. В приведенном выше примере правильный вывод будет [1,2,3,1,6,1,3,2] .
Наименьшее количество байтов в каждом языке выигрывает. Применяются стандартные правила игры в гольф .
Контрольные примеры
a -> [1]
hi -> [1, 2]
www -> [1, 1, 1]
xcxccxc -> [1, 2, 2, 5, 1, 3, 2]
abcbacb -> [1, 4, 7, 7, 7, 3, 3]
nininini -> [1, 2, 2, 2, 2, 2, 2, 2]
abaabbab -> [1, 2, 3, 1, 6, 1, 3, 2]
woppwoppw -> [1, 4, 4, 1, 4, 4, 4, 1, 4]
qwertyuiop -> [1, 10, 10, 10, 10, 10, 10, 10, 10, 10]
deededeededede -> [1, 3, 1, 5, 2, 2, 5, 1, 12, 2, 2, 2, 2, 2]
abababcabababcababcabababcaba -> [1, 2, 2, 2, 2, 7, 7, 7, 7, 2, 2, 2, 19, 19, 5, 5, 2, 5, 5, 12, 12, 2, 2, 2, 7, 7, 5, 5, 2]
qwertyuiop
, w будет повернутой версиейqwertyuiop
. Смотрите также пример с индексом 4: w не обязательно является подстрокой s .;
в вашем примере). Это избавило бы от ведущих 1.Ответы:
Retina ,
8986 байтПопробуйте онлайн! Редактировать: 3 байта сохранены благодаря @MartinEnder. Объяснение:
Разделите ввод для каждого символа, создав пару строк, одну для префикса и одну для суффикса префикса.
Запустите оставшуюся часть сценария для каждой полученной пары.
Найдите все совпадающие совпадения и перечислите результаты. (См. ниже.)
Откажитесь от пустого матча.
Возьмите длину каждого матча.
Сортировать численно.
Бери самый маленький.
Сопоставление работает путем разделения префикса и суффикса на три части. Есть четыре допустимых случая для рассмотрения:
Поэтому регулярное выражение позволяет только A и C совпадать только на одной стороне одновременно.
источник
$&$'
равно$<'
и длина строки вычислений короче с%C`.
. tio.run/##K0otycxLNPz/X49LJeHQNhUb9UPbuPQ14mr0tDUPbdPT1o/…Java 8,
167154152 байта-2 байта благодаря @ceilingcat .
Попробуйте онлайн.
Объяснение:
источник
JavaScript (ES6), 84 байта
Принимает ввод как массив символов.
Контрольные примеры
Показать фрагмент кода
источник
Рубин ,
104102 байтаПопробуйте онлайн!
Лямбда, принимающая строку и возвращающая массив.
-2 байта: поменять местами конечные точки с ограничителями индекса
Ungolfed:
источник
Japt ,
3332 байтаСохранено 1 байт благодаря @Shaggy
Проверьте это онлайн!
объяснение
Моей первой мыслью было просто сравнить каждый символ в левой подстроке с соответствующим символом в правой подстроке, как в ответе JS. Однако это не сработает, поскольку метод Japt для получения символа просто переносится на другой конец строки, если индекс отрицательный или слишком большой.
Вместо этого мое решение создает регулярное выражение из второй подстроки и проверяет его на первой подстроке. Давайте возьмем 5-й элемент в тест-кейсе
abaabbab
в качестве примера:Основной трюк в том, что он
^
может совпадать бесконечно, вплоть до фактического соответствия персонажа. Это позволяет нам игнорировать любое количество символов от начала регулярного выражения, в то же время гарантируя, что все остальные сопоставляются последовательно, заканчивая в конце тестовой строки.Я не уверен, что объяснил это очень хорошо, поэтому, пожалуйста, дайте мне знать, если есть что-то, что вы хотели бы уточнить, или что-то еще, что следует объяснить.
источник
C (gcc) ,
143142140139128126123 байта!b&&printf
вb||printf
.for
круглые скобки тела цикла, манипулируяprintf
размещением.b+=S[i+k]!=S[i-n+k]
вb|=S[i+k]-S[i-n+k]
.l=strlen(S)
, чтобы оба цикла обработки строк обрывались при достижении конца строки (нулевой байт'\0'
).i-n+k>~0
вi-n>~k
.b||printf("|"),n++
эквивалентноn+=b||printf("|")
.Попробуйте онлайн!
источник
b||printf("%d,",n)
в цикл for:i,b,k,n,l;f(char*S){for(l=strlen(S),i=-1;++i<l;)for(b=n=1;b;b||printf("%d,",n),n++)for(b=k=0;k<n;k++)i+k<l&i-n+k>=0&&(b+=S[i+k]!=S[i-n+k]);}
140 байтовPython 2 , 115 байт
Попробуйте онлайн!
источник