OEIS tem uma variação (A111439) na sequência de Golomb . Como na sequência de Golomb, A(n)
descreve com que frequência n
aparece na sequência. Além disso, dois números consecutivos não podem ser idênticos. Durante a construção da sequência, A(n)
sempre é escolhido como o menor número inteiro positivo que não viola essas duas propriedades. Devido a números idênticos consecutivos não permitidos, a série oscila levemente para cima e para baixo à medida que cresce. Aqui estão os 100 primeiros termos:
1, 2, 3, 2, 3, 4, 3, 4, 5, 6, 5, 6, 5, 6, 7, 6, 7, 8, 7, 8, 9, 8, 9, 8, 9,
10, 9, 10, 9, 10, 11, 10, 11, 10, 11, 10, 11, 12, 11, 12, 13, 12, 13, 12,
13, 12, 13, 12, 13, 14, 15, 14, 15, 14, 15, 14, 15, 14, 15, 14, 15, 16, 15,
16, 17, 16, 17, 16, 17, 16, 17, 16, 17, 18, 17, 18, 17, 18, 19, 18, 19, 18,
19, 18, 19, 18, 19, 18, 19, 20, 19, 20, 21, 20, 21, 20, 21, 20, 21, 20
A lista completa dos primeiros 10.000 números pode ser encontrada no OEIS .
O desafio é escrever um programa ou função que calcule A(n)
, dado n
. n
é 1
baseado em para garantir que a propriedade autoexplicativa funcione.
Regras
Você pode escrever um programa ou uma função e usar qualquer um dos nossos métodos padrão de recebimento de entrada e saída.
Você pode usar qualquer linguagem de programação , mas observe que essas brechas são proibidas por padrão.
Isso é código-golfe , então a resposta mais curta e válida - medida em bytes - vence.
Casos de teste
n A(n)
1 1
4 2
10 6
26 10
100 20
1000 86
1257 100
10000 358
N
aparece após a última ocorrência deN-1
que mede o número de oscilações para baixoN
.)Respostas:
Haskell , 67 bytes
Define uma função
f
. Experimente online! É muito lento, of 15
tempo limite de computação no TIO.Explicação
Seguindo a definição: em cada estágio, escolha o número mínimo positivo
n
que satisfaça as restrições (não é igual à entrada anterior e ainda não ocorreuf n
vezes).fonte
Mathematica,
6968 bytesObrigado a Martin Ender por ter encontrado um byte extra de 1 byte para mim!
Função sem nome, recebendo um número inteiro positivo
n
como entrada e retornando um número inteiro positivo. Construímos a lista inteira dos primeirosn
elementos dessa sequência e pegamos oLast
elemento. A lista é construída começando com a lista vazia{}
e operando nela comn
tempos de função seguidos (viaNest
).A função em questão é
{##&@@#,1//.x_/;x==Last@#||#~Count~x==#[[x]]->x+1}&
, que pega uma lista parcial de valores de sequência (essencialmente##&@@#
) e acrescenta o próximo valor a ela. O próximo valor é calculado começando comx=1
, então repetidamente substituindox
porx+1
enquanto a condiçãox==Last@#||#~Count~x==#[[x]]
for cumprida, em outras palavras, se querx
é o elemento anterior, ou entãox
já está na lista o número correto de vezes. Esta função cospe alguns erros, pois (por exemplo) não devemos chamar ox
th-elemento da lista inicial{}
; no entanto, todos os valores estão corretos.fonte
Python 2,
9986 bytesObrigado a @Dennis por várias melhorias, totalizando 13 bytes!
O programa prossegue de maneira bastante ingênua: mantém o controle da lista de valores determinados até o momento e procura anexar o próximo valor. Ele tenta anexar
1
a ao final da lista, se puder; caso contrário, ele tenta um2
e assim por diante até que algo seja permitido.Agora, começamos semeando os resultados para
1,2,3
ser1,2,3
. Isso é feito para evitar problemas com a lista de valores já calculados muito curta: conjecturo que sen
é pelo menos,4
entãoa(n)
é estritamente menor quen
. (Neste programa,s[n]
é igual aa(n)
. Nossa lista, na verdade, é inicializada[0,1,2,3]
porque as listas são0
indexadas em Python. Assim, por exemploa(1)=s[1]=1
, ea(2)=s[2]=2
.)Então, digamos que estamos tentando determinar
s[m]
, o que significa que nossa lista já incluis[0], s[1], ..., s[m-1]
. Vamos começart=1
e tentar definirs[m]=1
. Quando isso não funciona, vamost=2
e tentamos definirs[m]=2
. Cada vez que incrementamost
, verificamos ses.count(t)==s[t]
... mas o lado direito não produz um erro, desde que nunca tenhamos que ir tão alto quantot=m
. A conjectura diz que nunca precisamos, pois o primeiro valor que calculamos é realmentes[4]
.Esta implementação calcula mais 3 valores da sequência do que precisa. Por exemplo, se
n
for8
, ele será calculados[11]
antes de retornar o valor des[8]
.Eu ficaria feliz em ver uma prova da conjectura. Eu acredito que isso pode ser provado por indução (forte?).
Edit: Aqui está uma prova da conjectura . Na verdade, provamos uma forma um pouco mais forte da declaração, já que ela não envolve trabalho extra.
Teorema: Para todos
n
maiores ou iguais a4
, o termoa(n)
é menor ou igual a(n-2)
.Prova (por forte indução): (Base
n=4
): A afirmação é verdadeira paran=4
, desdea(4) = 2 = 4-2
.Agora vamos supor
a(k)
é inferior ou igual ak-2
para todosk
a partir de4
meion
, inclusive (e assumirn
, pelo menos4
). Em particular, isso significa que todos os termos anteriores da sequência foram no máximo(n-2)
. Precisamos mostrar quea(n+1)
será no máximo(n-1)
. Agora, por definição,a(n)
é o menor número inteiro positivo que não viola nenhuma das condições, portanto, apenas precisamos mostrar que o valor(n-1)
não violará nenhuma das condições.O valor
(n-1)
não violará a condição "sem repetições consecutivas", porque pela hipótese de indução a entrada anterior era no máximo(n-2)
. E não violará a condição "a(m)
é o número de vezes quem
aparece", a menos(n-1)
que já tenha sido atingidoa(n-1)
. Mas, pela forte suposição de indução,(n-1)
já haviam sido alcançados0
tempos ea(n-1)
não é igual a,0
poisa(m)
é positivo para todosm
.Portanto,
a(n+1)
é menor ou igual an-1 = (n+1)-2
, conforme desejado. QED.fonte
Geléia , 17 bytes
Os últimos três casos de teste são demais para o TIO. Eu verifiquei 1000 e 1257 localmente.
Experimente online! ou verifique os 100 primeiros termos .
Como funciona
fonte
Python 2 ,
7774 bytesEsta é uma implementação recursiva do algoritmo do @ mathmandan .
A implementação é O (insana) : a entrada 9 leva 2 segundos localmente, a entrada 10 52 segundos e a entrada 11 17 minutos e 28 segundos. No entanto, se declarada como uma função regular e não como uma lambda, a memorização pode ser usada para verificar os casos de teste.
Experimente online!
Observe que, mesmo com memorização, o TIO não pode calcular f (1257) ou f (10000) (ambos verificados localmente).
fonte
05AB1E ,
3231 bytesExperimente online!
Explicação
Tecnicamente, estamos em loop
G
quando adicionamos N à lista global, mas todos os loops em 05AB1E usam a mesma variável N que o índice; portanto, o loop interno[...]
substituiu o N deG
significado, podemos adicioná-lo fora do loop.Problemas com loops e condicionais aninhados nos impedem de fazer isso dentro do loop.
fonte
Befunge,
141136 bytesExperimente online!
Devido às limitações de memória do Befunge, não é realmente prático acompanhar todas as entradas de entradas anteriores na sequência, portanto, esta solução usa um algoritmo com menor espaço de memória que calcula os valores mais diretamente.
Dito isto, ainda estamos limitados pelo tamanho da célula, que no intérprete de referência Befunge-93 é um valor assinado de 8 bits, portanto, o maior número par suportado na sequência é
A(1876) = 126
e o maior número ímpar suportadoA(1915) = 127
.Se você quiser testar valores maiores, precisará usar um intérprete com um tamanho de célula maior. Isso deve incluir a maioria das implementações do Befunge-98 ( Experimente online! ).
fonte
Python 2, 117 bytes
Meh. Não é tão curto. A solução iterativa simples.
Experimente online
Aqui está uma tentativa muito ruim de uma solução recursiva (129 bytes):
fonte
-1
vez den-1
salvar um byte, acho que não.