Вращательная симметрия струны

9

Вращение «производится путем разделения строки на две части и изменения их порядка» . Объект является симметричным под операцией, если объект остается неизменным после применения указанной операции. Итак, «вращательная симметрия» - это тот факт, что строка остается неизменной после «вращения».

Учитывая непустую строку, sсостоящую только из букв от ato z, выведите наивысший порядок симметрии вращения строки.

Testcases:

input        output
a            1
abcd         1
abab         2
dfdfdfdfdfdf 6

Это , Кратчайший ответ в байтах побеждает. Применяются стандартные лазейки .

Дрянная Монахиня
источник
Связанные с.
Мартин Эндер
1
ранее задавался как CMC: chat.stackexchange.com/transcript/message/37509699#37509699
Джон Дворжак
Это то же самое, что найти число симметричных вращений, меньших, чем размер строки. Как указывает @ 0 ', они образуют циклическую группу, поэтому нахождение наивысшего порядка аналогично нахождению размера группы. Это сделало бы объяснение задачи, которое в настоящее время довольно неясным, намного понятнее.
Ad Hoc Garf Hunter

Ответы:

8

Сетчатка , 15 байт

(^.+?|\1)+$
$#1

Попробуйте онлайн!

Сопоставляет всю строку, повторяя подстроку (более короткие подстроки расставлены по приоритетам из-за неловкости .+?), и заменяет всю строку на количество использованных нами повторений.

Мартин Эндер
источник
О, конечно же, неуклюжий. И вот я боролся с .*(.+)$(?<=^(\1)*)...
Нил
5

Желе , 3 байта

ṙJċ

Попробуйте онлайн!

Эрик Аутгольфер
источник
Поздравляем!
Дрянная Монахиня
@ LeakyNun Это было ваше решение, верно?
Эрик Outgolfer
Действительно, так и было.
Утренняя монахиня
Является ли ваше имя Gauntlet ссылкой?
user2357112 поддерживает Monica
@ user2357112 Нет, это относится к outgolfing, т.е. когда вы публикуете решение, которое короче, чем другое опубликованное решение.
Эрик Outgolfer
2

Python, 31 байт

lambda s:len(s)/(s+s).find(s,1)

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

user2357112 поддерживает Monica
источник
2

Пролог (SWI) , 64 байта

A+B:-findall(X,(append(X,Y,A),append(Y,X,A)),[_|Z]),length(Z,B).

Попробуйте онлайн!

Определяет предикат, +/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. Множество Xs с этим свойством почти имеет взаимно однозначное соответствие с симметричными поворотами A. Всегда существует ровно один случай двойного счета, который вызван тем фактом, что как пустая строка, так и Aявляются префиксамиAкоторые соответствуют 0-вращению A. Поскольку 0-ротация Aвсегда симметрична, длина результирующего списка Xs из findall/3будет на единицу больше, чем число симметричных поворотов на A.

Чтобы решить проблему двойного счета, я использую сопоставление с образцом для третьего аргумента findall/3предиката. В Прологе списки представлены в виде пар их головы (первый элемент) и их хвоста (остальные). Таким образом [_|Z]представляет список, хвост которого равен равен Z. Это означает, что длина на Zединицу меньше числа префиксов, найденных findall/3предикатом, и, следовательно, равна количеству симметричных поворотов A. Наконец, я использую length/2предикат для установки Bдлины Z.

0 '
источник
2

JavaScript (ES6), 42 41 байт

Сохранено 1 байт благодаря @ l4m2

s=>s.length/s.match`(.+?)\\1*$`[1].length

Контрольные примеры

Arnauld
источник
f=s=>s.length/s.match`(.+?)\\1*$`[1].length
14 м2
1

Japt , 7 байт

¬x@¥UéY

Проверьте это онлайн!

объяснение

 ¬ x@   ¥ UéY
 q xXY{ ==UéY}  // Expanded
Uq xXY{U==UéY}  // Variable introduction
                // Implicit: U = input string
Uq              // Split U into chars.
   xXY{      }  // Map each item X and index Y by this function, then sum the results:
       U==UéY   //   Return U equals (U rotated by Y characters).
                // Implicit: output result of last expression
ETHproductions
источник
0

Haskell , 49 байтов

g x=sum[1|a<-[1..length x],drop a x++take a x==x]

Попробуйте онлайн!

Haskell , 49 байтов

g x=sum[1|(a,_)<-zip[1..]x,drop a x++take a x==x]

Попробуйте онлайн!

объяснение

Это использует простое решение @ 0 '. Поскольку вращения строки образуют циклическую группу, элемент высшего порядка совпадает с размером группы, поэтому мы можем получить порядок единицы, найдя число симметричных вращений.

Простые коды делают понимание списка и подсчитывают количество вращений, которые сохраняют исходную строку.

Специальный охотник за гарфами
источник
Вы можете использовать drop<>takeвместо того, (++)чтобы сохранить 3 байта, как это .
ბიმო
@BMO (<>)не в прелюдии, в версии Haskell, с которой я работаю.
Специальный охотник за