Fancy String Replace

16

laissez S, aet bchacun représente une chaîne

Objectif: écrire une fonction de remplacement de chaîne standard dans laquelle vous remplacez toutes les occurrences d' aune chaîne Spar btant qu'elle ane 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 = thatet b = that therenous remplacerions chaque instance de thatavec that theretant que l'instance de thatn'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 thatn'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, bsauf indication contraire dans la réponse

  • Pour aêtre considéré comme faisant partie de b, toutes les instances de adoivent faire partie d'une instanceb

Quelques exemples de cas expliqués

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

Dans l'exemple ci-dessus, ce dernier 22est 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 ane fait pas partie d'une instance, belle 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 2milieu fait à la fois partie d'une instance de aainsi qu'une partie d'une instance de b, cependant, puisque tout ane fait pas partie de l'instance, bil est toujours remplacé.

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

Dans le cas de test ci-dessus, la chaîne vide avant et après le pn'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.

Quinn
la source
Continuons cette discussion dans le chat .
Quinn

Réponses:

6

Perl 6 , 76 octets

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

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 ane se trouve dans aucune des correspondances qui se chevauchent de b.

Jo King
la source
2
cependant dans les tests il y a 2p: in pEpmpptpypau lieu depEpmptpyp
Nahuel Fouilleul
@Nahuel Fixed. Cela devrait également gérer les autres cas de test (et je pense que c'est le premier à le faire)
Jo King
Malheureusement , après @JoKing repensant certains des cas de test indiqué, je pense que le dernier cas de test échouera [ 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.
Quinn
j'ai eu un problème similaire avec s/(?!$b)$a/$b/g, quand $ a est vide parce que la chaîne vide après pcorrespondait (?!p)j'avais besoin(?<!p)(?!p)
Nahuel Fouilleul
1
@Quinn Fixed je pense?
Jo King
5

Fusain , 55 octets

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

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.

F⌕Aθη

Trouvez toutes les correspondances qui se chevauchent adans S.

F‹‹ιε

Si le match suivant ne chevauche pas le dernier remplacement réussi ...

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

... et il ne chevauche également aucune copie de bdans S...

≔⁺⁺ω✂θει¹ζω

... puis concaténer la sous-chaîne intermédiaire entre la dernière correspondance et cette correspondance avec bà la chaîne de sortie ...

≔⁺ιLηε

... et mettez à jour la dernière variable de fin de correspondance à la fin de cette nouvelle correspondance.

»⁺ω✂θε

À la fin, ajoutez le reste Set affichez le résultat.

Neil
la source
1
@tsh OK, c'est une réécriture complète, j'espère que cela couvre maintenant tous les cas possibles ...
Neil
1
@Neil Je crois que cela est également valable!
Quinn
@Neil Je crois que c'est valable maintenant.
tsh
@Quinn Ooh, cela me fait-il d'abord de valider leur réponse? Soigné!
Neil
@Neil Je crois que JoKing a également une réponse valide
Quinn
3

Wolfram Language (Mathematica) , 43 122 96 88 octets

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

Essayez-le en ligne!

+79: devrait être corrigé.

Appelez le 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
la source
2
Échoue pour 121212, 1, 121 - devrait sortir 121212
Falco
@attinat semble fixe pour moi!
Quinn
1

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

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

TIO

Nahuel Fouilleul
la source
[ 1222, 22, 122] Doit générer 12122, mais les sorties de la vôtre11222
Quinn
ok ne comprenait pas cela, peut-être fixe et plus court
Nahuel Fouilleul
Oh non en fait le dernier cas de test en a un de trop 12, il s'avère que la question que j'ai posée était beaucoup plus difficile que je ne le pensais à l'origine!
Quinn
@Quinn, il me semble que ce n'est pas cohérente: 123, 23, 12-> 112mais 1212, 1, 121-> 1212(pourquoi il ne devrait pas être 121212)
Nahuel Fouilleul
il semble que ce qui devrait être clarifié, c'est à quelles positions Sne doit pas correspondre bou à quelle partie sauter avant de chercher le prochain match
Nahuel Fouilleul