A idéia aqui é produzir um padrão quase repetitivo. Ou seja, a sequência que está sendo construída muda no último momento para evitar uma repetição de alguma subsequência. As subseqüências do tipo AA e ABA devem ser evitadas (onde B não é maior que A).
Exemplos:
Vou seguir em frente e começar listando todos os pequenos exemplos para tornar minha descrição mais clara. Vamos começar com 0.
Válido: 0 Inválido: 00 (padrão AA) Válido: 01 Inválido: 010 (padrão ABA) Inválido: 011 (padrão AA) Válido: 012 Válido: 0120 Inválido: 0121 (padrão ABA) Inválido: 0122 (padrão AA) Inválido: 01200 (padrão AA) Inválido: 01201 (padrão ABA; 01-2-01) Inválido: 01202 (padrão ABA) Válido: 01203
Agora, acredito firmemente que a 4
nunca é necessária, embora eu não tenha uma prova, porque encontrei facilmente sequências de centenas de caracteres que apenas usam 0123
. (Provavelmente, está intimamente relacionado à forma como são necessários apenas três caracteres para ter seqüências infinitas que não possuem nenhum padrão AA. Há uma página da Wikipedia sobre isso.)
Entrada / Saída
A entrada é um número inteiro único, positivo e diferente de zero n
. Você pode assumir isso n <= 1000
.
Saída é uma n
sequência de caracteres sem subseqüências que correspondem ao padrão proibido (AA ou ABA).
Amostras de entradas e saídas
>>> 1 0 0 >>> 2 01 >>> 3 012 >>> 4 0120 >>> 5 01203 >>> 50 01203102130123103201302103120132102301203102132012
Regras
- Somente os caracteres
0123
são permitidos. - B não é mais do que A. Isto é para evitar a situação em que
012345
tem de ser seguido por6
porque0123451
tem este:1-2345-1
. Em outras palavras, a sequência seria trivial e desinteressante. n
pode ser introduzido através de qualquer método desejado, exceto codificação.- A saída pode ser uma lista ou uma string, dependendo do que for mais fácil.
- Sem força bruta ; o tempo de execução deve ser da ordem de minutos, no máximo uma hora em uma máquina muito lenta, por
n=1000
. (Pretende-se desqualificar soluções que apenas circulam através den
permutações de todo o comprimento{0,1,2,3}
, para que truques e truques semelhantes sejam proibidos.) - As brechas padrão não são permitidas, como de costume.
- A pontuação está em bytes. Isso é código-golfe , então a entrada mais curta vence (provavelmente - veja o bônus).
- Bônus: escolha o dígito mais baixo permitido em cada etapa. Se
1
e3
são possíveis opções para o próximo dígito na sequência, escolha1
. Subtraia 5 bytes da sua pontuação. No entanto, tome nota da nota abaixo.
Nota!
Os becos sem saída são possíveis. Seu programa ou função deve evitá-los. Aqui está um exemplo:
Stump: 01203102130123103201302103120132102301203102132012302103120130231032012302132031023012032102312013021031230132031021301203210230132031021301203210230310320123102301320310330 Stump: 01203102130123103201302103120132102301203102132012302103120130231032012302132031023012032102312013021031230132031021301203210230132031021301203210230310320123102301320310330 Stump: 0120310213012310320130210312013210230120310213201230210312013023103201230213203102301203210231201302103123013203102130120321023013203102130120321023013203103303103103103102301320310330 Stump: 01203102130123103201302103120132102301203102132012302103120130231032012302132031023012032102312013021031230132031021301203210230132031021301203103103103102301320310330
Cada uma dessas seqüências não pode ser estendida mais (sem usar a 4
). Mas observe também que há uma diferença crucial entre os dois primeiros e os dois segundos. Substituirei a subsequência inicial compartilhada por uma X
para tornar isso mais claro.
Coto: X2130120 Coto: X2130123 Coto: X320 Coto: X321301203102130
Os últimos dois dígitos de X
são 10
, portanto, as únicas opções possíveis para o próximo dígito são 2
e 3
. A escolha 2
leva a uma situação em que a sequência deve terminar. O algoritmo ganancioso não funcionará aqui. (Não sem retroceder, pelo menos.)
n
, mas, como os tocos encontrados pelo meu programa tendem a ficar mais longos em média 10 dígitos por vez, tenho certeza de que existe uma sequência infinita. Não sei como um algoritmo semi-ganancioso pode ser testado para seqüências arbitrariamente grandes. Eu poderia restringir o requisito para n
= 1000 e simplesmente não me preocupar com valores mais altos n
.
AA
é realmente do tipo ABA
onde B
está vazio. Talvez isso ajude a simplificar algumas soluções.
n
? Se alguém der um algoritmo heurístico semi-ganancioso, como você verificará se ele não apresenta problemas por um período muito grande? O problema geral é interessante e não consegui encontrar nada sobre como evitar padrões, onde restringimos o comprimento de parte do padrão. Se alguém pode produzir uma receita geral, espero que seja a melhor abordagem.