Escriba un programa o función que, dadas dos cadenas ASCII A
y B
, producirá cadenas A'
y B'
donde las subcadenas comunes se invierten en su lugar. El proceso para encontrar A'
es el siguiente:
A'
Inicialmente está vacío.- Si el primer carácter de
A
está enB
, encuentre el prefijo más largo delA
cual es una subcadena deB
. Elimine este prefijo deA
y agregue su inversión aA'
. - De lo contrario, elimine este primer carácter
A
y agréguelo aA'
. - Repita los pasos 2-3 hasta que
A
esté vacío.
El hallazgo B'
se realiza de manera similar.
Ejemplo
Consideremos las cadenas A = "abc bab"
y B = "abdabc"
. Pues A'
esto es lo que sucede:
A = "abc bab"
: El primer carácter"a"
está en B y el prefijo más largo de A encontrado en B es"abc"
. Eliminamos este prefijo de A y agregamos su inversión"cba"
a A '.A = " bab"
: El primer carácter" "
no está en B, por lo que eliminamos este carácter de A y lo agregamos a A '.A = "bab"
: El primer carácter"b"
está en B y el prefijo más largo de A encontrado en B es"b"
. Eliminamos este prefijo de A y agregamos su inversión (que todavía está"b"
) a A '.A = "ab"
: El primer carácter"a"
está en B y el prefijo más largo de A encontrado en B es"ab"
. Eliminamos este prefijo de A y agregamos su inversión"ba"
a A '.A = ""
: A está vacío, así que nos detenemos.
Así llegamos A' = "cba" + " " + "b" + "ba" = "cba bba"
. Para B ', el proceso es similar:
B = "abdabc" -> "a" in A, remove prefix "ab"
B = "dabc" -> "d" not in A, remove "d"
B = "abc" -> "a" in A, remove prefix "abc"
Así llegamos B' = "ba" + "d" + "cba" = "badcba"
.
Finalmente, devolvemos las dos cadenas, es decir
(A', B') = ("cba bba", "badcba")
Casos de prueba
"abc bab", "abdabc" -> "cba bba", "badcba"
"abcde", "abcd bcde" -> "dcbae", "dcba edcb"
"hello test", "test banana" -> "hello tset", "tset banana"
"birds flying high", "whistling high nerds" -> "bisdr flyhgih gni", "wihstlhgih gni nesdr"
El código más corto en bytes gana.
"cba bba", "badcba"
incluir comillas y comas?Respuestas:
Pyth, 29 bytes
Arnés de prueba.
El formato de entrada es:
Salida es:
fuente
Haskell,
120111 bytesPruebas de funcionamiento:
fuente
SWI-Prolog, 312 bytes
Ejemplo:
a("birds flying high","whistling high nerds",X,Y).
salidasUna manera, forma una solución demasiado tiempo que va demasiado mostrar el nivel de detalle Prolog es cuando se trata de cadenas. Podría ser posible acortar esto usando arrays de códigos (
`birds flying high`
) en lugar de cadenas ("birds flying high"
).fuente
Python 2.7,
169156152141 bytesLa función
m
toma las 2 cadenas como entrada. Llama a lab
función dos veces, que realiza el procesamiento real de acuerdo con las especificaciones.Demostración aquí .
Probándolo
SALIDAS:
PD: Gracias a orlp por la solución usando
next()
fuente
m=lambda A,B:(b(A,B),b(B,A))
while len(A)>0
con solowhile A
. Del mismo modo seif len(p)>0
convierteif p
.if len(p)
También puede serif p
. (Ya se ha dicho anteriormente, sino que se ha perdido.)len(p)>0
alen(p)
. Gracias por eso :)while A:j=next((j for j in range(len(A),0,-1)if A[:j]in B),1);C+=A[:j][::-1];A=A[j:]
.