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 n
números enteros, n
comenzando 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 n
y salte desde el último número agregado. Repite este patrón.
Entonces, por ejemplo, cuando llegamos 11
, estamos en n=5
. Incrementamos n
para ser n=6
, saltar hacia arriba y 17
luego agregar, 13 14 15 16
ya 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 x
término de esta secuencia, los primeros x
té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
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
f
que toma 0 indexadon
y produce eln
nú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=4
y agregamosd
(que comienza en 2) cada iteración del ciclo, incrementandod
en 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-1
six
est
. Sin embargo, esta lógica viene antes del último caso,f(n) = n - 1
por lo que sabemos que vamos a restar 1 al final. Por lo tanto, simplemente podemos agregard
ifx == t
(x-t||(x+=d)
). Sin embargo, también necesitaremos para salir del bucle inmediatamente después de esto - así que agregamos que parad
conseguir la absurda buscandod+=x+=d
, que siempre hará que lad<x
condició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/2
da 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.Ḷ»ạ¥3
paraḊ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
-pl
70 bytesPruébalo en línea!
fuente
MATL , 22 bytes
Emite los primeros
n
té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 1
dentro del bucle o hacerloLOOP WHILE b<100
o 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
a
yb
y usamos unFOR
bucle 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!
F
constante gracias a la sugerencia de @JADsetdiff
lugar dex[x %in% y]
Versión anterior (79 bytes)
fuente
5 bytes
y causa un montón de advertencias!F/T
no se redefine en la definición de la función. No (IIRC) modifica el valor global paraF/T
Python 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