Inspirado na pergunta anterior .
A sequência auto-descritiva de Golomb g (n) é uma sequência em que qualquer número natural n
é repetido dentro da sequência g (n) vezes.
Os primeiros números na sequência são:
n 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
g(n) 1 2 2 3 3 4 4 4 5 5 5 6 6 6 6 7 7 7 7 8
Você pode ver que g (4) = 3 e que "4" é repetido 3 vezes na sequência.
Dada uma entrada de n
, saída g(n)
.
Limitações: n <100000.
O menor código vence.
n
mais do que2 - n % 1
. Você tem algum motivo para esperar que as respostas sejam significativamente diferentes?golomb=1:2:2:concat(zipWith replicate(drop 2 golomb)[3..])
Respostas:
GolfScript (31 caracteres)
Demo
fonte
Gelatina , não concorrente
10 bytes Esta resposta não é competitiva, pois o desafio antecede a criação do Jelly.
Isso usa a fórmula recursiva a (1) = 1, a (n + 1) = 1 + a (n + 1 - a (a (n))) da página OEIS.
Experimente online!
Como funciona
fonte
PHP - 63 caracteres
Rápido e curto.Eu pareço ter tido a sequência errada em mente. Derp.
Isso é CORRETO, rápido e curto.
A precisão pode ultrapassar a marca exigida de 100.000, mas eu realmente a encontrei.
fonte
PHP
Esta versão recursiva é mais curta (60), mas computacionalmente ineficiente:
Isso é muito mais rápido, mas mais longo (78):
Muito mais rápido, mas com 89 caracteres, seria:
Qual é O (n)
fonte
Haskell,
3027 caracteresfonte
Oásis , 7 bytes (não concorrente)
Código:
Experimente online!
Oasis é uma linguagem projetada por Adnan, especializada em seqüências.
Atualmente, esse idioma pode fazer recursão e formulário fechado.
O
T
no final é uma abreviação de10
, o que indica quea(0) = 0
ea(1) = 1
. Para adicionar mais casos de teste, basta adicionar à lista no final.Agora calculamos essencialmente
a(n-a(a(n-1))+1
.fonte
Perl, 48 caracteres
Entrada em stdin, saída para stdout. Precisa do Perl 5.10+ e
-M5.010
para ativar osay
recurso. Demora cerca de O ( n 2 ) tempo devido à manipulação ineficiente da matriz, mas ainda é rápido o suficiente para calcular facilmente até o 100.000º termo.fonte
Julia - 28
De uma maneira recursiva :
Resultado:
fonte
Python - 64 caracteres
fonte
[i]*g[i-1]
que fazer isso, então me inclinei para trás para fazer de outra maneira; Eu pensei que iria se comportar mais como multiplicar uma matriz por um escalar por algum motivo ...Javascript, 93 caracteres
fonte
J, 43 caracteres
Define uma função usando a expressão assintótica fornecida na página da Wikipedia.
Irritantemente 9 caracteres são usados apenas para arredondar para o número inteiro mais próximo.
fonte
Prelúdio ,
695554 bytesSe um intérprete compatível com o padrão for usado, isso terá entrada e saída como valores de bytes . Para realmente usar números decimais em STDIN / STDOUT, você precisa do interpretador Python com
NUMERIC_OUTPUT = True
e uma opção adicionalNUMERIC_INPUT = True
.Explicação
O esqueleto do programa é
Lemos a entrada
N
na primeira voz e a diminuímosN-1
. Também inicializamos a segunda voz para1
. Em seguida, fazemosN-1
um loop uma vez, cada iteração da qual obtém o próximo valor da sequência na segunda pilha. No final, imprimimos oN
número th.A idéia do programa é colocar cada elemento da sequência em uma fila na terceira voz e diminuir o cabeçalho dessa fila em cada iteração. Quando a cabeça chega
0
, aumentamos o valor da sequência e removemos isso0
.Agora, o problema é que o Prelude usa pilhas e não filas. Portanto, precisamos mudar um pouco a pilha para usá-la como uma fila.
Isso copia o valor atual da sequência para a primeira voz (como uma cópia temporária), empurra a
0
para a segunda voz (para marcar o fim da fila). E, em seguida, executa um loop para deslocar (e, assim, reverter) a terceira pilha para a segunda. Após o loop, colocamos a cópia do valor atual da sequência no topo da segunda pilha (que é a cauda da nossa fila).Isso parece um pouco feio, mas essencialmente é um loop que muda a pilha de volta para a terceira voz. Como a
)
coluna está na mesma coluna das instruções de mudança, a0
que colocamos na segunda voz anteriormente também terminará na terceira, portanto, precisamos removê-la com outra#
. Em seguida, diminua o topo da 3ª voz, ou seja, o início da fila.Agora fica um pouco chato - queremos executar algum código quando esse valor for
0
, mas a única estrutura de controle do Prelude (o loop) responde apenas a valores diferentes de zero.Observe que o topo da segunda voz é verdadeiro (já que a sequência de Golomb não contém nenhum
0
s). Portanto, a carga de trabalho entra nessa voz (o último par de parênteses). Só precisamos impedir que isso aconteça se o início da fila0
ainda não estiver. Então, primeiro temos um "loop" na terceira voz que empurra um0
para a segunda voz se a cabeça da fila ainda é diferente de zero. Também colocamos uma0
terceira voz para sair do loop imediatamente. A#
terceira voz remove isso0
ou remove a cabeça da fila, se esse já era zero. Agora esse segundo loop será inserido apenas se o cabeçalho da fila for zero (e o0
na segunda voz nunca foi pressionada). Nesse caso, incrementamos o valor atual da sequência e pressionamos a0
para sair do loop. Por fim, sempre haverá um0
no topo da pilha, que precisamos descartar.Eu lhe disse que a negação lógica é irritante no Prelude ...
fonte
Mathematica, 27 bytes
Outra solução recursiva.
fonte
CJam, 14 bytes
Como o CJam é muito mais jovem que esse desafio, essa resposta não é elegível para a marca de seleção verde. No entanto, é muito raro você usar
j
isso muito bem, então eu queria publicá-lo de qualquer maneira.Teste aqui.
Explicação
j
é basicamente o "operador de recursão memorizado". É preciso um número inteiroN
, uma matriz e um blocoF
. A matriz é usada para inicializar a memória: o elemento no índicei
será retornadoF(i)
.j
então calculaF(N)
, procurando ou executando o bloco (comn
na pilha) se o valor ainda não tiver sido memorizado. O recurso realmente bacana é que, dentro do bloco,j
apenas leva um número inteiroi
e chamaF(i)
recursivamente. Então aqui está o código:fonte
J, 16 bytes
Esta solução baseia-se fortemente na solução de algoritmshark para um problema semelhante. Você pode encontrar alguma explicação sobre esse método aqui.
J, 33 bytes
Nesta abordagem eu construir-se uma sequência
h(k)
com os valores dos índices primeirosi
onde og(i)=k
assimh = 1 2 4 6 9 12 16...
. Podemos obterh(k)
bastante simples a partirh(1..k-1)
com a expressão({:+1+[:+/#<:])
onde a entrada éh(1..k-1)
.O cálculo da saída
h
é simples.h ([:+/]>:[) input
fonte
Brachylog , 13 bytes (não concorrente)
Experimente online!
Explicação
fonte
Python - 76 caracteres
fonte
None
s. Parece ser o valor "correcta" deNone
s tho :)None
tipo. Eu apenas usei as compreensões da lista aninhada para obter um loop aninhado. A única finalidade das compreensões lista aqui é fazer com que o código para repetir o número certo de vezes - eles são jogar fora os valoresJavaScript - 48 caracteres
Cria uma matriz indexada em 1
g
contendo os valores da sequência.Editar - JavaScript - 46 caracteres
Cria uma matriz indexada em 1
v
contendo os valores da sequência.Editar 2 - ECMAScript 6 - 27 caracteres
Os dois primeiros são razoavelmente rápidos - o terceiro é muito lento
fonte
Haskell, 63 bytes
Esta é a abordagem ingênua, eu não estava ciente do retorno muito curto quando escrevi isso, mas pensei em publicá-lo de qualquer maneira, mesmo que seja mais longo do que todas as outras implementações de Haskell, como por exemplo
Calcular o enésimo termo da sequência auto-descritiva de Golomb
e
/codegolf//a/23979/24877
fonte