Explicação
Duas seqüências de caracteres podem ser embaralhadas, intercalando suas letras para formar uma nova sequência, assim como duas pilhas de cartas podem ser embaralhadas para formar uma única pilha.
Por exemplo, as strings HELLO
e WORLD
podem ser embaralhadas para formar HWEOLRLLOD
, ou HEWORLLLDO
, ou talvez simplesmente HELLOWORLD
.
É não um embaralhamento se a ordem original das letras não é preservado. Por exemplo, o D
in WORLD
nunca pode aparecer antes do R
embaralhamento depois. Isso significa que EHLLOWRDLO
, por exemplo, não é um embaralhamento HELLO
e WORLD
, embora contenha todas as letras originais.
Uma corda é um embaralhamento de gêmeos se puder ser formada embaralhando duas cordas idênticas. Por exemplo, ABACBDECDE
é um embaralhar de gêmeos porque pode ser formado embaralhando ABCDE
e ABCDE
. DBEACBCADE
não é um embaralhar de gêmeos porque não pode ser formado embaralhando duas cordas idênticas.
Detalhes do Programa
Dada uma sequência de entrada, produza, 0
se não for um shuffle de gêmeos, e produza uma das strings duplas, se for um shuffle de gêmeos.
Você pode supor que a sequência de entrada tenha um comprimento inclusivo entre quatro e vinte caracteres e seja composta inteiramente de caracteres alfabéticos maiúsculos. Ele deve ser executado em um período de tempo razoável, digamos, em menos de 10 minutos.
Isso é código de golfe, então a solução mais curta vence.
Exemplo de E / S
> ABACBDECDE
ABCDE
> DBEACBCADE
0
> FFFFFF
FFF
> FFGGG
0
> ABBA
0
> AABB
AB
> AABAAB
AAB
Eu tenho uma implementação de exemplo (sem golfe) .
fonte
that the input string has a length inclusively between four and twenty characters
e não me diga "nunca confie na entrada do usuário!", "Nunca confie nas especificações!"FFGGG
para torná-lo consistente.Respostas:
Haskell, 114
Ungolfed:
Explicação:
A maior parte do trabalho está sendo realizada na
partitions
função. Ele funciona gerando recursivamente todas as partições(a, b)
do final da lista e, em seguida, usando a mônada da lista para acrescentar o elemento inicialx
a cada uma delas e reunir todos os resultados.findMatch
funciona filtrando essa lista para que apenas as partições onde as subsequências são iguais permaneçam. Em seguida, ele retorna a primeira subsequência na primeira partição. Se não houver nenhum, a lista estará vazia; portanto, o"0"
anexo no final será retornado.main
apenas lê a entrada, a alimenta através dessas duas funções e a imprime.fonte
R, 113 caracteres
Ungolfed (e uma função que pega a string):
A solução depende da
combn
função que gera todas as combinações de índices como colunas em uma matriz.apply
aplica uma função a cada coluna (dimensão2
) na matriz e retorna um vetor de cadeias ou zeros.max
então encontre a maior string (que supera 0).Um recurso interessante em R é a capacidade de selecionar um subconjunto de um vetor dado um vetor de índices e, em seguida, selecionar o complemento desse subconjunto negando os índices:
x[i] == x[-i]
fonte
Mathematica, 87
Isso é diretamente baseado no post do hammar, mas espero que seja distinto o suficiente para merecer a publicação.
Teste:
fonte
D
usando a primeira pesquisa recursiva em profundidade
Eu posso torná-lo mais rápido com uma
int i = min(a.length,b.length);if(a[0..i]!=b[0..i])return "0";
cláusula de guardafonte
void main(){writeln(c("ABCADABCAD"));}
- apenas uma versão diferente de D, minha culpa, outra coisa? O que há com "ABCABCA"?Ruby, 89 caracteres
Esse código implementa um algoritmo de pesquisa recursiva simples. A entrada deve ser fornecida no STDIN.
fonte
Perl, 68 caracteres
A cadeia de entrada assumida como estando na
$_
variável, a saída é o valor da expressão. Novas linhas à direita na entrada são ignoradas. Você pode executar isso na linha de comando da seguinte maneira:Esse código usa o mecanismo regexp do Perl (e especificamente seu recurso de execução de código incorporado ) para fazer o backtracking. Basicamente, ele corresponde a seqüência de entrada contra a regexp
^((.+))+$
, mantendo o controle das submatches páginas ímpares e pares numeradas$x
e$,
, e rejeitando o jogo no final, se os dois não são iguais.fonte
AABAAB
?AABAAB
é um caso fácil para esta solução, uma vez que o grupo externo só precisa corresponder duas vezes Levei muito mais tempo para obtê-lo a cabo.AABB
Certa.)Python, 168 caracteres
fonte