Вращение «производится путем разделения строки на две части и изменения их порядка» . Объект является симметричным под операцией, если объект остается неизменным после применения указанной операции. Итак, «вращательная симметрия» - это тот факт, что строка остается неизменной после «вращения».
Учитывая непустую строку, s
состоящую только из букв от a
to z
, выведите наивысший порядок симметрии вращения строки.
Testcases:
input output
a 1
abcd 1
abab 2
dfdfdfdfdfdf 6
Это Код-гольф, Кратчайший ответ в байтах побеждает. Применяются стандартные лазейки .
code-golf
string
abstract-algebra
Дрянная Монахиня
источник
источник
Ответы:
Сетчатка , 15 байт
Попробуйте онлайн!
Сопоставляет всю строку, повторяя подстроку (более короткие подстроки расставлены по приоритетам из-за неловкости
.+?
), и заменяет всю строку на количество использованных нами повторений.источник
.*(.+)$(?<=^(\1)*)
...Желе , 3 байта
Попробуйте онлайн!
источник
05AB1E , 8 байтов
Попробуйте онлайн!
объяснение
источник
Python, 31 байт
Найдите первый ненулевой индекс
s
в,s+s
чтобы выяснить, как далеко мы должны повернуть его, чтобыs
вернуться, а затем разделить длинуs
на это число. Основанный на идеях, которые я видел в другом месте .источник
Пролог (SWI) , 64 байта
Попробуйте онлайн!
Определяет предикат,
+/2
который принимает строку (в форме списка кодов символов) в качестве первого аргумента (A
) и устанавливает свой второй аргумент (B
) в порядке симметричного вращения наивысшего порядка.объяснение
Эта программа использует тот факт, что множество симметричных вращений на струне является циклической группой, и поэтому порядок набора симметричных вращений равен порядку симметричного вращения высшего порядка. Таким образом, программа способна рассчитать желаемый результат, найдя общее количество симметричных поворотов во входной строке.
Код Объяснение
Большая часть тяжелой работы выполняется с помощью вызова
findall/3
предиката.findall/3
Предикат находит все различные возможные значения для первого аргумента (X
в данном случае) , так что выражение , приведенное в качестве второго аргумента является истинным ((append(X,Y,A),append(Y,X,A))
, об этом позже). Наконец, он сохраняет каждое из этих возможных значенийX
в виде списка в последнем аргументе ([_|Z]
).Выражение, переданное в
findall/3
качестве второго arugment,(append(X,Y,A),append(Y,X,A))
используетappend/3
предикат, чтобы указать, чтоX
конкатенация с некоторой, но еще не определенной,Y
должна быть равнаA
входной строке, и что та жеY
конкатенация сX
должна быть также равнаA
. Это означает, чтоX
должен быть некоторый префикс,A
такой, что если он будет удален с передней частиA
и добавлен с обратной стороны, то результирующая строка будет такой же, какA
. МножествоX
s с этим свойством почти имеет взаимно однозначное соответствие с симметричными поворотамиA
. Всегда существует ровно один случай двойного счета, который вызван тем фактом, что как пустая строка, так иA
являются префиксамиA
которые соответствуют 0-вращениюA
. Поскольку0
-ротацияA
всегда симметрична, длина результирующего спискаX
s изfindall/3
будет на единицу больше, чем число симметричных поворотов наA
.Чтобы решить проблему двойного счета, я использую сопоставление с образцом для третьего аргумента
findall/3
предиката. В Прологе списки представлены в виде пар их головы (первый элемент) и их хвоста (остальные). Таким образом[_|Z]
представляет список, хвост которого равен равенZ
. Это означает, что длина наZ
единицу меньше числа префиксов, найденныхfindall/3
предикатом, и, следовательно, равна количеству симметричных поворотовA
. Наконец, я используюlength/2
предикат для установкиB
длиныZ
.источник
JavaScript (ES6),
4241 байтСохранено 1 байт благодаря @ l4m2
Контрольные примеры
Показать фрагмент кода
источник
f=s=>s.length/s.match`(.+?)\\1*$`[1].length
Japt , 7 байт
Проверьте это онлайн!
объяснение
источник
PHP, 66 байт
Попробуйте онлайн!
PHP, 67 байт
Попробуйте онлайн!
источник
C (gcc) , 59 байт
Попробуйте онлайн!
источник
Haskell , 49 байтов
Попробуйте онлайн!
Haskell , 49 байтов
Попробуйте онлайн!
объяснение
Это использует простое решение @ 0 '. Поскольку вращения строки образуют циклическую группу, элемент высшего порядка совпадает с размером группы, поэтому мы можем получить порядок единицы, найдя число симметричных вращений.
Простые коды делают понимание списка и подсчитывают количество вращений, которые сохраняют исходную строку.
источник
drop<>take
вместо того,(++)
чтобы сохранить 3 байта, как это .(<>)
не в прелюдии, в версии Haskell, с которой я работаю.