Considere la siguiente secuencia:
0 1 3 2 5 4 8 6 7 12 9 10 11 17 13 14 15 16 23 ...
Parece bastante sin patrón, ¿verdad? Así es como funciona. Comenzando con 0, saltar nnúmeros enteros, ncomenzando en 1. Ese es el siguiente número en la secuencia. Luego, agregue cualquier número "omitido" y que aún no se haya visto en orden ascendente. Luego, incremente ny salte desde el último número agregado. Repite este patrón.
Entonces, por ejemplo, cuando llegamos 11, estamos en n=5. Incrementamos npara ser n=6, saltar hacia arriba y 17luego agregar, 13 14 15 16ya que aún no se han visto. Nuestro próximo salto es n=7, entonces el siguiente elemento en la secuencia es 23.
El reto
Dada la entrada x, da salida al xtérmino de esta secuencia, los primeros xtérminos de la secuencia, o construye una lista infinita de los términos de la secuencia. Puede elegir 0 o 1 indexación.
E / S y reglas
- La entrada y salida se pueden dar por cualquier método conveniente .
- Se puede suponer que la entrada y la salida encajan en el tipo de número nativo de su idioma.
- Un programa completo o una función son aceptables. Si es una función, puede devolver el resultado en lugar de imprimirlo.
- Las lagunas estándar están prohibidas.
- Este es el código de golf, por lo que se aplican todas las reglas habituales de golf, y gana el código más corto (en bytes).

