laissez S
, a
et b
chacun représente une chaîne
Objectif: écrire une fonction de remplacement de chaîne standard dans laquelle vous remplacez toutes les occurrences d' a
une chaîne S
par b
tant qu'elle a
ne fait pas déjà partie d'une instance deb
par exemple, si nous avons la chaîne S
=My oh my that there is a big ol' that
et nous voulions faire un remplacement de fantaisie avec a = that
et b = that there
nous remplacerions chaque instance de that
avec that there
tant que l'instance de that
n'est pas déjà une instance dethat there
Donc, dans ce cas, la sortie serait: My oh my that there is a big ol' that there
Le premier that
n'est pas remplacé car il fait déjà partie d'une instance dethat there
Remarques
Les 3 entrées doivent être des chaînes contenant uniquement des caractères ascii imprimables
L'entrée peut être donnée sous la forme de 3 chaînes distinctes ou d'une liste de 3 chaînes
Entrée sera dans l'ordre
S
,a
,b
sauf indication contraire dans la réponsePour
a
être considéré comme faisant partie deb
, toutes les instances dea
doivent faire partie d'une instanceb
Quelques exemples de cas expliqués
Input: ["1222", "22", "122"]
Output: "12122"
Dans l'exemple ci-dessus, ce dernier 22
est remplacé. Même si une partie de celui-ci fait partie d'une instance de b
, l'intégralité de celui-ci NE fait PAS partie de l'instance de b
. Puisque l'instance entière de a
ne fait pas partie d'une instance, b
elle est remplacée.
Input: ["123 ", "23", "12"]
Output: "112 "
Ce cas de test illustre le même cas que ci-dessus mais peut-être d'une manière un peu plus claire. Encore une fois, le 2
milieu fait à la fois partie d'une instance de a
ainsi qu'une partie d'une instance de b
, cependant, puisque tout a
ne fait pas partie de l'instance, b
il est toujours remplacé.
Input: ["Empty", "", "p"]
Output: "pEpmptpyp"
Dans le cas de test ci-dessus, la chaîne vide avant et après le p
n'est pas remplacée car la chaîne peut être considérée comme faisant entièrement partie de l'instance de p
.
Autres cas de 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"
C'est une question pour code-golf donc la réponse la plus courte en octets l'emporte.
Réponses:
Perl 6 , 76 octets
Essayez-le en ligne!
Bloc de code anonyme qui prend les entrées au curry, comme
f(a,b)(s)
.Je suis presque sûr que cela correspond à l'intention de la question. Fondamentalement, il ne fait la substitution que si la position de
a
ne se trouve dans aucune des correspondances qui se chevauchent deb
.la source
pEpmpptpyp
au lieu depEpmptpyp
1222
,22
,122
] ->12122
. J'ai mis à jour la question pour clarifier et m'excuser de ne pas avoir clarifié ce cas d'angle plus tôt.s/(?!$b)$a/$b/g
, quand $ a est vide parce que la chaîne vide aprèsp
correspondait(?!p)
j'avais besoin(?<!p)(?!p)
Fusain , 55 octets
Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:
Initialisez une variable pour montrer où s'est terminée la dernière correspondance remplacée.
Trouvez toutes les correspondances qui se chevauchent
a
dansS
.Si le match suivant ne chevauche pas le dernier remplacement réussi ...
... et il ne chevauche également aucune copie de
b
dansS
...... puis concaténer la sous-chaîne intermédiaire entre la dernière correspondance et cette correspondance avec
b
à la chaîne de sortie ...... et mettez à jour la dernière variable de fin de correspondance à la fin de cette nouvelle correspondance.
À la fin, ajoutez le reste
S
et affichez le résultat.la source
Wolfram Language (Mathematica) ,
431229688 octetsEssayez-le en ligne!
+79: devrait être corrigé.
Appelez le
f[a,S,b]
.la source
Perl 5 (
-lpF/;/
), 41 octetsTIO
la source
1222
,22
,122
] Doit générer12122
, mais les sorties de la vôtre11222
12
, il s'avère que la question que j'ai posée était beaucoup plus difficile que je ne le pensais à l'origine!123
,23
,12
->112
mais1212
,1
,121
->1212
(pourquoi il ne devrait pas être121212
)S
ne doit pas correspondreb
ou à quelle partie sauter avant de chercher le prochain match