deje S
, a
yb
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 a
una cadena S
con b
tanto 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 = that
y b = that there
reemplazaríamos cada instancia de that
con that there
tal que la instancia de that
no 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 that
no 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
,b
salvo que se especifique lo contrario en la respuestaPara
a
ser considerado parte deb
, toda la instancia dea
debe ser parte de una instanciab
Algunos casos de esquina explicados
Input: ["1222", "22", "122"]
Output: "12122"
En el caso anterior, este último 22
se 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 a
no 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 2
en el medio es parte de una instancia a
, así como parte de una instancia de b
, sin embargo, dado que todo a
no 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 p
no 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.
Respuestas:
Perl 6 , 76 bytes
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
a
no está dentro de ninguna de las coincidencias superpuestas deb
.fuente
pEpmpptpyp
lugar depEpmptpyp
1222
,22
,122
] ->12122
. He actualizado la pregunta para aclarar y disculparme por no haber aclarado antes este caso de esquina.s/(?!$b)$a/$b/g
, cuando $ a está vacío porque la cadena vacía después dep
coincidir lo(?!p)
necesitaba(?<!p)(?!p)
Carbón , 55 bytes
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.
Encuentra todas las coincidencias superpuestas de
a
inS
.Si la próxima coincidencia no se superpone al último reemplazo exitoso ...
... y también se solapa con ninguna copia de
b
enS
...... luego concatena la subcadena intermedia entre la última coincidencia y esta coincidencia con
b
la cadena de salida ...... y actualice la variable de finalización de la última coincidencia al final de esta nueva coincidencia.
Al final, agregue el resto
S
y genere el resultado.fuente
Wolfram Language (Mathematica) ,
431229688 bytesPruébalo en línea!
+79: debe repararse.
Llamar como
f[a,S,b]
.fuente
Perl 5 (
-lpF/;/
), 41 bytesTIO
fuente
1222
,22
,122
] Debe ser la salida12122
, pero el suyo salidas11222
12
s, resulta que la pregunta que hice fue mucho más difícil de lo que pensé originalmente!123
,23
,12
->112
pero1212
,1
,121
->1212
(¿por qué no debería ser121212
)S
no deberían coincidir conb
o qué parte omitir antes de buscar el próximo partido