El teorema del número poligonal de Fermat establece que cada entero positivo se puede expresar como la suma de, como máximo, números gonales. Esto significa que cada entero positivo puede expresarse como la suma de hasta tres números de triángulo, cuatro números cuadrados, cinco números pentagonales, etc. Su tarea es tomar un entero positivo , y un entero , y generar el enteros gonales que suman .
El entero -ésimo - gonal, donde y , se puede definir de dos maneras. La forma no matemáticas-y es que el º número -gonal puede ser construido como un polígono regular con lados, cada uno de longitud . Por ejemplo, para (números triangulares):
Ver aquí para ejemplos con una más grande .
La definición matemática-y es mediante el uso de la fórmula para , que produce la -ésima número -gonal:
que se da en la página de Wikipedia aquí .
Entrada
Dos números enteros positivos, y , con la condición de . Puede ingresar estos enteros en la representación más natural en su idioma (decimal, unario, números de iglesia, números de coma flotante con valor entero, etc.).
Salida
Una lista de los números enteros, , con una longitud máxima de , donde la suma de es igual a y todos los números enteros en son números enteros -gonal. Una vez más, los números enteros se pueden generar en la representación natural en su idioma, con cualquier separador distinto y consistente (de modo que los caracteres no decimales para la salida decimal, un carácter diferente del utilizado para la salida unaria, etc.)
Reglas
- Las entradas o salidas nunca excederán el límite entero para su idioma
- no tiene que ser ordenado
- En caso de múltiples salidas posibles, cualquiera o todas son aceptables
- Este es el código de golf, por lo que gana el código más corto en bytes
Casos de prueba
x, s => L
1, s => 1
2, s => 1, 1
5, 6 => 1, 1, 1, 1, 1
17, 3 => 1, 6, 10
17, 4 => 1, 16
17, 5 => 5, 12
36, 3 => 36
43, 6 => 15, 28
879, 17 => 17, 48, 155, 231, 428
4856, 23 => 130, 448, 955, 1398, 1925
fuente
x=17, s=5
, ¿podríamos producir en5,12,0,0,0
lugar de solo5,12
?Q
a mi envío?Respuestas:
Haskell ,
78 8077 bytesCalculamos el producto cartesiano de los primerosnorte números s-gonales, y luego encontramos la primera entrada que suma norte .
Pruébalo en línea!
fuente
JavaScript (ES6),
8380 bytesUna búsqueda recursiva rápida que maximiza el término más pequeño de la salida.
Toma entrada como
(s)(x)
.Pruébalo en línea!
Fórmula
Resulta más corto usar una fórmula basada en 0 para calcular los númeross gonales en JS, es decir, comenzar con n = 0 y calcular PAGS( n + 1 , s ) :
que se puede escribir en 14 bytes:
Comentado
fuente
05AB1E ,
1413 bytesPort of Jonathan Allan's Jelly respuesta .
Pruébalo en línea!
fuente
Haskell , 55 bytes
Pruébalo en línea!
Produce todas las soluciones posibles. Define los números s-gonales como la suma acumulativa de la progresión aritmética.
fuente
Jalea , 17 bytes
Un enlace diádico (muy, muy ineficiente) que acepta
s
a la izquierda yx
a la derecha, lo que produce la respuesta más corta posible como una lista de enteros (ordenados de forma ascendente).Pruébalo en línea! ¡No tiene mucho sentido intentarlo con valores mucho más altos!
¿Cómo?
fuente
⁸
Ruby , 79 bytes
Pruébalo en línea!
fuente
Python 3 , 105 bytes
Pruébalo en línea!
La respuesta de JavaScript del Puerto de Arnauld , ¡así que asegúrate de votarlo!
fuente
Retina , 111 bytes
Pruébalo en línea! El enlace incluye casos de prueba. Toma entrada en el orden
s n
. Explicación:Convierte a unario.
Después de procesar las etapas restantes, trátelas como un programa Retina y ejecútelas en la misma entrada.
Duplicar la línea.
Reemplace la primera copia con una expresión regular que omita el primer número y luego coincida
s
s
con los números gonales. Los números mismos se capturan en grupos de captura impares y los grupos de captura pares se utilizan para garantizar que todos los números seans
gonales.Reemplace la segunda copia con una lista separada por espacios de los grupos de captura impares.
Como ejemplo, el código generado para una entrada de
5 17
es el siguiente:fuente
APL (NARS), 149 caracteres, 298 bytes
si no encuentra soluciones "0 = ≢b" que el retorno para la entrada (ns), n veces 1; de lo contrario, devolvería la suma de números s que tiene menos suma ...
prueba:
El problema de esto: no encuentra alguna solución, tiene algún número repetido en la suma ...
fuente
C ++ (clang) , 198 bytes
Pruébalo en línea!
fuente