Uma sequência de De Bruijn é interessante: é a sequência cíclica mais curta que contém todas as sequências possíveis de um determinado alfabeto de um determinado comprimento. Por exemplo, se estivéssemos considerando o alfabeto A, B, C e um comprimento de 3, uma saída possível é:
AAABBBCCCABCACCBBAACBCBABAC
Você vai notar que cada seqüência de 3 caracteres possível usando as letras A
, B
e C
estão lá.
Seu desafio é gerar uma sequência De Bruijn no menor número de caracteres possível. Sua função deve ter dois parâmetros, um número inteiro representando o comprimento das seqüências e uma lista que contém o alfabeto. Sua saída deve ser a sequência em forma de lista.
Você pode assumir que todos os itens do alfabeto são distintos.
Um exemplo de gerador pode ser encontrado aqui
Aplicam-se brechas padrão
fonte
Respostas:
Pitão, 31 bytes
Esta é a conversão direta do algoritmo usado na minha resposta CJam . Dicas para o golfe bem-vindo!
Este código define uma função
g
que recebe dois argumentos, a sequência de caracteres da lista de caracteres e o número.Exemplo de uso:
Saída:
Expansão do código:
Experimente aqui
fonte
CJam,
52 4948 bytesIsso é surpreendentemente longo. Isso pode ser muito praticado, aproveitando as dicas da tradução Pyth.
A entrada é como
ie - String da lista de caracteres e o comprimento.
e saída é a string De Bruijn
Experimente online aqui
fonte
CJam,
5249 bytesAqui está uma abordagem diferente no CJam:
Toma entrada como esta:
e produz um trabalho de Lyndon como
Experimente aqui.
Isso faz uso da relação com as palavras de Lyndon . Ele gera todas as palavras Lyndon de comprimento n em ordem lexicográfica (conforme descrito no artigo da Wikipedia) e depois elimina aquelas cujo comprimento não divide n . Isso já produz a sequência De Bruijn, mas como estou gerando as palavras Lyndon como sequências de dígitos, também preciso substituí-las pelas letras correspondentes no final.
Por razões de golfe, considero que as letras posteriores do alfabeto têm uma ordem lexicográfica mais baixa.
fonte
JavaScript (ES6) 143
Usando palavras de Lyndon, como aswer de Martin, apenas 3 vezes ...
Teste no console do FireFox / FireBug
Saída
fonte
Python 2, 114 bytes
Não tenho muita certeza de como jogar mais, devido à minha abordagem.
Experimente online
Ungolfed:
Este código é uma modificação trivial da minha solução para um desafio mais recente.
A única razão
[:1-n]
é necessária é porque a sequência inclui o contorno.fonte
Powershell,
16496 bytes-68 bytes com -match em
O($n*2^n)
vez de gerador recursivoO(n*log(n))
Ungolfed & script de teste:
Saída:
Veja também: Um anel para governar todos eles. Uma String para conter todos eles
fonte