Đối xứng quay của chuỗi


9

Một vòng quay "được thực hiện bằng cách chia một chuỗi thành hai mảnh và đảo ngược thứ tự của chúng" . Một đối tượng là đối xứng trong một hoạt động nếu đối tượng không thay đổi sau khi áp dụng hoạt động nói. Vì vậy, một "đối xứng quay" là một chuỗi không thay đổi sau khi "xoay".

Cho một chuỗi không trống chỉ sbao gồm các chữ cái từ ađến z, xuất ra thứ tự cao nhất của đối xứng quay của chuỗi.

Testcase:

input        output
a            1
abcd         1
abab         2
dfdfdfdfdfdf 6

Đây là . Câu trả lời ngắn nhất trong byte thắng. Tiêu chuẩn áp dụng.



1
trước đây được hỏi dưới dạng CMC: chat.stackexchange.com/transcript/message/37509699#37509699
John Dvorak

Điều này giống như việc tìm số vòng quay đối xứng nhỏ hơn kích thước của chuỗi. Vì @ 0 'chỉ ra rằng chúng tạo thành một nhóm tuần hoàn, vì vậy việc tìm thứ tự cao nhất cũng giống như tìm kích thước của nhóm. Điều này sẽ làm cho lời giải thích của nhiệm vụ hiện chưa rõ ràng rõ ràng hơn nhiều.
Ad Hoc Garf Hunter

Câu trả lời:


8

Võng mạc , 15 byte

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

Hãy thử trực tuyến!

Khớp toàn bộ chuỗi bằng cách lặp lại một chuỗi con (các chuỗi con ngắn hơn được ưu tiên do sự không trung thành .+?) và thay thế toàn bộ chuỗi bằng số lần lặp lại mà chúng ta đã sử dụng.


Ồ, tất nhiên, vô duyên. Và đây là lúc tôi vật lộn với .*(.+)$(?<=^(\1)*)...
Neil

5

Xin chúc mừng!
Leaky Nun

@LeakyNun Đó là giải pháp của bạn, phải không?
Erik the Outgolfer

Thật vậy, nó đã được.
Nữ tu bị rò rỉ

Có phải tên của bạn là một tài liệu tham khảo Gauntlet?
user2357112 hỗ trợ Monica

@ user2357112 Không nói đến việc vượt trội, tức là khi bạn đăng một giải pháp ngắn hơn một giải pháp được đăng khác.
Erik the Outgolfer


2

Python, 31 byte

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

Tìm chỉ số khác không đầu tiên của sin s+sđể tìm ra khoảng cách chúng ta phải xoay nó để squay lại, sau đó chia độ dài scho số đó. Dựa trên ý tưởng tôi thấy ở nơi khác .


2

Prolog (SWI) , 64 byte

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

Hãy thử trực tuyến!

Xác định một vị từ +/2lấy một chuỗi (dưới dạng danh sách mã ký tự) làm đối số thứ nhất ( A) và đặt đối số thứ hai ( B) của nó theo thứ tự xoay đối xứng bậc cao nhất.

Giải trình

Chương trình này sử dụng thực tế là tập hợp các phép quay đối xứng trên một chuỗi là một nhóm tuần hoàn và do đó thứ tự của tập hợp các phép quay đối xứng bằng với thứ tự của phép quay đối xứng bậc cao nhất. Do đó, chương trình có thể tính toán kết quả mong muốn bằng cách tìm tổng số phép quay đối xứng trên chuỗi đầu vào.

Giải thích mã

Phần lớn của việc nâng vật nặng được thực hiện bằng một cuộc gọi đến findall/3vị ngữ. Vị findall/3ngữ tìm thấy tất cả các giá trị khác nhau có thể có cho đối số thứ nhất ( Xtrong trường hợp này) sao cho biểu thức được đưa ra làm đối số thứ hai là đúng ( (append(X,Y,A),append(Y,X,A)), nhiều hơn về điều đó sau). Cuối cùng, nó lưu trữ từng giá trị có thể này Xdưới dạng một danh sách trong đối số cuối cùng ( [_|Z]).

Biểu thức được truyền vào findall/3dưới dạng arugment thứ hai, (append(X,Y,A),append(Y,X,A))sử dụng biến append/3vị ngữ để xác định rằng Xnối với một số chưa được xác định Yphải bằng A, chuỗi đầu vào và cùng được Ynối với Xcũng phải bằng A. Điều này có nghĩa là Xphải có một số tiền tố Asao cho nếu nó được xóa khỏi mặt trước Avà thêm vào phía sau thì chuỗi kết quả giống như A. Tập hợp Xs với tính chất này gần như có sự tương ứng một-một với các phép quay đối xứng của A. Luôn luôn có chính xác một trường hợp đếm kép được gây ra bởi thực tế là cả chuỗi rỗng và Atiền tố củaAtương ứng với 0 vòng quay của A. Vì sự 0bảo vệ của Aluôn luôn đối xứng nên độ dài của danh sách kết quả của Xs findall/3sẽ lớn hơn số lần quay đối xứng trên A.

Để giải quyết vấn đề đếm kép, tôi sử dụng khớp mẫu trên đối số thứ ba của findall/3vị ngữ. Trong danh sách Prolog được thể hiện dưới dạng cặp đầu (phần tử đầu tiên) và đuôi của chúng (phần còn lại). Do đó, [_|Z]đại diện cho một danh sách có đuôi bằng với Z. Điều này có nghĩa là độ dài của Zmột ít hơn số lượng tiền tố được tìm thấy bởi findall/3vị ngữ và do đó bằng với số lần quay đối xứng của A. Cuối cùng, tôi sử dụng length/2vị ngữ để đặt thành Bđộ dài của Z.


2

JavaScript (ES6), 42 41 byte

Đã lưu 1 byte nhờ @ l4m2

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

Các trường hợp thử nghiệm


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

1

Japt , 7 byte

¬x@¥UéY

Kiểm tra nó trực tuyến!

Giải trình

 ¬ 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

Haskell , 49 byte

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

Hãy thử trực tuyến!

Haskell , 49 byte

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

Hãy thử trực tuyến!

Giải trình

Điều này sử dụng giải pháp đơn giản @ 0 'chỉ ra. Do các phép quay của chuỗi tạo thành một nhóm tuần hoàn, nên phần tử bậc cao nhất giống với kích thước của nhóm, do đó chúng ta có thể nhận được thứ tự của đơn vị bằng cách tìm số lần quay đối xứng.

Các mã đơn giản thực hiện việc hiểu danh sách và đếm số lần quay giữ chuỗi gốc.


Bạn có thể sử dụng drop<>takethay vì sử dụng (++)để lưu 3 byte, như thế này .
ბიმო

@BMO (<>)không phải là khúc dạo đầu, trong phiên bản Haskell tôi làm việc cùng.
Ad Hoc Garf Hunter
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.