Los números cuadrados son aquellos que toman la forma de n^2
donde n es un número entero. Estos también se llaman cuadrados perfectos, porque cuando tomas su raíz cuadrada obtienes un número entero.
Los primeros 10 números cuadrados son: ( OEIS )
0, 1, 4, 9, 16, 25, 36, 49, 64, 81
Los números triangulares son números que pueden formar un triángulo equilátero. El enésimo número de triángulo es igual a la suma de todos los números naturales del 1 al n.
Los primeros 10 números triangulares son: ( OEIS )
0, 1, 3, 6, 10, 15, 21, 28, 36, 45
Los números triangulares cuadrados son números que son cuadrados y triangulares.
Los primeros 10 números triangulares cuadrados son: ( OEIS )
0, 1, 36, 1225, 41616, 1413721, 48024900, 1631432881, 55420693056, 1882672131025, 63955431761796
Hay un número infinito de números cuadrados, números triangulares y números triangulares cuadrados.
Escriba un programa o función con nombre que, dado un número de entrada (parámetro o stdin) n
, calcule el n
número triangular cuadrado y lo emite / devuelve, donde n es un número positivo distinto de cero. (Para n = 1 devuelve 0)
Para que el programa / función sea una presentación válida, debe poder devolver al menos todos los números de triángulos cuadrados menores de 2 ^ 31-1.
Prima
-4 bytes para poder generar todos los números triangulares cuadrados menores que 2 ^ 63-1
-4 bytes para poder generar teóricamente números triangulares cuadrados de cualquier tamaño.
Penalización de +8 bytes para soluciones que toman tiempo no polinómico.
Bonus stack.
Este es un desafío de código de golf, por lo que gana la respuesta con la menor cantidad de bytes.
n
pasos, y en cada paso la aritmética toma tiempo lineal porque el número de dígitos crece linealmenten
. No creo que el tiempo lineal sea posible. A menos que esté diciendo que las operaciones aritméticas son de tiempo constante?Respuestas:
CJam,
128 bytesHace uso de la relación de recurrencia del artículo de Wikipedia.
El código tiene 16 bytes de longitud y califica para ambos bonos.
Pruébelo en línea en el intérprete de CJam .
Cómo funciona
Mi código resultó ser idéntico al de xnor en todos los aspectos, excepto que uso la pila de CJam en lugar de variables.
fuente
Pitón 2, 45 - 4 - 4 = 37
Itera el uso de la recurencia
En teoría, esto admite números de cualquier tamaño, pero se ejecuta en tiempo exponencial, por lo que no debería calificar para los bonos. Debería funcionar para números de cualquier tamaño. Por ejemplo, para 100, da
Una solución recursiva usa 41 caracteres, pero no debería calificar porque lleva tiempo exponencial.
fuente
exec
solución. Si se le permite cambiar el límite de recursividad, también podría calcular un número de triángulo cuadrado de cualquier tamaño, calificándolo para el n. ° 2. Sin embargo, no estoy seguro de si eso califica (@Rodolvertice).Pyth, 16-4-4 = 8 bytes
Utiliza la fórmula recursiva del artículo de OEIS.
Utiliza el comando de asignación posterior que es bastante nuevo y parece realmente genial. Los usos se reducen a
n-1
tiempos de iteración debido a la indexación basada en 1.Parece ser polinomial porque se repite n veces y hace cálculos matemáticos y asignaciones en cada iteración, pero no soy un informático. Termina n = 10000 casi al instante.
Pruébalo aquí en línea .
fuente
b
.Oasis , 7 - 4 - 4 = -1 (No competidor)
Pruébalo en línea!
Usos
a(0) = 0, a(1) = 1; for n >= 2, a(n) = 34 * a(n-1) - a(n-2) + 2
Oasis admite enteros de precisión arbitrarios, por lo que debería poder subir a cualquier número siempre que no se produzca un desbordamiento de la pila. Avíseme si esto no cuenta para la bonificación debido al desbordamiento de la pila. También es posible que este algoritmo en particular no sea polinómico, y avíseme si ese es el caso.
No competir porque el lenguaje es posterior a las fechas de desafío.
Explicación:
Solución alternativa:
En cambio usa
a(n) = 35*(a(n-1)-a(n-2)) + a(n-3)
fuente
For n=1 return 0
, pero esto devuelve 1. Esto se puede solucionar agregando la opción -O .JavaScript (ES6), 29-4 = 25 bytes
¡Guardado 5 bytes gracias a @IsmaelMiguel !
He tenido que codificar el 0, 1 y los negativos para evitar una recursión infinita.
Consola, he nombrado la función
f
,:EDITAR : Resulta que JavaScript redondeará los números a 16 (15) dígitos (Especificaciones) porque estos números son demasiado grandes y causan un desbordamiento. Ponga 714341252076979033 en su consola JavaScript y compruébelo usted mismo. Es más una limitación de JavaScript
fuente
f(15)
debería volver85170343853180456676
, no85170343853180450000
.n=>n?n<2?0:34*f(n-1)-f(n-2)+2:1
(31 bytes). Lo he probado hasta el quinto número.n=>n>1?34*f(n-1)-f(n-2)+2:!!n
. Devuelvefalse
en0
,true
sobre1
y36
sobre2
. Si desea que devuelva un número, puede reemplazarlo!!n
por+!!n
.n=>n>1?34*f(n-1)-f(n-2)+2:n|0
(mismo conteo de bytes, ahora devuelve siempre números)Excel VBA - 90 bytes
Usando la relación de recurrencia de la página de Wikipedia:
Cuando se ejecuta, se le solicita n, luego la secuencia hasta e incluyendo n se envía a la columna A:
Se puede ejecutar hasta e incluyendo n = 202 antes de dar un error de desbordamiento.
fuente
[No compitiendo] Pyth (14 - 4 - 4 = 6 bytes)
Usó la primera recurrencia de OEIS , que después de 0,1,36 puede encontrar A n = (A n-1 -1) 2 / A n-2 . A No compite porque esta solución comienza en 36, si baja, divide entre cero (por lo tanto, la entrada de 0 da 36). También tuve que codificar 36.
Pruébalo aquí
fuente
Java, 53 - 4 = 49 bytes
Es otra recursión simple, pero no suelo publicar Java con una puntuación <50, así que ...
Ahora, para algo no recursivo, se vuelve un poco más largo. Este es más largo (112-4 = 108) y más lento, por lo que no estoy seguro de por qué lo estoy publicando, excepto para tener algo iterativo:
fuente
Julia, 51 bytes - 4 - 4 = 43
Utiliza la primera relación de recurrencia que figura en la página de Wikipedia para números triangulares cuadrados. Calcula n = 1000 en 0.006 segundos yn = 100000 en 6.93 segundos. Es unos pocos bytes más largos que una solución recursiva, pero es mucho más rápido.
Ungolfed + explicación:
Ejemplos:
fuente
PHP,
655956-4 = 52 bytesrepita hasta que la raíz cuadrada de
$s
sea ∈ℤ: sume$f
a la suma$s
, incremente$f
;repetir
$argv[1]
tiempos.suma de salida.
fuente
Prólogo,
7074 - 4 - 4 = 66n(100,R)
Salidas corrientes :Tarda aproximadamente 1 segundo en ejecutarse
n(10000,X)
en mi computadora.Editar : La versión 66 es recursiva de cola. La versión anterior no recursiva de cola es la siguiente:
Tienen la misma longitud en bytes, pero el no recursivo de cola genera desbordamientos de pila más allá de cierto punto (en mi computadora, alrededor de 20500).
fuente
Javascript ES6,
777571 caracteresPrueba:
fuente
C, 68 bytes
Este fue un desafío divertido con C
main(o,k){o==1?k=0:0;k<9e9&&k>=0&&main(34*o-k+2,o,printf("%d,",k));}
Míralo correr aquí: https://ideone.com/0ulGmM
fuente
Gelatina , 13 - 8 = 5 bytes
Esto califica para ambos bonos.
Pruébalo en línea!
Hecho junto a caird coinheringaahing en el chat .
Explicación
fuente
Perl 6 , 25 - 8 = 17 bytes
Pruébalo en línea!
fuente
05AB1E , 10 - 8 = 2 bytes
Pruébalo en línea!
fuente
APL (NARS), 67 caracteres, 134 bytes
prueba:
f buscaría en secuencia cuadrática los elementos que también son números triangulares, por lo que deben seguir la fórmula de verificación triangular en las APL: 0 = 1∣√1 + 8 × m con el número m para verificar.
fuente