Seberapa kompatibel string saya?

12

pengantar

Pertimbangkan dua string A dan B dengan panjang L yang sama , dan bilangan bulat K ≥ 0 . Untuk keperluan tantangan ini, kami mengatakan bahwa string adalah K -compatible, jika ada string C dengan panjang K sehingga A adalah substring yang berdekatan dari Rangkaian BCB . Perhatikan bahwa A adalah substring dari BAB , jadi A dan B selalu kompatibel dengan L (tetapi juga bisa kompatibel dengan K untuk beberapa K <L lainnya ).

Memasukkan

Input Anda adalah dua string dengan panjang positif yang sama, terdiri dari huruf ASCII huruf besar dan kecil.

Keluaran

Output Anda harus bilangan bulat non-negatif K paling rendah sehingga inputnya kompatibel dengan K.

Contoh

Pertimbangkan inputnya

A = HHHHHH
B = HHttHH

Mereka tidak 0-kompatibel, karena A bukan substring dari HHttHHHHttHH. Mereka juga tidak kompatibel dengan 1, karena A bukan substring dari HHttHH#HHttHHhuruf apa pun yang ditempatkan pada #. Namun, A adalah substring dari HHttHHHHHHttHH, di mana C adalah string dua huruf HH. Jadi inputnya kompatibel dengan 2, dan output yang benar adalah 2.

Aturan dan penilaian

Anda dapat menulis program atau fungsi lengkap. Hitungan byte terendah menang, dan celah standar tidak diizinkan.

Uji kasus

Kondisi kompatibilitas simetris, jadi menukar kedua input seharusnya tidak mengubah output.

E G -> 1
E E -> 0
aB Bc -> 1
YY tY -> 1
abcd bcda -> 0
abcXd bxcda -> 4
Hello Hello -> 0
Hello olHel -> 1
aBaXYa aXYaBa -> 1
aXYaBa aBaXYa -> 1
HHHHHH HHttHH -> 2
abcdab cdabcd -> 2
XRRXXXXR XRXXRXXR -> 4
evveeetev tetevevev -> 7
vzzvzJvJJz vJJvzJJvJz -> 10
JJfcfJJcfJfb JcfJfbbJJJfJ -> 5
GhhaaHHbbhGGH HHaaHHbbGGGhh -> 9
OyDGqyDGDOGOGyG yDGqOGqDyyyyOyD -> 12
ffKKBBpGfGKpfGpbKb fGpbKbpBBBffbbbffK -> 9
UZuPPZuPdVdtuDdDiuddUPtUidtVVV dtUPtUidtVVVtDZbZZPuiUZuPPZuPd -> 21

Papan peringkat

Berikut Cuplikan Stack untuk menghasilkan papan peringkat dan daftar pemenang berdasarkan bahasa. Untuk memastikan jawaban Anda muncul, mulailah dengan tajuk formulir

## Language, N bytes

Anda dapat menyimpan skor lama di header dengan menggunakan tag dicoret: <s>57</s>akan muncul sebagai 57 .

Zgarb
sumber

Jawaban:

8

Pyth, 16

lhf}QjT,vzvz+k.:

Temukan substring terpendek dari A yang bila disisipkan di antara dua salinan B menghasilkan string yang berisi A.

Ini bisa menjadi dua byte lebih pendek jika baris kedua tidak memiliki tanda kutip, tetapi itu terasa aneh?

Test Suite

FryAmTheEggman
sumber
4

Python 3, 155 168 157 byte

Total adalah panjang A. Bandingkan awal Ahingga akhir Bdan kurangi dari total. Bandingkan awal Bhingga akhir Adan kurangi dari total. Mengembalikan nilai absolut dari total kecuali total sama dengan panjang, dalam hal ini mengembalikan 0.

def f(A,B):
    T=L=len(A)
    C=D=1
    for i in range(L,0,-1):
        if A[:i]==B[-i:]and C:
            T,C=T-i,0
        if A[-i:]==B[:i]and D:
            T,D=T-i,0
    return (0,abs(T))[T!=-L]

Edit: Menangani f("abcdab","cdabcd")==2kasus

Buah Nonlinier
sumber
3
Sayangnya ini tidak bekerja untuk f("abcdab", "cdabcd")yang seharusnya 2.
Neil
@Neil Tangkapan yang bagus. Saya akan menambahkan itu ke kasus uji.
Zgarb
@ mEQ5aNLrK3lqs3kfSa5HbvsTWe0nIu Saya melihat gambar dan berpikir 'Ini adalah ide debugger yang bagus untuk menggunakan emoji, tapi saya tidak melihat bug ...'. Saya pikir add-on itu akan mendatangkan malapetaka di situs ini.
NonlinearFruit
3

Retina , 49 byte

.*?(?<=^(?=(.*)(?<4-3>.)*(.*) \2.*\1$)(.)*).+
$#4

Cobalah online! (Sedikit dimodifikasi untuk menjalankan semua tes sekaligus.)

Kuncinya adalah kita harus menelusuri kembali bagian Ayang tidak kita temukan B, dan sejauh ini saya belum menemukan cara untuk melakukan ini tanpa mencari - cari yang mengganggu dan menyeimbangkan kelompok.

Martin Ender
sumber
3

Jolf, 40 Bytes

Wά)Ζ0W<ζli)? h++i]Iζ+ζniIoά0nΖhζ}onhn}wn

Cobalah!

Saya cukup baru untuk Jolf, belajar banyak sambil mencari tahu ini. Tampaknya agak canggung, mungkin masih bisa bermain golf lebih jauh. Bahkan terlempar 2 byte saat menulis penjelasan ini.

Penjelasan:

  Wά)                                      While ά (initialized to 16)
     Ζ0                                    Set ζ to 0
       W<ζli)                              While ζ < length(A)
             ? h++i]Iζ+ζniIoά0n            Set ά to 0 if (A + a substring from B of length n + A) contains B
                               Ζhζ         Increment ζ
                                  }onhn    Increment n (initialize to 0
                                       }wn Decrement n and print
membengkak
sumber
Saya belum mencoba dengan sungguh-sungguh, dan ini mungkin solusi yang optimal, tetapi saya sarankan mencoba memetakan rentang. ( s0zliakan memberi Anda array [0 ... panjang saya] jika Anda ingin mencoba pendekatan ini.)
Conor O'Brien
@ Cᴏɴᴏʀ O'Bʀɪᴇɴ Hmm, saya akan melihat itu ... juga apakah ada perintah if yang saya lontarkan sambil melihat dokumentasi / sumber atau satu-satunya pilihan? dengan argumen ketiga yang tidak relevan?
Mengembang
?adalah yang paling dekat dengan jika ada di Jolf. Ini seperti terner jika. ?ABCs returns B` jika a benar, dan Csebaliknya.
Conor O'Brien
2

JavaScript (ES6), 110 byte

(a,b)=>{for(i=0;;i++)for(j=i;j<=a.length;j++)if(b.startsWith(a.slice(j))&&b.endsWith(a.slice(0,j-i)))return i}

Bekerja dengan mengiris potongan yang lebih panjang dari tengah ahingga cocok dengan kedua ujungnya b. Pengulangan tidak terbatas karena akan berhenti pada atau sebelumnya i == a.length.

Neil
sumber