Écrivez un programme ou une fonction qui, étant donné deux chaînes ASCII A
et B
, produira des chaînes A'
et B'
où les sous-chaînes communes sont inversées à leur place. Le processus de recherche A'
est le suivant:
A'
est initialement vide.- Si le premier caractère de
A
est dansB
, recherchez le préfixe le plus longA
qui est une sous-chaîne deB
. Supprimez ce préfixe deA
et ajoutez son inversion àA'
. - Sinon, supprimez ce premier caractère
A
et ajoutez-le àA'
. - Répétez les étapes 2-3 jusqu'à ce qu'il
A
soit vide.
La recherche B'
se fait de la même manière.
Exemple
Examinons les chaînes A = "abc bab"
et B = "abdabc"
. Car A'
c'est ce qui se passe:
A = "abc bab"
: Le premier caractère"a"
est en B et le préfixe le plus long de A trouvé en B est"abc"
. Nous supprimons ce préfixe de A et ajoutons son inversion"cba"
à A '.A = " bab"
: Le premier caractère" "
n'est pas en B, donc nous supprimons ce caractère de A et l'ajoutons à A '.A = "bab"
: Le premier caractère"b"
est en B et le préfixe le plus long de A trouvé en B est"b"
. Nous supprimons ce préfixe de A et ajoutons son inversion (qui est toujours"b"
) à A '.A = "ab"
: Le premier caractère"a"
est en B et le préfixe le plus long de A trouvé en B est"ab"
. Nous supprimons ce préfixe de A et ajoutons son inversion"ba"
à A '.A = ""
: A est vide, alors nous nous arrêtons.
Ainsi nous obtenons A' = "cba" + " " + "b" + "ba" = "cba bba"
. Pour B ', le processus est similaire:
B = "abdabc" -> "a" in A, remove prefix "ab"
B = "dabc" -> "d" not in A, remove "d"
B = "abc" -> "a" in A, remove prefix "abc"
Ainsi nous obtenons B' = "ba" + "d" + "cba" = "badcba"
.
Enfin, nous renvoyons les deux chaînes, c'est-à-dire
(A', B') = ("cba bba", "badcba")
Cas de test
"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"
Le code le plus court en octets gagne.
"cba bba", "badcba"
inclusion de guillemets et de virgules?Réponses:
Pyth, 29 octets
Harnais de test.
Le format d'entrée est:
La sortie est:
la source
Haskell,
120111 octetsEssais:
la source
SWI-Prolog, 312 octets
Exemple:
a("birds flying high","whistling high nerds",X,Y).
sortiesUne solution bien trop longue qui va trop montrer à quel point Prolog est verbeux lorsqu'il s'agit de chaînes. Il pourrait être possible de raccourcir cette chose en utilisant des tableaux de codes (
`birds flying high`
) au lieu de chaînes ("birds flying high"
).la source
Python 2.7,
169156152141 octetsLa fonction
m
prend les 2 chaînes en entrée, elle appelleb
deux fois la fonction qui effectue le traitement réel selon les spécifications.Démo ici .
Le tester -
LES SORTIES:
PS: Merci à orlp pour la solution utilisant
next()
la source
m=lambda A,B:(b(A,B),b(B,A))
while len(A)>0
par justewhile A
. De mêmeif len(p)>0
devientif p
.if len(p)
peut aussi l'êtreif p
. (Déjà dit ci-dessus, mais vous l'avez manqué.)len(p)>0
àlen(p)
. Merci pour ça :)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:]
.