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.

Biarawati Bocor
sumber
Terkait
Martin Ender
1
sebelumnya ditanya sebagai CMC: chat.stackexchange.com/transcript/message/37509699#37509699
John Dvorak
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.

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

Jelly , 3 byte

ṙJċ

Cobalah online!

Erik the Outgolfer
sumber
Selamat!
Leaky Nun
@ LeakyNun Itu solusi Anda, bukan?
Erik the Outgolfer
Memang benar.
Leaky Nun
Apakah nama Anda referensi Gauntlet?
user2357112 mendukung Monica
@ user2357112 Tidak itu mengacu pada outgolfing yaitu ketika Anda memposting solusi yang lebih pendek dari solusi diposting lainnya.
Erik the Outgolfer
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
Emigna
sumber
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 .

user2357112 mendukung Monica
sumber
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.

0 '
sumber
2

JavaScript (ES6), 42 41 byte

Disimpan 1 byte berkat @ l4m2

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

Uji kasus

Arnauld
sumber
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
Produksi ETH
sumber
0

PHP, 66 Bytes

for(;strtr($a=$argn,[substr($a,0,++$i)=>""]););echo strlen($a)/$i;

Cobalah online!

PHP, 67 Bytes

preg_match('#^(.+?)\1*$#',$argn,$t);echo substr_count($argn,$t[1]);

Cobalah online!

Jörg Hülsermann
sumber
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!

l4m2
sumber
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.

Ad Hoc Garf Hunter
sumber
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