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 s
yang terdiri dari hanya surat dari a
ke z
, output urutan tertinggi dari simetri rotasi string.
Testcases:
input output
a 1
abcd 1
abab 2
dfdfdfdfdfdf 6
Ini adalah kode-golf . Jawaban terpendek dalam byte menang. Celah standar berlaku.
code-golf
string
abstract-algebra
Biarawati Bocor
sumber
sumber
Jawaban:
Retina , 15 byte
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.sumber
.*(.+)$(?<=^(\1)*)
...Jelly , 3 byte
Cobalah online!
sumber
05AB1E , 8 byte
Cobalah online!
Penjelasan
sumber
Python, 31 byte
Cari indeks nol pertama
s
dis+s
untuk mencari tahu seberapa jauh kita harus memutar untuk mendapatkans
kembali, kemudian membagi panjangs
dengan nomor itu. Berdasarkan ide yang saya lihat di tempat lain .sumber
Prolog (SWI) , 64 byte
Cobalah online!
Mendefinisikan predikat
+/2
yang 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/3
predikat. Thefindall/3
predikat menemukan semua nilai yang berbeda yang mungkin untuk argumen pertama (X
dalam 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 mungkinX
sebagai daftar dalam argumen terakhir ([_|Z]
).Ekspresi dilewatkan
findall/3
sebagai arugment kedua,(append(X,Y,A),append(Y,X,A))
menggunakanappend/3
predikat untuk menentukan bahwaX
digabungkan dengan beberapa belum terdefinisiY
harus sama denganA
, string input, dan bahwaY
digabungkan dengan yang samaX
juga harus sama denganA
. Ini berarti bahwaX
harus ada beberapa awalanA
sehingga jika dihapus dari depanA
dan ditambahkan ke belakang maka string yang dihasilkan sama denganA
. HimpunanX
s dengan properti ini hampir memiliki korespondensi satu-ke-satu dengan rotasi simetrisA
. Selalu ada satu kasus penghitungan ganda yang disebabkan oleh fakta bahwa string kosong danA
awalanA
yang sesuai dengan 0-rotasiA
. Karena0
-rotasiA
selalu simetris, panjang dari daftarX
s yang dihasilkanfindall/3
akan lebih besar dari jumlah rotasi simetris yang aktifA
.Untuk mengatasi masalah penghitungan ganda, saya menggunakan pencocokan pola pada argumen ketiga dari
findall/3
predikat. Dalam daftar Prolog diwakili sebagai pasangan kepala mereka (elemen pertama) dan ekor mereka (sisanya). Dengan demikian[_|Z]
mewakili daftar yang ekornya sama denganZ
. Ini berarti bahwa panjangZ
satu kurang dari jumlah awalan yang ditemukan olehfindall/3
predikat dan dengan demikian sama dengan jumlah rotasi simetrisA
. Akhirnya, saya menggunakanlength/2
predikat untuk mengaturB
panjangZ
.sumber
JavaScript (ES6),
4241 byteDisimpan 1 byte berkat @ l4m2
Uji kasus
Tampilkan cuplikan kode
sumber
f=s=>s.length/s.match`(.+?)\\1*$`[1].length
Japt , 7 byte
Uji secara online!
Penjelasan
sumber
PHP, 66 Bytes
Cobalah online!
PHP, 67 Bytes
Cobalah online!
sumber
C (gcc) , 59 byte
Cobalah online!
sumber
Haskell , 49 byte
Cobalah online!
Haskell , 49 byte
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.
sumber
drop<>take
daripada menggunakan(++)
untuk menyimpan 3 byte, seperti ini .(<>)
tidak dalam pembukaan , dalam versi Haskell saya bekerja dengan.