Respuestas:
JavaScript (ES7), 41 bytes
Devuelve el enésimo término de la secuencia, indexado en 0.
Pruébalo en línea!
¿Cómo?
Caso principal:n>3
Los primeros cuatro términos de la secuencia son especiales, así que dejémoslos a un lado por ahora.
Para , la secuencia se ve así:n>3
Podemos notar que, de hecho, hay dos subsecuencias intercaladas:
La mayoría de los valores pertenecen a la subsecuencia para la que simplemente tenemos:A
Algunos otros valores pertenecen a la subsecuencia (resaltada con paréntesis en el diagrama anterior) cuyos índices siguen la secuencia aritmética 3, 3, 4, 6, 9, 13, 18, 24 ... y para los cuales tenemos:B
donde es el índice en la secuencia principal y es el índice en la sub-secuencia de .k Bn k B
Los índices de en la secuencia principal están dados por:B
Dado , sabemos que el término correspondiente en la secuencia principal pertenece a si es una solución entera de la ecuación cuadrática:B nn B n
cuyo discriminante es:
y cuya solución positiva es:
Esperamos que sea un número entero. De ahí la prueba:Δ−−√
Casos especiales:0≤n≤3
Para , el discriminante es negativo y su raíz cuadrada resulta en NaN . Para , el discriminante es . Por lo tanto, se consideran estos cuatro primeros términos de la secuencia de pertenecer a la sub-secuencia de .n = 3 1 Bn<3 n=3 1 B
Si aplicamos nuestra fórmula estándar n - ~ d / 2 , obtendríamos:
en lugar de:
Es por eso que XOR estos resultados con respectivamente.0,1,2 and 1
fuente
Casco , 12 bytes
Pruébalo en línea!
Salidas como una lista infinita. Aquí es una versión que imprime la primera N .
Explicación
Θṁṙ_1C + ḣ2tNN - Programa completo. No tiene entrada, sale a STDOUT. tN: construye la lista infinita de números naturales, comenzando desde 2. + ḣ2 - Y añádele [1, 2]. Rendimientos [1,2,2,3,4,5,6,7,8,9,10,11, ...]. CN - Corta la lista infinita de enteros positivos en partes de esos Tamaños. Rendimientos [[1], [2,3], [4,5], [6,7,8], [9,10,11,12], ...]. ṁ - Mapa y aplanar los resultados a partir de entonces. ṙ_1: gire cada uno hacia la derecha 1 unidad. Rendimientos [1,3,2,5,4,8,6,7,12,9,10,11, ...] Θ - Anteponer un 0. Rendimientos [0,1,3,2,5,4,8,6,7,12,9,10,11, ...]fuente
Haskell , 43 bytes
Pruébalo en línea!
Define una lista infinita:
fuente
Jalea , 15 bytes
Este es un programa completo que, dado n , imprime los primeros n elementos de la secuencia.
Pruébalo en línea!
Cómo funciona
fuente
C (gcc),
736764 bytesPruébalo en línea!
Define una función
fque toma 0 indexadony produce elnnúmero th en la secuencia.Podemos analizar la secuencia de la siguiente manera:
Primero manejamos la sección central:
Tenga en cuenta que los argumentos de la izquierda (4, 6, 9, 13, ...) siguen un patrón: primero agregue dos, luego agregue tres, luego agregue cuatro, y así sucesivamente. Comenzamos en
t=4y agregamosd(que comienza en 2) cada iteración del ciclo, incrementandoden el proceso.El cuerpo del bucle es más interesante. Recuerde que queremos mapear 4 a 5, 6 a 8, 9 a 12, etc .; eso es solo agregar
d-1sixest. Sin embargo, esta lógica viene antes del último caso,f(n) = n - 1por lo que sabemos que vamos a restar 1 al final. Por lo tanto, simplemente podemos agregardifx == t(x-t||(x+=d)). Sin embargo, también necesitaremos para salir del bucle inmediatamente después de esto - así que agregamos que paradconseguir la absurda buscandod+=x+=d, que siempre hará que lad<xcondición de falla.Esto cubre todo excepto los primeros cuatro valores. Mirándolos en binario, obtenemos:
Entonces, queremos voltear el último bit si
2 <= x < 4. Esto se logra conx^x/2.x/2da el segundo bit menos significativo, por lo que XORing esto con el número original voltea el último bit si el número es 2 o 3.fuente
Jalea ,
1310 bytes-3 Gracias a Dennis (use la indexación 0 para guardar 2 de la configuración de suma acumulativa y una disminución final)
Un enlace monádico que acepta un entero, n indexado en 0 , que devuelve un entero, a (n)
Pruébalo en línea! O ver un conjunto de pruebas
fuente
ḶÄ+3i+’, pero no tengo idea de cómo manejar los casos extremos.Ḷ»ạ¥3paraḊ3,2;- parece que debería haber terser para este bit.Ḷ»2Äi+_>2$ahorra 3 bytes, con indexación basada en 0.Perl 5 con
-pl70 bytesPruébalo en línea!
fuente
MATL , 22 bytes
Emite los primeros
ntérminos de la secuencia.Pruébalo en línea!
Explicación
fuente
Haskell , 51 bytes
Pruébalo en línea!
Un poco más largo que la respuesta de Lynn Haskell , pero el enfoque diferente podría ser interesante, no obstante.
fuente
Ruby , 73 bytes
Pruébalo en línea!
Función recursiva que devuelve los primeros x números de la lista.
fuente
QBasic, 58 bytes
Salidas indefinidamente. Es posible que desee agregar un
SLEEP 1dentro del bucle o hacerloLOOP WHILE b<100o algo así para ver los resultados.Básicamente, esto solo implementa la especificación. Observe que los números a los que volvemos siempre serán los números entre el número saltado más recientemente y el número saltado antes de eso. Así que almacenamos estos límites como
ayby usamos unFORbucle para imprimir todos los números entre ellos.fuente
05AB1E , 14 bytes
Pruébalo en línea!
fuente
R , 70 bytes
Pruébalo en línea!
Fconstante gracias a la sugerencia de @JADsetdifflugar dex[x %in% y]Versión anterior (79 bytes)
fuente
5 bytesy causa un montón de advertencias!F/Tno se redefine en la definición de la función. No (IIRC) modifica el valor global paraF/TPython 2 , 123 bytes
Pruébalo en línea!
Dada la entrada x, genera los primeros x términos de la secuencia,
Estoy aprendiendo Python y estos desafíos hacen que las cosas sean más interesantes.
Editar: afeitar algunos espacios en blanco
fuente
for n in range(1,z) if len(s) < z]; return s:for n in range(1,z)if len(s)<z];return s.Jalea , 16 bytes
Pruébalo en línea!
Un byte más largo que la respuesta de Jelly existente, pero esto posiblemente podría jugarse un poco.
RÄṬŻk²Ḋ$tal vez podría ser más corto.18 bytes
Más largo pero diferente.
fuente
Ruby , 63 bytes
Pruébalo en línea!
0 indexado. Probablemente se pueda jugar golf.
fuente
Perl 6 , 52 bytes
Pruébalo en línea!
Esta es una expresión generadora que usa el
...operador. Busca huecos en la secuencia anterior a@_través de((^max @_)∖@_).min.?key:El
?es necesario para el valor inicial que no tiene a.key. Si no se encuentran huecos, agrega n (aquí en la$variable) al último valor de la lista, más uno para 0 errores.fuente
Python 3 , 104 bytes
Pruébalo en línea!
Dada la entrada x, genera las primeras x "secuencias"
fuente