Comenzamos con una secuencia en blanco de 1 índice:
_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,...
En el enésimo paso, rellenamos cada a (n) espacios en blanco con los enteros mayores que 1 comenzando en el primer espacio en blanco restante, donde a (n) es la enésima entrada de la secuencia.
Después del primer paso:
2,_,3,_,4,_,5,_,6,_,7,_,8,_,9,_,10,_,11,_,12,_,13,_,...
Tenga en cuenta que a (1) tiene que ser 2 porque el primer entero mayor que 1 es 2.
En el segundo paso, completamos cada a (2) espacios en blanco. Será evidente que a (2) debe ser 2.
2,2,3,_,4,3,5,_,6,4,7,_,8,5,9,_,10,6,11,_,12,7,13,_,...
En el tercer paso, completamos cada a (3) espacios en blanco. De la secuencia, a (3) = 3.
2,2,3,2,4,3,5,_,6,4,7,_,8,5,9,3,10,6,11,_,12,7,13,_,...
En el cuarto paso, completamos cada a (4) espacios en blanco. De la secuencia, a (4) = 2.
2,2,3,2,4,3,5,2,6,4,7,_,8,5,9,3,10,6,11,3,12,7,13,_,...
Finalmente:
2,2,3,2,4,3,5,2,6,4,7,2,8,5,9,3,10,6,11,3,12,7,13,2,...
Tarea
Dado n, devuelve el enésimo elemento de la secuencia.
Los primeros 10,000,000 términos de la secuencia se pueden encontrar aquí .
Este es el código de golf . La respuesta más corta en bytes gana. Se aplican lagunas estándar .
Respuestas:
Haskell ,
8067 bytesPruébalo en línea!
Haskell es el lenguaje perfecto para definir una lista infinita en términos de sí mismo.
fuente
let
guardias de patrones.pattern1 | let pattern2 = expr2 = expr1
significa lo mismo quepattern1 = let pattern2 = expr2 in expr1
(por la misma razón que[expr1 | let pattern2 = expr2]
significa lo mismo que[let pattern2 = expr2 in expr1]
).let
guardias de patrones (especialmente que pueden hacer funciones)! Además,m=2:2:2`drop`g m
es un byte más corto.(!!)$0:m
es dos bytes más corto.2:2:
cosas por completo con un poco más de pereza:g ~(a:b)|...
ym=g m
.C, 123 bytes
Pruébalo en línea!
Tutorial
Asigne una matriz de n enteros para almacenar los primeros n elementos de la secuencia. Este hardcodes
sizeof(int)
como4
, lo cual es una suposición segura en la mayoría de los casos y ciertamente estoy dispuesto a hacer en el contexto del golf de código. :)Todos estos son contadores:
i
para el índice del paso en el que estamos,j
recorrer la secuencia buscando espacios vacíos yk
contar cuántos espacios vacíos se han visto.Antes de comenzar nuestro ciclo principal, introducimos a escondidas una inicialización de los dos primeros elementos de la secuencia
2
. (p[0]
=*(p + 0)
=*p
.) Sink
embargo, esto descarta la cuenta , pero ...... también hacemos una inicialización disimulada de
k
, que prueba para ver sii
es menor2
y corrige el valor inicial dek
si es así. El ciclo interno también comienza aquí, que itera sobre toda la secuencia hasta el momento durante cada paso.Esta línea realmente podría usar algunas explicaciones. Podemos expandir esto a:
por cortocircuito, y luego por las leyes de De Morgan y el hecho de que
0
es falso en C:Esto esencialmente dice: "si este espacio está vacío, incremente
k
. Y sik
anteriormente era un múltiplo del tamaño del paso, ejecute la siguiente instrucción". Por lo tanto, ejecutamos la declaración en cada elemento de tamaño de paso , que es exactamente cómo se describe la secuencia. La declaración en sí es simple; lo único que hace es generar2
,3
,4
, ....Utilizando el complicado retorno-sin-retorno que trabaja con
gcc
, nos "retorno" el último elemento de los primeros n términos de la secuencia, que pasa a ser el n º plazo.fuente
Pyth, 29 bytes
Pruébalo en línea
Cómo funciona
En lugar de perder el tiempo con las listas, esto usa una fórmula recursiva simple.
fuente
Haskell , 67 bytes
Pruébalo en línea!
Una solución aritmética recursiva que resultó básicamente el mismo método que la respuesta Pyth de Anders Kaseorg .
Este código está cubierto de verrugas, partes feas que parecen que podrían ser eliminadas, pero no vi cómo.
La función
i%j
realmente quiere usar un protector para verificar simod i(f j)>0
y evaluar una de las dos expresiones correspondientes. Pero, ambas expresiones usandiv i(f j)
. Unir eso en un guardia no hará que se aplique a ambos lados. Hasta donde yo sé, no se puede hacer que un guardia se "distribuya" sobre otros guardias.let
ywhere
son demasiado largos Entonces, el código usalast
para elegir una de dos expresiones mientras el protector vincula la variable. UghIdealmente usaríamos
divMod
porque se tanto eldiv
ymod
, pero(d,m)<-divMod ...
es una expresión larga. En su lugar, verificamos de forma hackea que el mod no sea cero al ver si eldiv
valor multiplicado por el divisor no alcanza el valor original.El
0%j=2
caso no sería necesario si Haskell hiciera un cortocircuitodiv 0
, lo cual no es así. Los.pred
convierte la entrada 1-indexada a cero-indexados, o de lo contrario no habría-1
correcciones en todas partes.fuente
%
1 indexado, entonces necesita una corrección de cinco bytes, lo que simplemente vincula. Sin embargo , puedef
ingresar%
en línea sin costo, y luego sef
convierte en anónimo, de modo que ahorra dos bytes en general.f
sin perder bytes.divMod
parece ser un byte más barato, ya que permite la ramificación con!!(0^m)
. Hasta ahora tengo:1%j=2;i%j|(d,m)<-divMod(i-1)$j%1=[(i-d-1)%(j+1),d+2]!!(0^m);(%1)
.pred
.JavaScript (ES6),
989391 bytesUna función recursiva que se detiene tan pronto como el resultado esté disponible.
Versión alternativa, 90 bytes.
Sugerido por Shaggy para -1 byte
Este debe ser llamado con
f(n)()
. Aunque la publicación correspondiente en meta actualmente da una puntuación positiva, esta sintaxis aparentemente está en disputa.Manifestación
Mostrar fragmento de código
fuente
n=>g=(p,a=[...Array(n)])=>a[n-1]||g(-~p,a.map(c=>c?c:i?i++%k?c:++v:(i=1,v=2),i=0,k=a[p]||2))
debería funcionar para 92 bytes. Llámalo conf(n)()
.Java 8, 124 bytes
Expresión lambda.
Crea una matriz de enteros y la llena continuamente hasta que se rellena el enésimo valor.
Predeclarar variables en la parte superior para reducir tantas declaraciones como sea posible ya que cada una
int
cuesta 4 bytes de espacio en lugar de sumar,n
cuál es 2.En la
j
'th iteración de cálculo, el número de' espacios en blanco 'que uno debe omitir es igual aa[j]
(o 2, si está en blanco). Resulta que si el primer espacio en blanco que tenemos que llenar está en la posiciónk
,k * a[j]
nos da el 'paso' (s
).fuente