Prelúdio , 69 55 54 bytes
?1-(v #1)-
1 0v ^(# 0 (1+0)#)!
(#) ^#1-(0)#
Se 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 adicional NUMERIC_INPUT = True
.
Explicação
O esqueleto do programa é
?1-( 1 -
1 )!
Lemos a entrada N
na primeira voz e a diminuímos N-1
. Também inicializamos a segunda voz para 1
. Em seguida, fazemos N-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 o N
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 isso 0
.
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.
v #
0v ^
(#)
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).
)
(#
^#1-
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, a 0
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.
0 (1+0)#
(0)#
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 fila 0
ainda não estiver. Então, primeiro temos um "loop" na terceira voz que empurra um 0
para a segunda voz se a cabeça da fila ainda é diferente de zero. Também colocamos uma 0
terceira voz para sair do loop imediatamente. A #
terceira voz remove isso 0
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 a 0
para sair do loop. Por fim, sempre haverá um 0
no topo da pilha, que precisamos descartar.
Eu lhe disse que a negação lógica é irritante no Prelude ...
n
mais do que2 - n % 1
. Você tem algum motivo para esperar que as respostas sejam significativamente diferentes?