Prefacio
En el conocido villancico, Los doce días de Navidad , el narrador recibe varios regalos cada día. La canción es acumulativa : en cada verso, se agrega un nuevo regalo, con una cantidad mayor que el regalo anterior. Una perdiz, dos tórtolas, tres gallinas francesas, etc.
En cualquier verso dado, N , podemos calcular la suma acumulada de regalos hasta ahora en la canción al encontrar el número N - tetraédrico , que da los resultados:
Verse 1: 1
Verse 2: 4
Verse 3: 10
Verse 4: 20
Verse 5: 35
Verse 6: 56
Verse 7: 84
Verse 8: 120
Verse 9: 165
Verse 10: 220
Verse 11: 286
Verse 12: 364
Por ejemplo, después del versículo 4, hemos tenido 4 * (1 perdiz) , 3 * (2 tórtolas) , 2 * (3 gallinas francesas) y 1 * (4 pájaros voladores) . Al sumar estos, obtenemos 4(1) + 3(2) + 2(3) + 1(4) = 20
.
El reto
Su tarea es escribir un programa o función que, dado un número entero positivo que representa el número de regalos 364 ≥ p ≥ 1 , determine qué día (verso) de Navidad es.
Por ejemplo, si p = 286 , estamos en el día 11 de Navidad. Sin embargo, si p = 287 , entonces la próxima carga de regalos ha comenzado, lo que significa que es el día 12.
Matemáticamente, esto es encontrar el siguiente número tetraédrico y devolver su posición en toda la secuencia de números tetraédricos.
Reglas:
- Este es el código de golf , por lo que gana la solución más corta (en bytes).
- Se aplican lagunas de golf estándar.
- Cuando se trata de días, su programa debe estar indexado en 1.
- Su envío debe ser un programa completo o una función, pero no un fragmento.
Casos de prueba
1 -> 1
5 -> 3
75 -> 7
100 -> 8
220 -> 10
221 -> 11
364 -> 12
fuente
x=>{while(x>p)p+=r+=++i;return i}
estoy seguro de que se puede acortar en un lenguaje como JavaScript.Respuestas:
Gelatina ,
76 bytes-1 byte gracias a Dennis (use mínimo vectorizado
«
, y primer índice,i
)TryItOnline
¿Cómo?
No es tan eficiente: calcula los números tetraédricos del primero al noveno en orden en una lista y devuelve el índice basado en 1 del primero que es igual o mayor.
Anterior 7 byters utilizando gama rebajado
[0,1,2,3,...,n-1]
y contando tetrahedrals menos de n:Ḷ+\⁺<µS
,Ḷ+\⁺<ḅ1
,Ḷ+\⁺<ċ1
, yḶ+\⁺<¹S
fuente
Python , 27 bytes
Pruébalo en línea!
Una fórmula directa con algunos ajustes de curva, igual que la original encontrada por Level River St.
La ecuación desplazada
i**3-i==n*6
es cercana ai**3==n*6
grandei
. Se resuelve ai=(n*6)**(1/3)
. Tomando el piso las rondas hacia abajo según sea necesario, compensando el off-by-one.Pero, hay 6 entradas en los límites donde el error lo lleva debajo de un entero que debería estar arriba. Todo esto se puede solucionar aumentando ligeramente el exponente sin introducir más errores.
Python , 38 bytes
La fórmula
n=i*(i+1)*(i+2)/6
para los números tetraédricos se puede escribir mejori+1
comon*6=(i+1)**3-(i+1)
. Entonces, encontramos el más bajoi
para el cuali**3-i<n*6
. Cada vez que incrementamos ai
partir de 1, las llamadas recursivas se suman1
a la salida. Comenzando desdei=1
más quei=0
compensa el cambio.fuente
**.33359
funciona para un byte extra.lambda n:n**.3336//.5501
Guarda algunos bytes.J , 12 bytes
Puede haber una forma más golfosa de hacer esto, pero esta es una hermosa oportunidad para usar la inversión de función incorporada de J.
Pruébalo en línea!
Cómo funciona
fuente
Python , 22 bytes
Muy inspirado por la respuesta Python de @ xnor .
Pruébalo en línea!
fuente
Jalea , 7 bytes
Pruébalo en línea!
Cómo funciona
fuente
JavaScript (ES6), 33 bytes
Basado en la fórmula recursiva:
La segunda expresión también se puede escribir como ...
... que es el que estamos usando aquí.
a(i - 1)
en realidad se almacena en lak
variable y se pasa a la siguiente iteración hastak >= n
.Casos de prueba
Mostrar fragmento de código
fuente
Rubí, 26 bytes
Editar: versión alternativa, todavía 26 bytes
Versión original
Utiliza el hecho de que
T(x) = x(x+1)(x+2)/6 = ((x+1)**3-(x+1))/6
está muy cerca(x+1)**3/6
.La función simplemente se multiplica por 6, encuentra una versión ligeramente modificada de la raíz cúbica (sí, se requieren 5 decimales) y devuelve el resultado truncado a un entero.
Programa de prueba y salida
fuente
0.3336
Parece funcionar para la versión original. (Editar: No importa, Dennis señala que me estaba olvidando de 364.)JavaScript,
3633 bytes-3 bytes gracias a Luke (haciendo la función curry)
Esta es una función lambda sin nombre que se puede asignar
func
y llamar confunc(220)()
, como se describe en esta meta publicación . Mi función original, no curry se ve así:Esta respuesta utiliza el hecho de que el número x tetraédrico se puede encontrar con la siguiente función:
La presentación funciona aumentando
i
y encontrando recursivamentetetrahedral(i)
, hasta que sea mayor o igual quen
(el número de regalos dados).Cuando se llama con un argumento como se esperaba
i = undefined
, y, por lo tanto, no es mayor quen
. Esto significa quef(n,-~i)
se ejecuta y se-~undefined
evalúa como1
, lo que desencadena la recursividad.Fragmento de prueba:
fuente
n=>g=i=>n<=i/6*++i*++i?i-2:g(~-i)
. Lo llamarías asíf(2)()
.i=>n<=i
Beautiful ;-)MATL ,
1211 bytesPruébalo en línea!
Explicación
fuente
05AB1E , 10 bytes
Pruébalo en línea!
Explicación
fuente
[N2Ý+P6÷¹Q#N>
, agradable.Pyke, 11 bytes
Pruébalo aquí!
fuente
Mathematica, 26 bytes
Función sin nombre que toma un argumento entero no negativo y devuelve un entero no negativo (sí, también funciona durante el día
0
). Queremos encontrar el número entero más pequeñoi
para el cual la entrada#
es como máximoi(i+1)(i+2)/6
, que es la fórmula para la cantidad de obsequios entregados en los primerosi
días. A través del engaño algebraico leve, la desigualdad# ≤ i(i+1)(i+2)/6
es equivalente a(i+1) + 6# ≤ (i+1)^3
. Por lo tanto, la estructura0//.i_/;i+6#>i^3:>i+1
comienza con a0
y sigue agregando1
mientrasi+6#>i^3
se satisfaga la prueba ; luego(...)-1&
resta1
al final (en lugar de gastar bytes con paréntesis dentro de la desigualdad).Si dejamos que continúen los 12 días de Navidad, podemos manejar unos 65536 días antes de que el límite de recursión incorporado
//.
detenga el proceso ... eso es aproximadamente 4.7 * 10 ^ 13 días, o aproximadamente diez veces la edad del universo hasta ahora ....fuente
J , 9 bytes
Pruébalo en línea!
Esto es más ineficiente que usar el inverso de factorial pero resulta ser más corto.
Por ejemplo, si el entero de entrada es n = 5, haga el rango
[2, n+1]
.Estos son los primeros 5 números tetraédricos. El siguiente paso es determinar a qué intervalo (día) n pertenece. Hay n +1 = 6 intervalos.
Entonces n = 5 pertenece al intervalo 3 que es
(4, 10]
y el resultado es 3.Explicación
fuente
Python, 43 bytes
¡ Ahorré 5 bytes gracias a @FlipTack y otros 3 gracias a @xnor !
fuente
f(220)=11
, que debería serf(220)=10
.and-~f(n,i+1)
paraand f(n,i+1)or i
. Curiosamente, generalmente es más corto cuando estás contando una variable recursivamente para no devolverla, sino para aumentar la salida recursivamente.Japt , 12 bytes
¡Pruébalo en línea! o Verificar todos los casos de prueba a la vez
Cómo funciona
Esta es una simplificación de la fórmula tetraédrica que utilizan otras respuestas:
Mediante la sustitución
x - 1
dex
, podemos simplificar esta forma considerable:Por lo tanto, el resultado correcto es uno menos que el entero más pequeño, de
x
modo que(x^3 - x) / 6
sea mayor o igual que la entrada.Solución de 13 bytes, inspirada en la respuesta de @ xnor :
Algunas soluciones más @ETHproductions y jugué con
Pruébalo aquí .
fuente
SmileBASIC, 43 bytes
I
es el día,R
es eli
número triangular th yP
es eli
número tetraédrico th (número de regalos).Creo que una respuesta similar en otro idioma, quizás:
x=>{while(x>p)p+=r+=++i;return i}
podría ser bastante buena.fuente
?I
al final, ¿no?Python 3,
4846 bytesfuente
221
lo bloqueará.Mathematica,
3125 bytesfuente
Haskell,
2123 bytesEditar: como señaló xnor, la solución original (
floor.(/0.82).(**0.4)
) no funcionó entre los días de navidadfuente
Lote, 69 bytes
Calcula manualmente los números de tetraedro.
fuente
Pyth 11 bytes
Pruébalo en línea!
prácticamente traduje la respuesta de Dennis a Pyth
fuente
R, 19 caracteres
basado en la respuesta de xnor en
Python
.fuente
QBIC , 19 bytes
Esto roba la fórmula de @xnor:
Traté de reducir la resolución a .3336 para guardar un byte, pero eso falla en el caso de prueba final.
fuente
Bash + bc, 44 bytes
fuente