Saltar al contenido

Todas las formas posibles de intercalar dos cadenas

Después de de una larga búsqueda de información dimos con la respuesta esta dificultad que pueden tener muchos los lectores. Te dejamos la respuesta y nuestro objetivo es serte de mucha apoyo.

Solución:

Haskell, 53 48 bytes

a%""=[a]
a%b=[x:t|(x:y,z)<-[(a,b),(b,a)],t<-y%z]

Define una función % para cual a%b con cuerdas a,b da una lista de cadenas.

Dadas dos cadenas, elegimos una de las dos para tomar el primer carácter. Luego recurrimos al resto de dos cadenas, anteponiendo ese carácter a cada resultado.

cuando uno de los string está vacío, el único resultado posible es el otro string. ""%""=[""] también sería suficiente, pero es más largo.


53 octetos:

[email protected](b:c)%[email protected](e:f)=((b:)<$>c%d)++((e:)<$>a%f)
a%d=[a++d]

Define una función % para cual a%d con cuerdas a,d da una lista de cadenas.

La función se define recursivamente. Si tomamos un carácter de la primera string, entonces debe anteponerse a cada resultado de la llamada recursiva en el resto del primero string con el segundo string. Simétricamente para el otro string.

Para el caso base, si una de las cadenas está vacía, el resultado es una lista de un solo elemento de su concatenación. Esto es más corto que dos casos para cada string estando vacío

Haskell, 47

(x:s)#b=(x:)<$>s%b
a#b=[]
[]%b=[b]
a%b=a#b++b#a

% es el operador que resuelve este desafío.

# es un operador que toma dos listas y encuentra todas las formas de intercalarlas de modo que el primer carácter sea del primero string (con un caso límite: si la primera lista está vacía, entonces el resultado es una lista vacía) recurriendo a %.

entonces, % funciona con solo aplicar # dos veces.

Editar:
La versión anterior tenía un error en el que ""%"" devuelto ["",""], así que lo arreglé. Se solucionó agregando un caso base a %, que luego permitió eliminar un caso base de la misma longitud de # (que realmente, no tenía mucho sentido).

Python 2, 71 bytes

f=lambda*p:[x[0]+t for x,y in p,p[::-1]for t in x and f(x[1:],y)]or['']

Ejemplo de ejecución:

>> f('ab','AB')
['abAB', 'aABb', 'aAbB', 'ABab', 'AabB', 'AaBb']

Dadas dos cadenas x,y podemos tomar el primer caracter de x y anteponerlo a cada resultado de la llamada recursiva que falta f(x[1:],y). O podemos hacer lo mismo con x y y cambiado. Tomando x,y como la entrada p o su inversión `p[::-1], tenemos ambas posibilidades.

Para evitar tomar de un vacío string x, hacemos un cortocircuito lógico con x and. Si ambas cadenas están vacías, ninguna string puede ser x y obtenemos una lista vacía de posibilidades, que arreglamos con or al caso base correcto [''].

Una estrategia generativa similar en Python 3 (73 bytes):

f=lambda p,s='':[f((x[1:],y),s+x[0])for x,y in[p,p[::-1]]if x]or print(s)

¡Haz clic para puntuar esta entrada!
(Votos: 2 Promedio: 4.5)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *