Quanto sono compatibili le mie corde?


12

introduzione

Considera due stringhe A e B della stessa lunghezza L e un numero intero K ≥ 0 . Ai fini di questa sfida, diciamo che le stringhe sono compatibili con K , se esiste una stringa C di lunghezza K tale che A è una sottostringa contigua della concatenazione BCB . Nota che A è una sottostringa di BAB , quindi A e B sono sempre compatibili con L (ma possono anche essere compatibili con K per qualche altro K <L ).

Ingresso

I tuoi input sono due stringhe della stessa lunghezza positiva, costituite da lettere ASCII maiuscole e minuscole.

Produzione

L'output deve essere il numero intero K non negativo più basso in modo tale che gli input siano compatibili con K.

Esempio

Considera gli input

A = HHHHHH
B = HHttHH

Non sono compatibili 0, perché A non è una sottostringa di HHttHHHHttHH. Inoltre, non sono compatibili 1, poiché A non è una sottostringa, HHttHH#HHttHHindipendentemente dalla lettera posizionata sul #. Tuttavia, A è una sottostringa di HHttHHHHHHttHH, dove C è la stringa di due lettere HH. Pertanto, gli ingressi sono compatibili 2 e l'uscita corretta è 2.

Regole e punteggio

È possibile scrivere un programma completo o una funzione. Vince il conteggio di byte più basso e non sono consentite scappatoie standard.

Casi test

La condizione di compatibilità è simmetrica, quindi lo scambio dei due ingressi non dovrebbe modificare l'uscita.

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

Classifica

Ecco uno snippet di stack per generare una classifica e un elenco di vincitori per lingua. Per assicurarti che la tua risposta venga visualizzata, avviala con un'intestazione del modulo

## Language, N bytes

Puoi mantenere i vecchi punteggi nell'intestazione usando i tag barrati: <s>57</s>appariranno come 57 .

Risposte:


8

Pyth, 16

lhf}QjT,vzvz+k.:

Trova la sottostringa più corta di A che, se inserita tra due copie di B, risulta in una stringa che contiene A.

Potrebbe essere più breve di due byte se la seconda riga non avesse virgolette, ma ti sembra strano?

Test Suite


4

Python 3, 155 168 157 byte

Il totale è la lunghezza di A. Confronta l'inizio Ae la fine di Be sottralo dal totale. Confronta l'inizio Be la fine di Ae sottralo dal totale. Restituisce il valore assoluto del totale a meno che il totale non sia uguale alla lunghezza, nel qual caso restituisce 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]

Modifica: gestisci il f("abcdab","cdabcd")==2caso


3
Purtroppo questo non funziona per il f("abcdab", "cdabcd")quale dovrebbe essere 2.
Neil

@Neil Buona cattura. Lo aggiungerò ai casi di test.
Zgarb,


@ mEQ5aNLrK3lqs3kfSa5HbvsTWe0nIu Stavo guardando l'immagine e pensando "Questa è un'idea ingegnosa di debugger per usare gli emoji, ma non vedo un bug ...". Penso che il componente aggiuntivo causerebbe il caos su questo sito.
NonlinearFruit

3

Retina , 49 byte

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

Provalo online! (Leggermente modificato per eseguire tutti i test contemporaneamente.)

Il trucco è che dobbiamo tornare indietro rispetto alla parte in Acui non ci troviamo B, e finora non ho trovato un modo per farlo senza piuttosto fastidiosi lookaround e gruppi di bilanciamento.


3

Jolf, 40 byte

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

Provalo!

Sono abbastanza nuovo per Jolf, ho imparato molto mentre lo capivo. Sembra un po 'imbarazzante, probabilmente potrebbe ancora essere golfato ulteriormente. Anche cancellato 2 byte mentre scrivevo questa spiegazione.

Spiegazione:

  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

Non ho provato sul serio, e questa potrebbe essere una soluzione ottimale, ma suggerisco di provare a mappare su intervalli. ( s0zliti darà un array [0 ... lunghezza i] se desideri provare questo approccio.)
Conor O'Brien,

@ Cᴏɴᴏʀ O'Bʀɪᴇɴ Hmm, darò uno sguardo ... c'è anche un comando if che ho ignorato mentre guardavo la documentazione / fonte o è l'unica opzione? con un terzo argomento irrilevante?
gonfia il

?è il più vicino a un se c'è in Jolf. È come un ternario se. ?ABCs returns B` se a è vero, e Caltrimenti.
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}

Funziona tagliando pezzi sempre più lunghi dal centro afino a quando non corrispondono alle due estremità di b. Il ciclo non è infinito in quanto si fermerà prima o poi i == a.length.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.