Fondo
Considere una secuencia definida de la siguiente manera:
- El primer elemento es 0;
- El segundo elemento es 4;
- A partir del tercer elemento, su valor puede calcularse mediante:
- Tomando el conjunto de enteros desde 0 hasta el elemento anterior de la secuencia (inclusivo o exclusivo, no importa);
- Eliminar todos los enteros que ya aparecieron anteriormente en la secuencia del conjunto;
- Agregar todos los elementos restantes del conjunto; ese es el valor que quieres.
Curiosamente, esta secuencia aún no parece estar en OEIS .
La tarea
Escribir un programa o función que toma un número entero n como entrada, y da salida a la n -ésimo elemento de la secuencia.
Casos de prueba
Los primeros elementos de la secuencia son:
- 0 0
- 4 4
- 6 (1 + 2 + 3)
- 11 (1 + 2 + 3 + 5)
- 45 (1 + 2 + 3 + 5 + 7 + 8 + 9 + 10)
- 969 (1 + 2 + 3 + 5 + 7 ... 10 + 12 ... 44)
- 468930 (1 + 2 + 3 + 5 + 7… 10 + 12… 44 + 46… 968)
Aclaraciones
- En teoría, su programa debería ser capaz de manejar n arbitraria si se ejecuta en una variante de su lenguaje que tiene enteros ilimitados y acceso a una cantidad ilimitada de memoria. (Es improbable que los idiomas sin bignums puedan llegar mucho más allá de 468930, pero eso no es excusa para codificar las respuestas).
- Puede elegir la indexación basada en 0 o en 1 para la secuencia (por ejemplo, depende de usted si n = 1 devuelve el primer elemento, n = 2 el segundo elemento, etc.) o si n = 0 devuelve el primer elemento , n = 1 el segundo elemento, y así sucesivamente).
- No hay requisitos sobre el algoritmo que usa, ni sobre su eficiencia; puede implementar la definición de la secuencia directamente (aunque sea realmente ineficiente), y también puede implementar un algoritmo diferente que conduzca a los mismos resultados.
Condición de victoria
Este es el código de golf , por lo que gana el programa correcto más corto, medido en bytes.
Respuestas:
Jalea ,
13129 bytesUtiliza indexación basada en 0.
Pruébalo en línea!
Cómo funciona
fuente
Python,
6660 bytes¡Gracias a @Dennis por reducir 6 bytes!
No es el código de golf más sofisticado, pero usa una fórmula que hice:
Donde está
x
el lado derechof(n - 1)
, yy
esf(n - 2)
.Explicación:
La suma de enteros continuos desde
a
hastab
(inclusive) se puede describir con esta fórmula:Donde
amount
(cantidad de números) se describe así:Y
average
(el promedio de todos los números) se describe así:Entonces la fórmula completa es ahora:
La forma en que aplicamos esta fórmula en la fórmula final es sustituir
a
porf(n - 1)
,b
paraf(n - 2)
, que, básicamente, calcula la suma de todos los nuevos términos, y añadir otraf(n - 1)
(que es ahoraa
), lo cual es la suma de todos los términos anteriores.Combinando eso juntos, obtenemos:
Reemplazar
a
conx
yb
cony
, y listo, tienes que formular la fórmula anterior.fuente
Python 2 ,
585450 bytesPruébalo en línea!
fuente
Mathematica,
4948 bytesUtiliza la codificación CP-1252. Define la función
PlusMinus (±)
. 1 indexado.Explicación
fuente
Oasis , 11 bytes
Código:
Explicación:
Para visualizar la relación de f n , tomemos el ejemplo f 5 . Para calcular f 5 , echemos un vistazo a la siguiente suma:
1 + 2 + 3 + 5 + 7 + 8 + 9 + 10
La parte en negrita es igual a f 4 . La parte 7 + 8 + 9 + 10 es el rango [f n-2 + 1, f n-1 - 1] . Eso hace que la fórmula f n-1 + Σ [f n-2 + 1 ... f n-1 - 1] ( enlace Wolfram ):
f n = 0.5 × (f n-1 2 - f n-2 2 + f n-1 - f n-2 )
Que se puede reescribir a:
f n = 0.5 × ((f n-1 - f n-2 ) (f n-1 + f n-2 ) + (f n-1 - f n-2 ))
f n = 0.5 × ((f n-1 - f n-2 ) (f n-1 + f n-2 + 1))
Cuál es la fórmula que usaremos en el código:
Explicación del código
La
640
parte nos da los casos base:El código que se ejecutará (que define a (n) ):
Pruébalo en línea!
fuente
Julia,
393332 bytesBasado en 0.
Gracias a @Dennis, guardado 6 bytes.
Gracias a @GlenO, guardé un byte.
Pruébalo en línea!
Respuesta anterior 1- basada:
Pruébalo en línea!
Respuesta anterior sin golf 1 basada:
Pruébalo en línea!
fuente
n<3?5n-n^2:
lugar den<4?2(n>1)n:
: tenga en cuenta que cambia a usar indexación basada en 0.JavaScript (ES6), 47 bytes
Utiliza la relación de recurrencia que
f(n) = sum(range(f(n-2) + 1, f(n-1) + 1))
para n> 2.fuente
PowerShell ,
84898887 bytesPruébalo en línea!
Explicación
Indexación basada en 0. Solo funciona
n = 6
(en mi máquina Windows se bloquea con un desbordamiento de pilan = 7
).Usando el mismo método que la respuesta de JungHwan Min (suma del rango menos la suma de los términos anteriores).
Sumar un rango / matriz en PowerShell es largo, por lo que estoy usando un truco para unir una matriz con
+
para crear una expresión larga (como1+2+3+4...etc
) y luego enviarla a través deiex
(Invoke-Expression
).Como necesito hacerlo dos veces, en lugar de usar
-join
estoy configurando la variable especial$OFS
, que significa separador de campo de salida. Cuando cadenas una matriz, este es el carácter utilizado para unir los elementos; Por defecto es un espacio. Entonces, configurándolo en+
(una vez), puedo reemplazar algo como$a-join'+'|iex
con"$a"|iex
.Un
for
bucle simple continúa hasta que el recuento de secuencia es menor o igual que el entero de entrada, luego devuelvo el$n
elemento th.fuente
;
necesario después delfor
ciclo. Nunca me di cuenta de eso antes.MATL ,
1716 bytes1
basada en la indexación se utiliza. El código es muy ineficiente. Porquen = 6
ya supera el límite de memoria del compilador en línea.Pruébalo en línea!
Cómo funciona
Para 20 bytes , la siguiente versión evita la limitación de memoria. Pero todavía existe la limitación del tipo de datos (el
double
tipo solo puede garantizar que los enteros se representen con precisión2^53
), por lo que los resultados son válidosn = 8
solo.¡Pruébalo en línea también!
fuente
Haskell , 42 bytes
Pruébalo en línea!
Esto implementa directamente la recurrencia que para
n>2
,f(n)
es igual af(n-1)
más la suma del intervalo abierto def(n-2)
af(n-1)
que de nuevo es igual a la suma del intervalo semiabierto desdef(n-2)
af(n-1)
inclusive.fuente
Haskell, 31 bytes
Ejemplo de uso:
((0:4#6)!!) 6
->468930
. Pruébalo en línea! .Recurrencia simple, que realiza un seguimiento del elemento máximo
m
hasta el momento y el siguiente valors
.fuente
JavaScript,
123119 bytesPruébalo en línea! Esta solución se basa-1,
f(1) => 0
.fuente
Perl 6 ,
52 49 4435 bytesIntentalo
Intentalo
Intentalo
Intentalo
Expandido:
fuente
PowerShell ,
7773 bytesPruébalo en línea!
Implementa el algoritmo como se define y está indexado en 0. La entrada de
6
es demasiado para TIO para manejar.Establece
$a
ser una matriz[0,4]
. Bucles desde1
hasta la entrada$n
. En el ciclo, tomamos el rango de números desde0
el número más grande que tenemos$a[-1]
, y usamos unaWhere-Object
cláusula|?{...}
para extraer solo aquellos números que aún no están presentes. Ese conjunto de números se-join
edita junto con+
s, y luego se alimenta aiex
(abreviaturaInvoke-Expression
y similar aeval
). Ese valor se concatena en una matriz al final de$a
. Finalmente, salimos de nuestro bucle y tomamos el$n
número th en nuestra matriz. Ese número se deja en la tubería, y la salida es implícita.fuente
Python 2 , 85 bytes
Pruébalo en línea!
fuente
Lote, 108 bytes
Puerto de mi respuesta de JavaScript.
fuente
cc , 47 bytes
Funciona con enteros tan grandes como desee, hasta la capacidad de memoria de la computadora.
Pruébalo en línea!
Indización basada en 0, entrada en stdin, salida en stdout. (También hay salida en stderr, que debe ignorarse).
Ejecuciones de muestra:
Utiliza el mismo algoritmo que la siguiente solución en bash, que es (un poco) más legible:
Bash puro, 60 bytes
Pero el programa bash solo funciona para entradas de hasta 7, ya que alcanza un desbordamiento de enteros más allá de eso.
fuente
Pyth - 15 bytes
Test Suite .
fuente
C # - 74 bytes
Sin golf:
Probablemente haya una manera de convertir esto a una lambda para ahorrar aún más, o algo usando la función .Aggregate. Aunque actualmente no tengo importaciones, ¿tal vez se iguala?
fuente
> <> , 43 + 3 = 46 bytes
Utiliza la fórmula presentada en las respuestas de Adnan y Qwerp-Derp .
Espera que la entrada esté presente en la pila, por lo que +3 bytes para el
-v
indicador.Pruébalo en línea!
fuente