Ротаційна симетрія струни


9

Поворот "робиться шляхом розбиття струни на дві частини та зміни їх порядку" . Об'єкт є симетричним під час операції, якщо об'єкт не змінюється після застосування зазначеної операції. Отже, "обертальна симетрія" - це той факт, що струна залишається незмінною після "обертання".

З огляду на не порожній рядок, sщо складається лише з літер від aдо z, вивести найвищий порядок обертової симетрії рядка.

Тести:

input        output
a            1
abcd         1
abab         2
dfdfdfdfdfdf 6

Це є . Найкоротша відповідь у байтах виграє. Застосовуються стандартні лазівки .




Це те саме, що знайти кількість симетричних обертів, менших за розмір рядка. Як вказує @ 0 ', вони утворюють циклічну групу, тож пошук вищого порядку такий же, як і розмір групи. Це зробить пояснення завдання, яке наразі є досить незрозумілим, набагато зрозумілішим.
Спеціальний мисливець на Garf Garf

Відповіді:


8

Сітківка , 15 байт

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

Спробуйте в Інтернеті!

Відповідає цілому рядку, повторюючи підрядку (коротші підряди є пріоритетними через недоступність .+?) та замінює всю нитку на кількість використаних нами повторів.


О, звичайно, нечестивий. І ось я боровся з .*(.+)$(?<=^(\1)*)
Ніл

5

Вітаємо!
Leaky Nun

@LeakyNun Це було ваше рішення, правда?
Ерік Атголфер

Справді, так і було.
Лина монашка

Ваше ім'я посилання на Рукавиця?
user2357112 підтримує Моніку

@ user2357112 Ні, це не стосується перевершення курсу, тобто коли ви публікуєте рішення, яке коротше, ніж інше розміщене рішення.
Ерік Аутгольфер


2

Пітон, 31 байт

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

Знайдіть перший ненульовий індекс sу, s+sщоб зрозуміти, наскільки нам потрібно повернути його, щоб sповернутися, а потім розділіть довжину sна це число. Спираючись на ідеї, які я бачив в іншому місці .


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як другий рухомий фрагмент, (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.


2

JavaScript (ES6), 42 41 байт

Збережено 1 байт завдяки @ l4m2

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

Тестові справи


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

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



0

Хаскелл , 49 байт

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

Спробуйте в Інтернеті!

Хаскелл , 49 байт

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

Спробуйте в Інтернеті!

Пояснення

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

Коди прості - це розуміння списку і підраховує кількість обертів, які зберігають початковий рядок.


Ви можете використовувати drop<>takeзамість цього, (++)щоб зберегти 3 байти, як це .
ბიმო

@BMO (<>)не в прелюдії, у версії Haskell, з якою я працюю.
Ad Hoc Hunter Hunter
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.