O teorema dos números poligonais de Fermat afirma que todo número inteiro positivo pode ser expresso como a soma de no máximo números na diagonal. Isso significa que todo número inteiro positivo pode ser expresso como a soma de até três números de triângulos, quatro números quadrados, cinco números pentagonais etc. Sua tarefa é pegar um número inteiro positivo , e um número inteiro , e gerar os números inteiros -gonal que somam .
O -simo -gonal inteiro, onde e , pode ser definida em uma de duas maneiras. A forma não-matemática y é que o ° série -gonal pode ser construído como um polígono regular com lados, cada uma de comprimento . Por exemplo, para (números triangulares):
Veja aqui exemplos com um maior .
A definição matemática-y é, utilizando a fórmula para , que produz o -simo número -gonal:
que é fornecido na página da Wikipedia aqui .
Entrada
Dois inteiros positivos, e , com a condição . Você pode inserir esses números inteiros na representação mais natural do seu idioma (decimal, unário, numerais da Igreja, números de ponto flutuante com valor inteiro etc.).
Saída
Uma lista de números inteiros, , com um comprimento máximo de , em que a soma de é igual a e todos os números inteiros em são números inteiros -gonais. Novamente, os números inteiros podem ser emitidos na representação natural em seu idioma, com qualquer separador consistente e distinto (portanto caracteres não decimais para saída decimal, um caractere diferente daquele usado para saída unária etc.)
Regras
- As entradas ou saídas nunca excederão o limite inteiro para o seu idioma
- não precisa ser encomendado
- No caso de múltiplas saídas possíveis, qualquer uma ou todas são aceitáveis
- Isso é código-golfe, então o código mais curto em bytes vence
Casos de teste
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
fonte
x=17, s=5
poderíamos produzir em5,12,0,0,0
vez de apenas5,12
?Q
a meu envio?Respostas:
Haskell ,
78 8077 bytesComputamos o produto cartesiano do primeiron números -sonais e, em seguida, encontramos a primeira entrada que soma n .
Experimente online!
fonte
JavaScript (ES6),
8380 bytesUma pesquisa recursiva rápida que maximiza o menor termo da saída.
Toma entrada como
(s)(x)
.Experimente online!
Fórmula
É mais curto usar uma fórmula baseada em 0 para calcular os númeross diagonal em JS, ou seja, começar com n=0 e calcular P(n+1,s) :
que pode ser escrito em 14 bytes:
Comentado
fonte
05AB1E ,
1413 bytesResposta da geléia do porto de Jonathan Allan .
Experimente online!
fonte
Haskell , 55 bytes
Experimente online!
Produz todas as soluções possíveis. Define os números s-gonais como a soma cumulativa da progressão aritmética
fonte
Gelatina , 17 bytes
Um link diádico (muito, muito ineficiente), que aceita
s
à esquerda ex
à direita, que produz a resposta mais curta possível como uma lista de números inteiros (classificados em ordem crescente).Experimente online! - não faz muito sentido tentar por valores muito mais altos!
Quão?
fonte
⁸
mesmo que repetir os elementos do resultado da soma acumuladaRuby , 79 bytes
Calcula o primeiron s -gonal e zero, obtém o produto cartesiano de si mesmo s vezes e encontra a primeira entrada que corresponde. Casos de teste posteriores ficam sem memória no TIO, mas teoricamente funcionam.
Experimente online!
fonte
Python 3 , 105 bytes
Experimente online!
Resposta JavaScript do Port of Arnauld , certifique-se de vomitá-lo!
fonte
Retina , 111 bytes
Experimente online! O link inclui casos de teste. Recebe entrada na ordem
s n
. Explicação:Converta para unário.
Depois de processar os estágios restantes, trate-os como um programa Retina e execute-os na mesma entrada.
Duplique a linha.
Substitua a primeira cópia por uma expressão regular que pule o primeiro número e depois corresponda
s
s
aos números -gonal. Os números em si são capturados em grupos de captura ímpares e os grupos de captura par são usados para garantir que todos os números sejams
-gonal.Substitua a segunda cópia por uma lista separada por espaços dos grupos de captura ímpares.
Como exemplo, o código gerado para uma entrada de
5 17
é o seguinte:fonte
APL (NARS), 149 caracteres, 298 bytes
se não encontrar soluções "0 = ≢b" do que retornar para a entrada (ns), n vezes 1; caso contrário, retornaria a soma dos números s com menos adenda ...
teste:
O problema disso: Não encontra solução que tenha algum número repetido na soma ...
fonte
C ++ (clang) , 198 bytes
Experimente online!
fonte