Sostituisci stringa fantasia


16

lasciare S, ae brappresentano ciascuno una stringa

Obiettivo: Scrivere una stringa standard funzione di sostituire in cui la si sostituisce tutte le occorrenze di auna stringa Scon bfintanto che anon sia già parte di un'istanza dib

per esempio, se abbiamo la stringa S=My oh my that there is a big ol' that

e volevamo fare una sostituzione sostanziosa a = that e b = that therevorremmo sostituire ogni istanza di thatcon that therefintanto che l'istanza di thatnon è già un esempio dithat there

Quindi in questo caso l'output sarebbe: My oh my that there is a big ol' that there

Il primo thatnon viene sostituito perché fa già parte di un'istanza dithat there

Appunti

  • Tutti e 3 gli input devono essere stringhe contenenti solo caratteri ASCII stampabili

  • L'input può essere dato come 3 stringhe separate o un elenco di 3 stringhe

  • Ingresso sarà nell'ordine S, a,b se non diversamente specificato nella risposta

  • Per aessere considerato parte di b, tutte le istanze di adevono essere parte di un'istanzab

Alcuni casi angolari hanno spiegato

Input:  ["1222", "22", "122"]
Output: "12122"

Nel caso sopra riportato, quest'ultimo 22viene sostituito. Anche se parte di essa fa parte di un'istanza di b, la totalità di essa NON fa parte dell'istanza di b. Poiché l'intera istanza di anon fa parte di un'istanza b, viene sostituita.

Input:  ["123 ", "23", "12"]
Output: "112 "

Questo caso di prova illustra lo stesso caso di cui sopra, ma forse in un modo leggermente più chiaro. Anche in questo caso la 2parte centrale è parte di un'istanza ae parte di un'istanza b, tuttavia poiché tutto anon fa parte dell'istanza b, viene comunque sostituito.

Input: ["Empty", "", "p"]
Output: "pEpmptpyp"

Nel caso di test sopra riportato, sia la stringa vuota prima che quella successiva pnon vengono sostituite in quanto possono essere interamente considerate parte dell'istanza dip .

Altri casi di test

Input:  ["aabbaa", "aa", "aabb"]
Output: "aabbaabb"

Input:  ["Hello World!", "o", " no"]
Output: "Hell no W norld!"

Input: ["Wow, oh wow, seriously WOW that's... wow", "wow", "WOW,"]
Output: "Wow, oh WOW,, seriously WOW that's... WOW,"

Input: ["Empty", "", "b"]
Output: "bEbmbpbtbyb"

Input: ["Empty", "b", "br"]
Output: "Empty"

Input: ["Empty", "pty", "Empty"]
Output: "Empty"

Input:  ["aabbaaa", "aa", "PP"]
Output: "PPbbPPa"

Input:  ["121212","1","121"]
Output: "121212"

Questa è una domanda per il code-golf, quindi vince la risposta più breve in byte.


Risposte:


6

Perl 6 , 76 byte

{$^b;$^a;&{S:g/$a<?{$!=$/;all m:ex/$b/>>.&{$!.to>.to||.from>$!.from}}>/$b/}}

Provalo online!

Blocco di codice anonimo che accetta input al curry, come f(a,b)(s) .

Sono abbastanza sicuro che questo corrisponda all'intento della domanda. Fondamentalmente, effettua la sostituzione solo se la posizione di anon rientra in nessuna delle partite sovrapposte di b.


2
tuttavia nei test c'è 2p: in pEpmpptpypinvece dipEpmptpyp
Nahuel Fouilleul il

@Nahuel Fixed. Questo dovrebbe anche gestire gli altri casi di test (e penso che sia il primo a farlo)
Jo King,

@JoKing Purtroppo dopo ripensare alcuni dei casi di test sottolineato, credo che l'ultimo test fallirà [ 1222, 22, 122] -> 12122. Ho aggiornato la domanda per chiarire e scusarmi di non aver reso più chiaro questo caso d'angolo in precedenza.
Quinn,

ho avuto un problema simile con s/(?!$b)$a/$b/g, quando $ a è vuoto perché la stringa vuota dopo pera corrispondente (?!p)avevo bisogno(?<!p)(?!p)
Nahuel Fouilleul,

1
@Quinn Risolto, penso?
Jo King,

5

Carbone , 55 byte

≔⁰εF⌕AθηF‹‹ιε⬤⌕Aθζ∨‹ικ›⁺ιLη⁺κLζ«≔⁺⁺ω✂θει¹ζω≔⁺ιLηε»⁺ω✂θε

Provalo online! Il collegamento è alla versione dettagliata del codice. Spiegazione:

≔⁰ε

Inizializza una variabile per mostrare dove è terminata l'ultima partita sostituita.

F⌕Aθη

Trova tutte le partite sovrapposte di ain S.

F‹‹ιε

Se la partita successiva non si sovrappone all'ultima sostituzione riuscita ...

⬤⌕Aθζ∨‹ικ›⁺ιLη⁺κLζ«

... e si sovrappone anche a nessuna copia di bin S...

≔⁺⁺ω✂θει¹ζω

... quindi concatena la sottostringa intermedia tra l'ultima corrispondenza e questa corrispondenza con bla stringa di output ...

≔⁺ιLηε

... e aggiorna l'ultima variabile di fine partita alla fine di questa nuova partita.

»⁺ω✂θε

Alla fine, aggiungi tutti i resti di Se stampa il risultato.


1
@tsh OK, questa è una riscrittura completa, spero che questo ora copra tutti i possibili casi ...
Neil

1
@Neil Credo che anche questo sia valido!
Quinn,

@Neil Credo che questo sia valido ora.
TSH

@Quinn Ooh, questo mi rende prima di rendere valida la loro risposta? ! Neat
Neil,

@Neil Credo che anche JoKing abbia una risposta valida
Quinn,

3

Wolfram Language (Mathematica) , 43 122 96 88 byte

##2~StringReplacePart~Cases[#2~P~#,{a_,b_}/;And@@(#2<b||#>a&@@@P@##2)]&
P=StringPosition

Provalo online!

+79: dovrebbe essere risolto.

Chiama come f[a,S,b].

                                                                      & (* a function which finds *)
                            #2~P~#,                                     (* the positions {start,end} where a occurs in S *)
                      Cases[       {a_,b_}/;And@@(#2<b||#>a&@@@     )]  (* which are not a subrange of any of the *)
                                                               P@##2    (* positions of b in S, *)
##2~StringReplacePart~                                                  (* and replaces those parts of the string with b *)
P=StringPosition

2
Non riesce per 121212, 1, 121 - dovrebbe essere visualizzato 121212
Falco il

@attinat Mi sembra risolto!
Quinn,

1

Perl 5 ( -lpF/;/), 41 byte

($_,$a,$b)=@F;s/(?<!(?=$b).)(?!$b)$a/$b/g

TIO


[ 1222, 22, 122] Dovrebbe uscita 12122, ma le uscite Distinti11222
Quinn

ok non l'ho capito, forse risolto, e più breve
Nahuel Fouilleul,

Oh no, in realtà l'ultimo caso di test ha troppi messaggi 12, la domanda che ho fatto è stata molto più difficile di quanto pensassi inizialmente!
Quinn,

@Quinn, mi sembra che non è coerente: 123, 23, 12-> 112ma 1212, 1, 121-> 1212(? Il motivo per cui non dovrebbe essere 121212)
Nahuel Fouilleul

sembra essere ciò che dovrebbe essere chiarito in quali posizioni Snon dovrebbero corrispondere bo in quale parte saltare prima di cercare la prossima partita
Nahuel Fouilleul,
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.