Fancy String Reemplazar

16

deje S, ayb cada uno representa una cadena

Objetivo: Escribir una cadena estándar de la función de reemplazar en el que se reemplaza todas las apariciones de auna cadena Scon btanto tiempo comoa no es ya parte de una instancia deb

por ejemplo, si tenemos la cadena S =My oh my that there is a big ol' that

y queríamos hacer un reemplazo elegante con a = thaty b = that therereemplazaríamos cada instancia de thatcon that theretal que la instancia de thatno sea ya una instancia dethat there

Entonces, en este caso, la salida sería: My oh my that there is a big ol' that there

El primero thatno se reemplaza porque ya es parte de una instancia dethat there

Notas

  • Las 3 entradas deben ser cadenas que contengan solo caracteres ascii imprimibles

  • La entrada se puede dar como 3 cadenas separadas o una lista de 3 cadenas

  • De entrada estará en el orden S, a, bsalvo que se especifique lo contrario en la respuesta

  • Para aser considerado parte de b, toda la instancia de adebe ser parte de una instanciab

Algunos casos de esquina explicados

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

En el caso anterior, este último 22se reemplaza. Aunque parte de ella es parte de una instancia de b, la totalidad NO es parte de la instancia de b. Como toda la instancia de ano es parte de una instancia b, se reemplaza.

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

Este caso de prueba ilustra el mismo caso anterior pero quizás de una manera un poco más clara. Nuevamente, el 2en el medio es parte de una instancia a, así como parte de una instancia de b, sin embargo, dado que todo ano es parte de la instancia b, todavía se reemplaza.

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

En el caso de prueba anterior, tanto la cadena vacía antes como después pno se reemplazan, ya que pueden considerarse completamente parte de la instancia de p.

Otros casos de prueba

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"

Esta es una pregunta para code-golf, por lo que gana la respuesta más corta en bytes.

Quinn
fuente
Continuemos esta discusión en el chat .
Quinn el

Respuestas:

6

Perl 6 , 76 bytes

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

Pruébalo en línea!

Bloque de código anónimo que toma la entrada curry, como f(a,b)(s).

Estoy bastante seguro de que esto coincide con la intención de la pregunta. Básicamente, solo realiza la sustitución si la posición de ano está dentro de ninguna de las coincidencias superpuestas de b.

Jo King
fuente
2
sin embargo, en las pruebas hay 2p: en pEpmpptpyplugar depEpmptpyp
Nahuel Fouilleul
@Nahuel fijo. Esto también debería manejar los otros casos de prueba (y creo que es el primero en hacerlo)
Jo King
@JoKing Desafortunadamente, después de replantear algunos de los casos de prueba señalado, creo que el último caso de prueba fallará [ 1222, 22, 122] -> 12122. He actualizado la pregunta para aclarar y disculparme por no haber aclarado antes este caso de esquina.
Quinn
Tuve un problema similar con s/(?!$b)$a/$b/g, cuando $ a está vacío porque la cadena vacía después de pcoincidir lo (?!p)necesitaba(?<!p)(?!p)
Nahuel Fouilleul
1
@Quinn fijo, creo?
Jo King
5

Carbón , 55 bytes

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

Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:

≔⁰ε

Inicialice una variable para mostrar dónde terminó la última coincidencia reemplazada.

F⌕Aθη

Encuentra todas las coincidencias superpuestas de ain S.

F‹‹ιε

Si la próxima coincidencia no se superpone al último reemplazo exitoso ...

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

... y también se solapa con ninguna copia de ben S...

≔⁺⁺ω✂θει¹ζω

... luego concatena la subcadena intermedia entre la última coincidencia y esta coincidencia con bla cadena de salida ...

≔⁺ιLηε

... y actualice la variable de finalización de la última coincidencia al final de esta nueva coincidencia.

»⁺ω✂θε

Al final, agregue el resto Sy genere el resultado.

Neil
fuente
1
@tsh OK, esta es una reescritura completa, espero que ahora cubra todos los casos posibles ...
Neil
1
@Neil ¡Creo que esto también es válido!
Quinn el
@Neil Creo que esto es válido ahora.
tsh
@Quinn Ooh, ¿eso me hace primero para que su respuesta sea válida? ¡Ordenado!
Neil
@Neil, creo que JoKing también tiene una respuesta válida
Quinn el
3

Wolfram Language (Mathematica) , 43 122 96 88 bytes

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

Pruébalo en línea!

+79: debe repararse.

Llamar como 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
fuente
2
Falla para 121212, 1, 121 - debería salir 121212
Falco
¡@attinat parece arreglado para mí!
Quinn el
1

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

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

TIO

Nahuel Fouilleul
fuente
[ 1222, 22, 122] Debe ser la salida 12122, pero el suyo salidas11222
Quinn
ok no entendí eso, tal vez arreglado, y más corto
Nahuel Fouilleul
¡Oh, no, en realidad el último caso de prueba tiene muchos 12s, resulta que la pregunta que hice fue mucho más difícil de lo que pensé originalmente!
Quinn
@Quinn, me parece que no es consistente: 123, 23, 12-> 112pero 1212, 1, 121-> 1212(¿por qué no debería ser 121212)
Nahuel FOUILLEUL
Parece que lo que debería aclararse es qué posiciones Sno deberían coincidir con bo qué parte omitir antes de buscar el próximo partido
Nahuel Fouilleul