Ausgefallene Zeichenfolge ersetzen

16

lassen S, aund bjeweils einen String

Ziel: Schreiben Funktion eine Standardzeichenfolge ersetzen , wo die Sie alle Vorkommen ersetzen ain einem String Smit bsolange anicht bereits Teil einer Instanzb

Zum Beispiel, wenn wir den String S= habenMy oh my that there is a big ol' that

und wir wollten ein schickes Ersetzen mit machen a = thatund b = that therewir würden jede Instanz von thatmit ersetzen, that theresolange die Instanz von thatnicht bereits eine Instanz von istthat there

In diesem Fall wäre die Ausgabe also: My oh my that there is a big ol' that there

Das erste thatwird nicht ersetzt, da es bereits Teil einer Instanz von istthat there

Anmerkungen

  • Alle 3 Eingaben müssen Zeichenfolgen sein, die nur druckbare ASCII-Zeichen enthalten

  • Die Eingabe kann als 3 separate Zeichenfolgen oder als Liste mit 3 Zeichenfolgen erfolgen

  • Eingang in der Reihenfolge sein S, a, bwenn nicht anders in der Antwort angegeben

  • Um aals Teil von betrachtet zu werden b, muss die gesamte Instanz von aTeil einer Instanz seinb

Einige Eckfälle erklärt

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

Im obigen Beispiel wird letzteres 22ersetzt. Auch wenn ein Teil davon Teil einer Instanz von ist b, ist die Gesamtheit davon NICHT Teil der Instanz von b. Da die gesamte Instanz von anicht Teil einer Instanz bist, wird sie ersetzt.

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

Dieser Testfall zeigt den gleichen Fall wie oben, aber vielleicht etwas deutlicher. Wiederum ist das 2in der Mitte sowohl Teil einer Instanz aals auch Teil einer Instanz von b, da jedoch nicht alles von aTeil der Instanz bist, wird es noch ersetzt.

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

Im obigen Testfall werden sowohl der leere String vor als auch nach dem pnicht ersetzt, da der String vollständig als Teil der Instanz von betrachtet werden kann p.

Andere Testfälle

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"

Dies ist eine Frage für Code-Golf, so dass die kürzeste Antwort in Bytes gewinnt.

Quinn
quelle
Lassen Sie uns diese Diskussion im Chat fortsetzen .
Quinn

Antworten:

6

Perl 6 , 76 Bytes

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

Probieren Sie es online!

Anonymer Codeblock, der Eingaben wie Curry annimmt f(a,b)(s).

Ich bin mir ziemlich sicher, dass dies mit der Absicht der Frage übereinstimmt. Grundsätzlich wird nur dann ausgewechselt, wenn die Position von anicht in einer der überlappenden Übereinstimmungen von liegt b.

Scherzen
quelle
2
In Tests gibt es jedoch 2p: in pEpmpptpypanstelle vonpEpmptpyp
Nahuel Fouilleul
@Nahuel Behoben. Dies sollte auch für die anderen Testfälle gelten (und ich denke, dies ist der erste, der dies tut)
Jo King,
@JoKing Leider nachdem sie einige der Testfälle hingewiesen Umdenken, ich glaube , der letzte Testfall fehl [ 1222, 22, 122] -> 12122. Ich habe die Frage aktualisiert, um zu verdeutlichen und mich zu entschuldigen, dass ich diesen Eckfall zuvor nicht klarer formuliert habe.
Quinn
Ich hatte ein ähnliches Problem mit s/(?!$b)$a/$b/g, wenn $ a leer ist, weil leere Zeichenfolge nach dem pMatching (?!p)ich brauchte(?<!p)(?!p)
Nahuel Fouilleul
1
@Quinn Behoben denke ich?
Jo King
5

Holzkohle , 55 Bytes

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:

≔⁰ε

Initialisieren Sie eine Variable, um anzuzeigen, wo die letzte ersetzte Übereinstimmung geendet hat.

F⌕Aθη

Finde alle überlappenden Übereinstimmungen von ainS .

F‹‹ιε

Wenn die nächste Übereinstimmung die letzte erfolgreiche Ersetzung nicht überlappt ...

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

... und es überlappt auch keine Kopie von binS ...

≔⁺⁺ω✂θει¹ζω

... dann verketten Sie den Zwischensubstring zwischen der letzten Übereinstimmung und dieser Übereinstimmung mit b der Ausgabezeichenfolge ...

≔⁺ιLηε

... und aktualisiere die Variable für das letzte Matchende auf das Ende dieses neuen Matches.

»⁺ω✂θε

Fügen Sie am Ende den Rest hinzu Sund geben Sie das Ergebnis aus.

Neil
quelle
1
@tsh OK, dies ist eine vollständige Umschreibung, ich hoffe, dies deckt jetzt alle möglichen Fälle ab ...
Neil
1
@Neil Ich glaube das gilt auch!
Quinn
@Neil Ich glaube das ist jetzt gültig.
Dienstag,
@Quinn Ooh, mache ich das zuerst, um ihre Antwort gültig zu machen? Ordentlich!
Neil
@Neil Ich glaube, JoKing hat auch eine gültige Antwort
Quinn
3

Wolfram Language (Mathematica) , 43 122 96 88 Bytes

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

Probieren Sie es online!

+79: sollte behoben sein.

Anrufen als 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
attinat
quelle
2
Fehler für 121212, 1, 121 - sollten 121212
Falco
@attinat Scheint mir fix!
Quinn
1

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

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

TIO

Nahuel Fouilleul
quelle
[ 1222, 22, 122] Ausgeben sollte 12122, aber Ihre Ausgaben11222
Quinn
ok habe das nicht verstanden, vielleicht behoben, und kürzer
Nahuel Fouilleul
Oh nein, eigentlich hat der letzte Testfall einen zu viel 12s, stellt sich heraus, dass die Frage, die ich gestellt habe, viel schwieriger war, als ich ursprünglich gedacht hatte!
Quinn
@Quinn, so scheint es mir , dass es nicht konsequent: 123, 23, 12-> 112aber 1212, 1, 121-> 1212(? , Warum es nicht sein sollte 121212)
Nahuel FOUILLEUL
Es scheint zu klären, welche Positionen Snicht mit bwelchem ​​Teil übereinstimmen sollten oder welcher übersprungen werden muss, bevor nach dem nächsten Match gesucht wird
Nahuel Fouilleul,