Simetri rotasi string


9

Rotasi "dibuat dengan memisahkan string menjadi dua bagian dan membalikkan urutannya" . Suatu objek simetris dalam suatu operasi jika objek tidak berubah setelah menerapkan operasi tersebut. Jadi, "simetri rotasi" adalah fakta bahwa string tetap tidak berubah setelah "rotasi".

Mengingat string non-kosong syang terdiri dari hanya surat dari ake z, output urutan tertinggi dari simetri rotasi string.

Testcases:

input        output
a            1
abcd         1
abab         2
dfdfdfdfdfdf 6

Ini adalah . Jawaban terpendek dalam byte menang. Celah standar berlaku.




Ini sama dengan menemukan jumlah rotasi simetris yang lebih kecil dari ukuran string. Sebagaimana @ 0 'tunjukkan, mereka membentuk grup siklik sehingga menemukan urutan tertinggi sama dengan menemukan ukuran grup. Ini akan membuat penjelasan tugas yang saat ini cukup jelas jauh lebih jelas.
Ad Hoc Garf Hunter

Jawaban:


8

Retina , 15 byte

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

Cobalah online!

Cocokkan seluruh string dengan mengulangi substring (substring yang lebih pendek diprioritaskan karena ungreedy .+?) dan mengganti seluruh string dengan jumlah repetisi yang kami gunakan.


Oh, tentu saja, tidak enak. Dan inilah saya berjuang dengan .*(.+)$(?<=^(\1)*)...
Neil


3

05AB1E , 8 byte

gGDÀ})QO

Cobalah online!

Penjelasan

gG  }      # len(input)-1 times do:
  D        # duplicate
   À       # rotate left
     )     # wrap result in a list
      Q    # compare each to input for equality
       O   # sum

2

Python, 31 byte

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

Cari indeks nol pertama sdi s+suntuk mencari tahu seberapa jauh kita harus memutar untuk mendapatkan skembali, kemudian membagi panjang sdengan nomor itu. Berdasarkan ide yang saya lihat di tempat lain .


2

Prolog (SWI) , 64 byte

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

Cobalah online!

Mendefinisikan predikat +/2yang mengambil string (dalam bentuk daftar kode karakter) sebagai argumen pertama ( A) dan menetapkan argumen kedua ( B) ke urutan rotasi simetris urutan tertinggi.

Penjelasan

Program ini menggunakan fakta bahwa himpunan rotasi simetris pada string adalah grup siklik sehingga urutan himpunan rotasi simetris sama dengan urutan rotasi simetris urutan tertinggi. Dengan demikian program ini dapat menghitung hasil yang diinginkan dengan menemukan jumlah total rotasi simetris pada string input.

Penjelasan Kode

Mayoritas pengangkatan berat dilakukan dengan panggilan ke findall/3predikat. The findall/3predikat menemukan semua nilai yang berbeda yang mungkin untuk argumen pertama ( Xdalam kasus ini) sehingga ekspresi yang diberikan sebagai argumen kedua adalah benar ( (append(X,Y,A),append(Y,X,A))lebih pada nanti). Akhirnya ia menyimpan masing-masing nilai yang mungkin Xsebagai daftar dalam argumen terakhir ( [_|Z]).

Ekspresi dilewatkan findall/3sebagai arugment kedua, (append(X,Y,A),append(Y,X,A))menggunakan append/3predikat untuk menentukan bahwa Xdigabungkan dengan beberapa belum terdefinisi Yharus sama dengan A, string input, dan bahwa Ydigabungkan dengan yang sama Xjuga harus sama dengan A. Ini berarti bahwa Xharus ada beberapa awalan Asehingga jika dihapus dari depan Adan ditambahkan ke belakang maka string yang dihasilkan sama dengan A. Himpunan Xs dengan properti ini hampir memiliki korespondensi satu-ke-satu dengan rotasi simetris A. Selalu ada satu kasus penghitungan ganda yang disebabkan oleh fakta bahwa string kosong dan AawalanAyang sesuai dengan 0-rotasi A. Karena 0-rotasi Aselalu simetris, panjang dari daftar Xs yang dihasilkan findall/3akan lebih besar dari jumlah rotasi simetris yang aktif A.

Untuk mengatasi masalah penghitungan ganda, saya menggunakan pencocokan pola pada argumen ketiga dari findall/3predikat. Dalam daftar Prolog diwakili sebagai pasangan kepala mereka (elemen pertama) dan ekor mereka (sisanya). Dengan demikian [_|Z]mewakili daftar yang ekornya sama dengan Z. Ini berarti bahwa panjang Zsatu kurang dari jumlah awalan yang ditemukan oleh findall/3predikat dan dengan demikian sama dengan jumlah rotasi simetris A. Akhirnya, saya menggunakan length/2predikat untuk mengatur Bpanjang Z.


2

JavaScript (ES6), 42 41 byte

Disimpan 1 byte berkat @ l4m2

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

Uji kasus


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

1

Japt , 7 byte

¬x@¥UéY

Uji secara online!

Penjelasan

 ¬ 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

C (gcc) , 59 byte

-Df(d,s)=for(d=n=strlen(s);n%d|memcmp(s,s+n/d,n-n/d);d--)

n;

Cobalah online!


tio harus disarankan agar flag complier dapat diputuskan ditambahkan ke dalam panjang kode
l4m2

0

Haskell , 49 byte

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

Cobalah online!

Haskell , 49 byte

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

Cobalah online!

Penjelasan

Ini menggunakan solusi sederhana yang ditunjukkan @ 0 '. Karena rotasi string membentuk grup siklik, elemen urutan tertinggi adalah sama dengan ukuran grup sehingga kita bisa mendapatkan urutan unit dengan menemukan jumlah rotasi simetris.

Kode-kode sederhana melakukan daftar pemahaman dan menghitung jumlah rotasi yang mempertahankan string asli.


Anda dapat menggunakan drop<>takedaripada menggunakan (++)untuk menyimpan 3 byte, seperti ini .
ბიმო

@BMO (<>)tidak dalam pembukaan , dalam versi Haskell saya bekerja dengan.
Ad Hoc Garf Hunter
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.