Um relacionamento atrasado

10

Escreva um programa ou função que, dadas duas seqüências ASCII Ae B, produza sequências A'e B'onde as subseqüências comuns sejam revertidas em seu lugar. O processo para encontrar A'é o seguinte:

  1. A' está inicialmente vazio.
  2. Se o primeiro caractere de Aestiver em B, encontre o prefixo mais longo do Aqual é uma substring de B. Remova esse prefixo Ae inclua sua reversão em A'.
  3. Caso contrário, remova esse primeiro caractere Ae adicione-o a A'.
  4. Repita as etapas 2-3 até Aficar vazio.

A descoberta B'é feita da mesma forma.

Exemplo

Vamos considerar as strings A = "abc bab"e B = "abdabc". Pois A'é isso que acontece:

  • A = "abc bab": O primeiro caractere "a"está em B e o prefixo mais longo de A encontrado em B é "abc". Removemos esse prefixo de A e adicionamos sua reversão "cba"a A '.
  • A = " bab": O primeiro caractere " "não está em B, removemos esse caractere de A e o adicionamos a A '.
  • A = "bab": O primeiro caractere "b"está em B e o prefixo mais longo de A encontrado em B é "b". Removemos esse prefixo de A e adicionamos sua reversão (que ainda é "b") a A '.
  • A = "ab": O primeiro caractere "a"está em B e o prefixo mais longo de A encontrado em B é "ab". Removemos esse prefixo de A e adicionamos sua reversão "ba"a A '.
  • A = "": A está vazio, então paramos.

Assim chegamos A' = "cba" + " " + "b" + "ba" = "cba bba". Para B ', o processo é semelhante:

B = "abdabc"  ->  "a" in A, remove prefix "ab"
B = "dabc"    ->  "d" not in A, remove "d"
B = "abc"     ->  "a" in A, remove prefix "abc"

Assim chegamos B' = "ba" + "d" + "cba" = "badcba".

Finalmente, retornamos as duas strings, ou seja,

(A', B') = ("cba bba", "badcba")

Casos de teste

"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"

O menor código em bytes vence.

orlp
fonte
Presumimos que todas as entradas sejam minúsculas ASCII? Espera-se que a saída exata seja semelhante a "cba bba", "badcba"incluir aspas e vírgula?
AdmBorkBork
@ TimmyD O formato exato de entrada / saída é a sua escolha. Você não pode presumir que a entrada é ASCII em minúscula - pode ser qualquer ASCII imprimível.
orlp
A cadeia vazia é uma entrada legal?
MtnViewMark
@MtnViewMark Sim.
Orlp 27/08/2015

Respostas:

1

Pitão, 29 bytes

M&G+_Je|f}TH._GhGg.-GJHgzQgQz

Equipamento de teste.

O formato de entrada é:

abc bab
"abdabc"

A saída é:

cba bba
badcba
isaacg
fonte
2

Haskell, 120 111 bytes

import Data.List
a&b=(a#b,b#a)
[]#_=[]
(a:y)#b=[a]%y where p%(i:w)|reverse(i:p)`isInfixOf`b=(i:p)%w;p%x=p++x#b

Execuções de teste:

λ: "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")
MtnViewMark
fonte
1

SWI-Prolog, 312 bytes

a(A,B,X,Y):-b(A,B,"",X),b(B,A,"",Y).
b(A,B,R,Z):-A="",R=Z;sub_string(A,0,1,_,C),(sub_string(B,_,1,_,C),(string_length(A,J),I is J-1,between(0,I,K),L is J-K,sub_string(A,0,L,_,S),sub_string(B,_,L,_,S),string_codes(S,E),reverse(E,F),string_codes(Y,F));S=C,Y=C),string_concat(S,V,A),string_concat(R,Y,X),b(V,B,X,Z).

Exemplo: a("birds flying high","whistling high nerds",X,Y).saídas

X = "bisdr flyhgih gni",
Y = "wihstlhgih gni nesdr" .

Uma maneira, forma solução muito longo que vai também mostrar como detalhado Prolog é quando se lida com cordas. Pode ser possível encurtar isso usando códigos arrays ( `birds flying high`) em vez de strings ( "birds flying high").

Fatalizar
fonte
1

Python 2.7, 169 156 152 141 Bytes

m=lambda A,B:(b(A,B),b(B,A))
def b(A,B,C=''):
 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:]
 return C

A função mrecebe as 2 seqüências de caracteres como entrada. Chama a bfunção duas vezes, que faz o processamento real de acordo com as especificações.
Demonstração aqui .
Testando -

l=[("abc bab", "abdabc"),
("abcde", "abcd bcde"),
("hello test", "test banana"),
("birds flying high", "whistling high nerds")]
for e in l:
    print m(*e)

SAÍDAS:

('cba bba', 'badcba')
('dcbae', 'dcba edcb')
('hello tset', 'tset banana')
('bisdr flyhgih gni', 'wihstlhgih gni nesdr')

PS: Obrigado ao orlp pela solução usando next()

Kamehameha
fonte
m=lambda A,B:(b(A,B),b(B,A))
precisa saber é
Também você pode substituir while len(A)>0com apenas while A. Da mesma forma if len(p)>0se torna if p.
orlp 26/08/15
if len(p)também pode ser if p. (Já disse acima, mas você perdeu.)
mbomb007
@ mbomb007 Não leu corretamente. Apenas substituído len(p)>0por len(p). Obrigado por isso :)
Kamehameha
Ainda mais curto: 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:].
precisa saber é