lassen S
, a
und b
jeweils einen String
Ziel: Schreiben Funktion eine Standardzeichenfolge ersetzen , wo die Sie alle Vorkommen ersetzen a
in einem String S
mit b
solange a
nicht 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 = that
und b = that there
wir würden jede Instanz von that
mit ersetzen, that there
solange die Instanz von that
nicht 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 that
wird 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
,b
wenn nicht anders in der Antwort angegebenUm
a
als Teil von betrachtet zu werdenb
, muss die gesamte Instanz vona
Teil einer Instanz seinb
Einige Eckfälle erklärt
Input: ["1222", "22", "122"]
Output: "12122"
Im obigen Beispiel wird letzteres 22
ersetzt. 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 a
nicht Teil einer Instanz b
ist, wird sie ersetzt.
Input: ["123 ", "23", "12"]
Output: "112 "
Dieser Testfall zeigt den gleichen Fall wie oben, aber vielleicht etwas deutlicher. Wiederum ist das 2
in der Mitte sowohl Teil einer Instanz a
als auch Teil einer Instanz von b
, da jedoch nicht alles von a
Teil der Instanz b
ist, wird es noch ersetzt.
Input: ["Empty", "", "p"]
Output: "pEpmptpyp"
Im obigen Testfall werden sowohl der leere String vor als auch nach dem p
nicht 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.
Antworten:
Perl 6 , 76 Bytes
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
a
nicht in einer der überlappenden Übereinstimmungen von liegtb
.quelle
pEpmpptpyp
anstelle vonpEpmptpyp
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.s/(?!$b)$a/$b/g
, wenn $ a leer ist, weil leere Zeichenfolge nach demp
Matching(?!p)
ich brauchte(?<!p)(?!p)
Holzkohle , 55 Bytes
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.
Finde alle überlappenden Übereinstimmungen von
a
inS
.Wenn die nächste Übereinstimmung die letzte erfolgreiche Ersetzung nicht überlappt ...
... und es überlappt auch keine Kopie von
b
inS
...... dann verketten Sie den Zwischensubstring zwischen der letzten Übereinstimmung und dieser Übereinstimmung mit
b
der Ausgabezeichenfolge ...... und aktualisiere die Variable für das letzte Matchende auf das Ende dieses neuen Matches.
Fügen Sie am Ende den Rest hinzu
S
und geben Sie das Ergebnis aus.quelle
Wolfram Language (Mathematica) ,
431229688 BytesProbieren Sie es online!
+79: sollte behoben sein.
Anrufen als
f[a,S,b]
.quelle
Perl 5 (
-lpF/;/
), 41 BytesTIO
quelle
1222
,22
,122
] Ausgeben sollte12122
, aber Ihre Ausgaben11222
12
s, stellt sich heraus, dass die Frage, die ich gestellt habe, viel schwieriger war, als ich ursprünglich gedacht hatte!123
,23
,12
->112
aber1212
,1
,121
->1212
(? , Warum es nicht sein sollte121212
)S
nicht mitb
welchem Teil übereinstimmen sollten oder welcher übersprungen werden muss, bevor nach dem nächsten Match gesucht wird