Aquí está la secuencia de la que estoy hablando:
{1, 4, 5, 9, 10, 11, 16, 17, 18, 19, 25, 26, 27...}
A partir de 1, mantenga 1, suelte los siguientes 2, mantenga los siguientes 2, suelte 3, mantenga 3 y así sucesivamente. Sí, ¡también está en OEIS (A064801) !
El reto
Dado un entero n>0
, encuentre el enésimo término de la secuencia anterior
Casos de prueba
Input -> Output
1->1
22->49
333->683
4444->8908
12345->24747
Este es el código de golf, por lo que gana la respuesta más corta en bytes. ¡Buena suerte!
Respuestas:
Java (OpenJDK 8) ,
4544 bytesPruébalo en línea!
-1 byte gracias a @Nevay
Después de mirar esto por un tiempo, noté un patrón. Cada vez que soltamos
n
números, el siguiente número en la secuencia es un cuadrado perfecto. Al ver esto, rompí mentalmente la secuencia en trozos convenientes:[[1],[4,5],[9,10,11],...]
Básicamente, eli
trozo th comienza coni*i
, e itera hacia arriba para losi
elementos.Para encontrar el
n
número th en esta secuencia, queremos encontrar primero en qué parte se encuentra el número y luego en qué posición ocupa la parte. Restamos nuestro número de incrementosi
den
hastan
es menor quei
(lo que nos da nuestra trozo), y luego simplemente se añaden-1
ai*i
conseguir la correctaposition
en el trozo.Ejemplo:
fuente
return~-n+i*i;
para guardar 1 byte.Haskell,
484341 bytes4 bytes adicionales para indexación basada en 1 en lugar de basada en 0. Una restricción innecesaria, en mi humilde opinión.
Pruébalo en línea!
fuente
Python 3 ,
4746 bytes1 byte gracias al Sr. Xcoder.
Pruébalo en línea!
MUY rápido para números más altos
fuente
def f(n):a=round((2*n)**.5);return~-n+a*-~a//2
. Aunque no estoy seguro ... ¡Enfoque inteligente!a*(a+1)
es incluso para cada entero. ¿Python se queja de la división de flotación en enteros? ¿Se queja de operaciones bit a bit en flotadores? Si no es así:(2*n)**.5+.5|0
.Jalea , 8 bytes
Pruébalo en línea!
fuente
Haskell , 33 bytes
Una función anónima. Usar como
((!!)$0:do n<-[1..];[n^2..n^2+n-1]) 1
Pruébalo en línea!
!!
. El0:
es un elemento ficticio para ajustar la indexación basada en 0 a 1.[n^2..n^2+n-1]
construye una subsecuencia sin espacios, comenzando con el cuadrado den
y que contienen
números.do
notación concatena los rangos construidos para todosn>=1
.fuente
Python 3 , 46 bytes
Pruébalo en línea!
fuente
Perl 6 , 43 bytes
Pruébalo
Expandido:
(1..*).rotor({++$=>++$+1}...*)
produce:fuente
TeX, 166 bytes
Uso
fuente
Javascript,
4338 bytesPruébalo en línea!
Uso el hecho de que para cada número triangular más uno, el resultado es un número cuadrado.
Como ejemplo: los números triangulares son 0, 1, 3, 6, 10 ... así que para 1, 2, 4, 7, 11 ... observamos 1, 4, 9, 16, 25 ... en nuestra secuencia .
Si el índice está en algún lugar entre estos números conocidos, los elementos de nuestra secuencia solo avanzan en uno. Por ejemplo, para calcular el resultado de 10, tomamos 7 (como un número triangular más uno), tomamos el resultado (16) y sumamos 10-7 = 3. Por lo tanto, 16 + 3 = 19.
fuente
05AB1E , 12 bytes
Pruébalo en línea!
fuente
[0..a-1] + a**2
, lo genial aquí es que enÝÁćn+
lugar deD<Ýsn+
.cQuents , 27 bytes
Pruébalo en línea!
Actualmente un puerto de la respuesta Python de Leaky , creo que hay una mejor manera.
fuente
Swift 3 , 72 bytes
Puerto de mi solución Python .
Banco de pruebas.
fuente
C # (Mono) , 164 bytes
Pruébalo en línea!
fuente
Mathematica, 37 bytes
Explicación
Function
que toma un entero positivo#
y devuelve la serie de#
números consecutivos en la secuencia.Produce la lista de todas esas ejecuciones hasta la entrada
#
Flattens
la lista resultante y devuelve el#
elemento th.fuente
Perl 5 , 33 + 1 (-p) = 34 bytes
Pruébalo en línea!
fuente
Tampio ,
310308 bytesUso:
4:n uni
evalúa a9
.Explicación:
De la biblioteca estándar:
fuente
JavaScript (ES6), 33 bytes
Solución recursiva inspirada en las observaciones de Xanderhall .
Intentalo
fuente
Python 3 , 50 bytes
Pruébalo en línea!
fuente
Mathematica, 82 bytes
fuente
Python , 40 bytes
Pruébalo en línea!
Optimizando la expresión de Leaky Nun .
Python , 41 bytes
Pruébalo en línea!
Expresión recursiva
fuente
Javascript (ES6)
10098 BytesLo hice rápido, así que apuesto a que hay mucho margen de mejora, solo bucles y contadores básicos.
fuente
Retina , 27 bytes
Pruébalo en línea! Puerto de la respuesta Python de @ LeakyNun. La primera y la última etapa son simplemente aburridas decimales conversion conversión unaria. La segunda etapa funciona así:
((^1|1\2)+)
es un emparejador de números triangulares;$1
es el número triangular coincidente mientras que$2
es su índice. Los arrastran1
medios que coincide con el mayor número triangular estrictamente menor que la de entrada, lo que resulta en exactamente una iteración menos que el bucle de Python, lo que significa que$1
es equivalente aa-i
y$2
a igualar en ese caso también.i-1
y su suma esa-1
o~-a
según sea necesario. ($&
solo evita que la coincidencia se elimine del resultado). Tenga en cuenta que para una entrada de1
no coincidencia ocurre y la salida es simplemente la misma que la entrada. Si fueras perverso, podrías usar^((^1|1\2)*)1
fuente
MATL , 12 bytes
Pruébalo en línea!
Explicación
fuente
C (gcc) , 38 bytes
Usando el algoritmo de @ Xanderhall aquí
Pruébalo en línea!
fuente
PHP,
48 4237 + 1 bytesportado de la respuesta de Leaky Nun
Ejecutar como tubería
-F
o probarlo en línea .enfoque directo, 42 + 1 bytes (portado de la otra respuesta de Leaky Nun )
Ejecutar como tubería con
-nR
o sin comentarios en TiO anterior.solución iterativa anterior, 48 + 1 bytes
fuente