Inspirado en la pregunta anterior .
La secuencia autodescriptiva de Golomb g (n) es una secuencia en la que cualquier número natural n
se repite dentro de la secuencia g (n) veces.
Los primeros pocos números en la secuencia son:
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
Puede ver que g (4) = 3, y que "4" se repite 3 veces en la secuencia.
Dada una entrada de n
, salida g(n)
.
Limitaciones: n <100000.
El código más pequeño gana.
n
lugar de2 - n % 1
. ¿Tiene alguna razón para esperar que las respuestas sean significativamente diferentes?golomb=1:2:2:concat(zipWith replicate(drop 2 golomb)[3..])
Respuestas:
GolfScript (31 caracteres)
Manifestación
fuente
Gelatina , no competidora
10 bytes Esta respuesta no es competitiva, ya que el desafío es anterior a la creación de Jelly.
Utiliza la fórmula recursiva a (1) = 1, a (n + 1) = 1 + a (n + 1 - a (a (n))) de la página OEIS.
Pruébalo en línea!
Cómo funciona
fuente
PHP - 63 caracteres
Rápido y corto.Parece que tuve en mente la secuencia incorrecta. Derp.
Esto es CORRECTO, rápido y corto.
La precisión puede sufrir más allá de la marca requerida de 100,000, pero de hecho cumplí con la marca.
fuente
PHP
Esta versión recursiva es más corta (60) pero computacionalmente ineficiente:
Esto es mucho más rápido pero más largo (78):
Mucho más rápido, pero con 89 caracteres sería:
Que es O (n)
fuente
Haskell,
3027 caracteresfuente
Oasis , 7 bytes (no competitivos)
Código:
Pruébalo en línea!
Oasis es un lenguaje diseñado por Adnan especializado en secuencias.
Actualmente, este lenguaje puede hacer recursividad y forma cerrada.
Al
T
final es la abreviatura de10
, que indica quea(0) = 0
ya(1) = 1
. Para agregar más casos de prueba, simplemente agregue a la lista al final.Ahora esencialmente calculamos
a(n-a(a(n-1))+1
.fuente
Perl, 48 caracteres
Entrada en stdin, salida a stdout. Necesita Perl 5.10+ y el
-M5.010
para habilitar lasay
función. Toma alrededor del tiempo O ( n 2 ) debido a la manipulación ineficiente de la matriz, pero aún lo suficientemente rápido como para calcular fácilmente hasta el término 100,000.fuente
Julia - 28
De manera recursiva :
Salida:
fuente
Python - 64 caracteres
fuente
[i]*g[i-1]
haría eso, así que me incliné hacia atrás para hacerlo de otra manera; Pensé que se comportaría más como multiplicar una matriz por un escalar por alguna razón ...Javascript, 93 caracteres
fuente
J, 43 caracteres
Define una función utilizando la expresión asintótica dada en la página de wikipedia.
Molestamente, se usan 9 caracteres simplemente redondeando al entero más cercano.
fuente
Preludio ,
695554 bytesSi 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 adicionalNUMERIC_INPUT = True
.Explicación
El esqueleto del programa es
Leemos la entrada
N
en la primera voz y la disminuimos para obtenerN-1
. También inicializamos la segunda voz para1
. Luego hacemosN-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 elN
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 eliminamos0
.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.
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).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, la0
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.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 cola0
aún no está . Entonces, primero tenemos un "bucle" en la tercera voz que empuja0
a la segunda voz si el encabezado de la cola todavía no es cero. También ponemos una0
tercera voz para salir del bucle de inmediato. El#
en la tercera voz a continuación, elimina o bien que0
, 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 a0
para salir del bucle. Por último, siempre habrá un0
en la parte superior de la pila, que debemos descartar.Te dije que la negación lógica es molesta en Prelude ...
fuente
Mathematica, 27 bytes
Otra solución recursiva.
fuente
CJam, 14 bytes
CJam es mucho más joven que este desafío, por lo que esta respuesta no es elegible para la marca de verificación verde. Sin embargo, es bastante raro que puedas usar
j
esto muy bien, así que quería publicarlo de todos modos.Pruébalo aquí.
Explicación
j
es básicamente el "operador de recursión memorizado". Se necesita un número enteroN
, una matriz y un bloqueF
. La matriz se utiliza para inicializar la memorización:i
se devolverá el elemento en el índiceF(i)
.j
luego calculaF(N)
, ya sea buscándolo o ejecutando el bloque (conn
en la pila) si el valor aún no se ha memorizado. La característica realmente ingeniosa es que dentro del bloque,j
solo toma un número enteroi
y llamaF(i)
recursivamente. Entonces aquí está el código:fuente
J, 16 bytes
Esta solución se basa en gran medida en la solución de algoritmoshark a un problema similar. Puede encontrar alguna explicación sobre este método allí.
J, 33 bytes
En este enfoque, construyo una secuencia
h(k)
con los valores de los primeros índicesi
donde esg(i)=k
asíh = 1 2 4 6 9 12 16...
. Podemos obtener de manerah(k)
bastante simpleh(1..k-1)
con la expresión({:+1+[:+/#<:])
donde está la entradah(1..k-1)
.Calcular la salida de
h
es sencillo.h ([:+/]>:[) input
fuente
Brachylog , 13 bytes (no competidor)
Pruébalo en línea!
Explicación
fuente
Python - 76 caracteres
fuente
None
s. Parece ser la cantidad "correcta" deNone
s tho :)None
tipo. Acabo de usar las comprensiones de la lista anidada para lograr un bucle anidado. El único propósito de las comprensiones de la lista aquí es hacer que el código se repita el número correcto de veces, son valoresJavaScript: 48 caracteres
Crea una matriz indexada 1 que
g
contiene los valores de secuencia.Editar - JavaScript - 46 caracteres
Crea una matriz indexada 1 que
v
contiene los valores de secuencia.Edición 2 - ECMAScript 6 - 27 caracteres
Los dos primeros son razonablemente rápidos: el tercero es muy lento
fuente
Haskell, 63 bytes
Este es el enfoque ingenuo, no era consciente de la breve recurrencia cuando escribí esto, pero pensé en publicarlo de todos modos, incluso si es más largo que todas las demás implementaciones de Haskell, como por ejemplo
Calcule el enésimo término de la secuencia autodescriptiva de Golomb
y
/codegolf//a/23979/24877
fuente