Periode lokal
Ambil string yang tidak kosong s . The periode lokal dari s pada indeks i adalah yang terkecil bilangan bulat positif n sehingga untuk setiap 0 ≤ k <n ini, kami memiliki s [i + k] = s [i-n + k] setiap kali kedua sisi didefinisikan. Atau, itu adalah panjang minimum dari string kosong yang w sehingga jika gabungan ww ditempatkan di sebelah s sehingga salinan kedua w dimulai pada indeks i dari s , maka dua string setuju di mana pun mereka tumpang tindih.
Sebagai contoh, mari kita hitung periode lokal s = "abaabbab" di indeks (berbasis-0) 2.
- Coba n = 1 : lalu s [2 + 0] ≠ s [2-1 + 0] , jadi pilihan ini tidak benar.
- Coba n = 2 : lalu s [2 + 0] = s [2-2 + 0] tetapi s [2 + 1] ≠ s [2-2 + 1] , jadi ini juga tidak benar.
- Coba n = 3 : maka s [2 + 0-3] tidak didefinisikan, s [2 + 1] = s [2-3 + 1] dan s [2 + 2] = s [2-3 + 2] . Jadi periode lokal adalah 3.
Berikut adalah visualisasi periode lokal menggunakan definisi kedua, dengan titik koma ditambahkan di antara dua salinan w untuk kejelasan:
index a b a a b b a b period
0 a;a 1
1 b a;b a 2
2 a a b;a a b 3
3 a;a 1
4 b b a b a a;b b a b a a 6
5 b;b 1
6 a b b;a b b 3
7 b a;b a 2
Perhatikan bahwa w tidak harus merupakan substring dari s . Ini terjadi di sini dalam kasus indeks-4.
Tugas
Masukan Anda adalah tak kosong serangkaian s karakter ASCII huruf kecil. Itu dapat diambil sebagai daftar karakter jika diinginkan. Output Anda akan menjadi daftar yang berisi periode lokal s pada setiap indeksnya. Dalam contoh di atas, output yang benar adalah [1,2,3,1,6,1,3,2] .
Hitungan byte terendah di setiap bahasa menang. Aturan standar kode-golf berlaku.
Uji kasus
a -> [1]
hi -> [1, 2]
www -> [1, 1, 1]
xcxccxc -> [1, 2, 2, 5, 1, 3, 2]
abcbacb -> [1, 4, 7, 7, 7, 3, 3]
nininini -> [1, 2, 2, 2, 2, 2, 2, 2]
abaabbab -> [1, 2, 3, 1, 6, 1, 3, 2]
woppwoppw -> [1, 4, 4, 1, 4, 4, 4, 1, 4]
qwertyuiop -> [1, 10, 10, 10, 10, 10, 10, 10, 10, 10]
deededeededede -> [1, 3, 1, 5, 2, 2, 5, 1, 12, 2, 2, 2, 2, 2]
abababcabababcababcabababcaba -> [1, 2, 2, 2, 2, 7, 7, 7, 7, 2, 2, 2, 19, 19, 5, 5, 2, 5, 5, 12, 12, 2, 2, 2, 7, 7, 5, 5, 2]
qwertyuiop
, w akan menjadi versi yang diputarqwertyuiop
. Lihat juga contoh pada indeks 4: w belum tentu merupakan substring dari s .;
dalam contoh Anda). Itu akan menyingkirkan pemimpin 1.Jawaban:
Retina ,
8986 byteCobalah online! Sunting: Disimpan 3 byte berkat @MartinEnder. Penjelasan:
Pisahkan input di setiap karakter, buat sepasang garis, satu untuk awalan dan satu untuk akhiran awalan.
Jalankan sisa skrip pada setiap pasangan yang dihasilkan.
Temukan semua pertandingan yang tumpang tindih dan daftarkan hasilnya. (Lihat di bawah.)
Buang korek kosong.
Ambil durasi setiap pertandingan.
Sortir secara numerik.
Ambil yang terkecil.
Pencocokan bekerja dengan memisahkan awalan dan akhiran menjadi tiga bagian. Ada empat kasus yang valid untuk dipertimbangkan:
Karena itu regex hanya memungkinkan A dan C untuk mencocokkan satu sisi pada satu waktu.
sumber
$&$'
sama dengan$<'
dan panjang garis komputasi lebih pendek dengan%C`.
. tio.run/##K0otycxLNPz/X49LJeHQNhUb9UPbuPQ14mr0tDUPbdPT1o/…Java 8,
167154152 byte-2 byte terima kasih kepada @ceilingcat .
Cobalah online.
Penjelasan:
sumber
JavaScript (ES6), 84 byte
Mengambil input sebagai array karakter.
Uji kasus
Tampilkan cuplikan kode
sumber
Ruby ,
104102 byteCobalah online!
Lambda menerima string dan mengembalikan array.
-2 byte: Tukar titik akhir jangkauan dengan penjaga terikat indeks
Tidak Terkumpul:
sumber
Japt ,
3332 byteDisimpan 1 byte berkat @Shaggy
Uji secara online!
Penjelasan
Pikiran pertama saya adalah membandingkan setiap karakter di substring kiri dengan karakter yang sesuai di substring kanan, seperti pada jawaban JS. Itu tidak akan berhasil, bagaimanapun, sebagai metode Japt untuk mendapatkan karakter hanya membungkus ke ujung string jika indeks negatif atau terlalu besar.
Sebagai gantinya, solusi saya membangun regex dari substring kedua dan mengujinya pada substring pertama. Mari kita ambil item ke-5 dalam test-case
abaabbab
sebagai contoh:Trik utama yang
^
dapat dicocokkan tanpa batas, hingga karakter yang sebenarnya cocok. Ini memungkinkan kita mengabaikan sejumlah karakter dari awal regex, sambil memastikan bahwa sisanya semuanya dicocokkan secara berurutan, berakhir di akhir string uji.Saya tidak yakin saya sudah menjelaskan ini dengan baik, jadi tolong beri tahu saya jika ada sesuatu yang ingin Anda klarifikasi, atau hal lain yang harus dijelaskan.
sumber
C (gcc) ,
143142140139128126123 byte!b&&printf
untukb||printf
.for
kurung badan loop dengan menyulapprintf
penempatan.b+=S[i+k]!=S[i-n+k]
untukb|=S[i+k]-S[i-n+k]
.l=strlen(S)
dengan mengkondisikan kedua loop penanganan string agar putus saat mencapai ujung string (byte nol'\0'
).i-n+k>~0
untuki-n>~k
.b||printf("|"),n++
setara dengann+=b||printf("|")
.Cobalah online!
sumber
b||printf("%d,",n)
di dalam for-loop:i,b,k,n,l;f(char*S){for(l=strlen(S),i=-1;++i<l;)for(b=n=1;b;b||printf("%d,",n),n++)for(b=k=0;k<n;k++)i+k<l&i-n+k>=0&&(b+=S[i+k]!=S[i-n+k]);}
140 bytePython 2 , 115 byte
Cobalah online!
sumber