Preludio , 69 55 54 bytes
?1-(v #1)-
1 0v ^(# 0 (1+0)#)!
(#) ^#1-(0)#
Si se utiliza un intérprete compatible estándar, esto toma la entrada y la salida como valores de byte . Para usar números decimales en STDIN / STDOUT, necesitaría el intérprete de Python con NUMERIC_OUTPUT = True
una opción adicional NUMERIC_INPUT = True
.
Explicación
El esqueleto del programa es
?1-( 1 -
1 )!
Leemos la entrada N
en la primera voz y la disminuimos para obtener N-1
. También inicializamos la segunda voz para 1
. Luego hacemos N-1
un bucle una vez, cada iteración de la cual obtiene el siguiente valor de la secuencia en la segunda pila. Al final imprimimos el N
número th.
La idea del programa es poner cada elemento de la secuencia en una cola en la tercera voz, y disminuir el encabezado de esa cola en cada iteración. Cuando la cabeza alcanza 0
, incrementamos el valor de la secuencia y lo eliminamos 0
.
Ahora el problema es que Prelude usa pilas y no colas. Así que tenemos que cambiar un poco esa pila para usarla como una cola.
v #
0v ^
(#)
Esto copia el valor actual de la secuencia a la primera voz (como una copia temporal), empuja a 0
a la segunda voz (para marcar el final de la cola). Y luego realiza un bucle para desplazar (y por lo tanto invertir) la tercera pila sobre la segunda. Después del ciclo, colocamos la copia del valor de secuencia actual en la parte superior de la segunda pila (que es la cola de nuestra cola).
)
(#
^#1-
Esto se ve un poco feo, pero esencialmente es un bucle que cambia la pila de nuevo a la tercera voz. Dado que )
está en la misma columna que las instrucciones de cambio, la 0
que ponemos en la segunda voz antes también terminará en la tercera voz, por lo que debemos eliminarla con otra #
. Luego disminuya la parte superior de la tercera voz, es decir, la cabeza de la cola.
Ahora se vuelve un poco molesto: queremos ejecutar algo de código cuando ese valor es 0
, pero la única estructura de control de Prelude (el bucle) solo responde a valores distintos de cero.
0 (1+0)#
(0)#
Tenga en cuenta que la parte superior de la segunda voz es verdadera (ya que la secuencia de Golomb no contiene ninguna 0
s). Entonces, la carga de trabajo entra en esa voz (el último par de paréntesis). Solo necesitamos evitar que eso suceda si la cabeza de la cola 0
aún no está . Entonces, primero tenemos un "bucle" en la tercera voz que empuja 0
a la segunda voz si el encabezado de la cola todavía no es cero. También ponemos una 0
tercera voz para salir del bucle de inmediato. El #
en la tercera voz a continuación, elimina o bien que 0
, o elimina la cabeza de la cola si que ya cero era. Ahora ese segundo ciclo solo se ingresa si el encabezado de la cola era cero (y el0
en la segunda voz nunca fue presionada). En ese caso, incrementamos el valor actual de la secuencia y presionamos a 0
para salir del bucle. Por último, siempre habrá un 0
en la parte superior de la pila, que debemos descartar.
Te dije que la negación lógica es molesta en Prelude ...
n
lugar de2 - n % 1
. ¿Tiene alguna razón para esperar que las respuestas sean significativamente diferentes?