Descripción
Ha habido muchos otros desafíos relacionados con estos números antes, y espero que este no esté entre ellos.
El n º número triangular es igual a la suma de todos los números naturales hasta n , cosas simples. Hay una página de wikipedia y una entrada en OEIS , para aquellos que desean informarse más.
Ahora, Gauss descubrió que cada número natural puede expresarse como una suma de tres números triangulares (estos incluyen 0
), y está bien tener un número más de una vez, por ejemplo 0 + 1 + 1 = 2
.
Desafío
Su tarea es escribir un programa o función, dado un número natural (incluido 0
), imprime tres números triangulares que suman el argumento. Puede imprimir los números separados por espacios, como una matriz o por otro método que desee. Sin embargo, está prohibido usar cualquier función integrada para obtener directamente una matriz, un rango o cualquier otra forma de colección que contenga una lista de números triangulares (por ejemplo, un solo átomo que produce el rango).
Casos de prueba
9 -> 6 + 3 + 0 or 3 + 3 + 3
12 -> 6 + 6 + 0 or 6 + 3 + 3 or 10 + 1 + 1
13 -> 6 + 6 + 1
1 -> 1 + 0 + 0
0 -> 0 + 0 + 0
Nota: Si hay más de una combinación posible, puede imprimir una o todas, pero debe imprimir cualquier combinación solo una vez, eliminando todas las combinaciones que son el resultado de reorganizar otras combinaciones. Realmente agradecería un enlace de prueba y una explicación, realmente me encanta ver cómo resuelve el problema;)
Esto es código golf , por lo que se aplican las lagunas estándar. ¡Que gane la respuesta más corta en bytes!
fuente
a
no siempre será un número triangularn
y devuelven una lista de los primerosn
números de triángulo ? Eso se siente más bien dirigido contra un lenguaje específico, aunque no sé cuál.Respuestas:
05AB1E , 10 bytes
Código:
Explicación:
Utiliza la codificación 05AB1E . Pruébalo en línea!
fuente
Python 2 , 99 bytes
Pruébalo en línea!
¡Estoy bastante sorprendido de que esto sea más corto
itertools
o una comprensión de triple lista! (Eventualmente) escupe una respuesta aleatoria cada vez que la ejecutas.Dos 102s:
itertools parece ser 106:
fuente
Jalea , 12 bytes
Pruébalo en línea!
Cómo funciona
fuente
Brachylog , 13 bytes
Pruébalo en línea!
Cómo funciona
fuente
MATL , 18 bytes
Esto genera el primer resultado en orden lexicográfico.
¡Pruébalo en MATL Online!
Explicación
fuente
Haskell,
6659 bytesGracias por permitir la salida de todas las soluciones, ¡fue una distracción fascinante! Estaba tan feliz de no necesitar extraer una solución y poder darles todo lo que no noté el costo que resulta de evitar soluciones permutadas. El comentario de @ Lynn me lo explicó y me permitió guardar 7 bytes.
Esto une más que suficientes números triangulares
l
y verifica todas las combinaciones.fuente
a>=b,b>=c
condiciones y simplemente agregar sufijos!!0
a su código? La salida de todas las soluciones realmente no te ayuda aquí.Retina ,
6359 bytesPruébalo en línea! El enlace incluye casos de prueba.
(1(?(1)\1))*
es un comparador de números triangulares generalizado, pero para el primer número triangular podemos guardar algunos bytes al usar^
para la coincidencia inicial.fuente
PHP , 351 bytes
Pruébalo en línea!
fuente
Python 3 , 119 bytes
Pruébalo en línea!
¡Gracias a @WheatWizard por guardar 12 bytes!
fuente
map
(y tal vez su filtro) se puede escribir más corto como una lista de comprensión.map
[*filter(...)]
(x,y,z) for x,y,z in...
cuál es más largo que ell for l in...
que probablemente explica esa diferencia.C / C ++ - 197 bytes
Golpe a golpe:
Necesario para imprimirf. Podría ser elidido para ciertas versiones de C
Ahorro de espacio para bucle.
Triángulo recursivo evaluador.
Este tipo hace el trabajo pesado. Tres bucles anidados para iterar a, b, c de 0 a n, tenga en cuenta que byc iteran desde el valor anterior hasta n. No es estrictamente necesario recortar la iteración de esa manera, ya que la
return
llegada en un minuto resuelve el problema "duplicado".En el nivel interno, si la suma de los tres triángulos numera
==
el valor deseado, imprima los triángulos y regrese.Puede eliminar legalmente la
return
palabra clave y convertir el tipo de retorno de c a vacío para guardar unos pocos bytes más e imprimir todas las soluciones posibles. Es por esta razón que las iteraciones son limitados, si todos los bucles corrían de0
quen
se causaría duplicados.fuente
Mathematica, 63 bytes
fuente
First
que ahorra la friolera de 2 bytes ,(t=#;#&@@Select[Table[i(i+1)/2,{i,0,t}]~Tuples~{3},Tr@#==t&])&
para 62 bytes.CJam , 26 bytes
Puerto de mi respuesta MATL. Este es un bloque anónimo que espera la entrada en la pila y lo reemplaza por la matriz de salida.
Pruébalo en línea!
fuente
R , 66 bytes
Algoritmo de fuerza bruta; lee
n
de stdin y devuelve un marco de datos donde cada fila es una combinación de 3 números triangulares que sumann
. Si es necesario, puedo devolver solo la primera fila para +4 bytes.Pruébalo en línea!
fuente
Java 8, 164 bytes
Explicación:
Pruébalo aquí
fuente
JavaScript, 108 bytes
Explicación
x
representa la entradawhile(a<=x)r.push(a=i++*i/2)
Crea una matriz de todos los números triangulares hasta xEl
for
bucle imprime el número triangular más alto menor quex
, luego resta ese númerox
, por tres iteraciones. (básicamente un algoritmo codicioso)fuente
x = 103
:91 + 10 + 1 = 102
Pyth, 19 bytes
Estoy tan fuera de práctica con Pyth, no es cierto: /
Pruébalo aquí .
fuente
J , 36 bytes
Pruébalo en línea!
fuente
Ruby
615755 bytesInspirado por la respuesta Python de Lynn . Genera tripletes al azar hasta que se alcanza la suma deseada:
Requiere Ruby 2.4. En Ruby 2.3 y versiones anteriores, es un error de sintaxis y
Range#sum
no está definido. Esta versión más larga (64 bytes) es necesaria para Ruby 2.3:Aquí hay una pequeña prueba:
¡Pruébelo en línea con Ruby 2.3!
fuente
Javascript (ES6), 108 bytes - fijo
Toma un entero como entrada, genera una matriz que
[a, b, c]
contiene una lista ordenada de números de triánguloa + b + c = x
, dondea
el número de triángulo más grande es menor o igual que la entrada, yb
es el número de triángulo más grande menor o igual que la entrada menosa
.Explicación
Mostrar fragmento de código
fuente
x-m-n
un número triangular, es decir, por qué funciona esto?