Escreva um programa ou função que, dadas duas seqüências ASCII A
e B
, produza sequências A'
e B'
onde as subseqüências comuns sejam revertidas em seu lugar. O processo para encontrar A'
é o seguinte:
A'
está inicialmente vazio.- Se o primeiro caractere de
A
estiver emB
, encontre o prefixo mais longo doA
qual é uma substring deB
. Remova esse prefixoA
e inclua sua reversão emA'
. - Caso contrário, remova esse primeiro caractere
A
e adicione-o aA'
. - Repita as etapas 2-3 até
A
ficar 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.
"cba bba", "badcba"
incluir aspas e vírgula?Respostas:
Pitão, 29 bytes
Equipamento de teste.
O formato de entrada é:
A saída é:
fonte
Haskell,
120111 bytesExecuções de teste:
fonte
SWI-Prolog, 312 bytes
Exemplo:
a("birds flying high","whistling high nerds",X,Y).
saídasUma 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"
).fonte
Python 2.7,
169156152141 BytesA função
m
recebe as 2 seqüências de caracteres como entrada. Chama ab
função duas vezes, que faz o processamento real de acordo com as especificações.Demonstração aqui .
Testando -
SAÍDAS:
PS: Obrigado ao orlp pela solução usando
next()
fonte
m=lambda A,B:(b(A,B),b(B,A))
while len(A)>0
com apenaswhile A
. Da mesma formaif len(p)>0
se tornaif p
.if len(p)
também pode serif p
. (Já disse acima, mas você perdeu.)len(p)>0
porlen(p)
. Obrigado por isso :)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:]
.