Descrição
Já houve alguns outros desafios com relação a esses números, e espero que este não esteja entre eles.
O n º número triangular é igual à soma de todos os números naturais até n , coisas simples. Há uma página da Wikipedia e uma entrada na OEIS , para aqueles que desejam se informar mais.
Agora, Gauss descobriu que todo número natural pode ser expresso como uma soma de três números triangulares (estes incluem 0
), e é bom ter um número mais de uma vez, por exemplo 0 + 1 + 1 = 2
.
Desafio
Sua tarefa é escrever um programa ou função, dado um número natural (inclusive 0
), imprime três números triangulares que somam o argumento. Você pode imprimir os números separados por espaços, como uma matriz ou por outro método que desejar. No entanto, é proibido usar qualquer função interna para obter diretamente uma matriz, um intervalo ou qualquer outra forma de coleção que contenha uma lista de números triangulares (por exemplo, um único átomo que produz o intervalo).
Casos de teste
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: Se houver mais de uma combinação possível, você poderá imprimir uma ou todas, mas deverá imprimir qualquer combinação apenas uma vez, eliminando todas as combinações resultantes da reorganização de outras combinações. Eu realmente aprecio um link try-it e uma explicação, eu realmente gosto de ver como você resolve o problema;)
Isso é código-golfe , então as brechas padrão se aplicam. Que vença a resposta mais curta em bytes!
fonte
a
não será sempre um número triangularn
e retornam uma lista dos primeirosn
números de triângulo são permitidas? Isso parece bastante direcionado a alguma linguagem específica, embora eu não saiba qual.Respostas:
05AB1E , 10 bytes
Código:
Explicação:
Usa a codificação 05AB1E . Experimente online!
fonte
Python 2 , 99 bytes
Experimente online!
Estou surpreso que isso seja mais curto do que
itertools
ou uma lista tripla de compreensão! (Eventualmente) cospe uma resposta aleatória toda vez que você a executa.Dois 102s:
itertools parece ser 106:
fonte
Gelatina , 12 bytes
Experimente online!
Como funciona
fonte
Braquilog , 13 bytes
Experimente online!
Como funciona
fonte
MATL , 18 bytes
Isso gera o primeiro resultado em ordem lexicográfica.
Experimente no MATL Online!
Explicação
fonte
Haskell,
6659 bytesObrigado por permitir a saída de todas as soluções, que foi uma distração fascinante! Fiquei tão feliz por não precisar extrair uma solução e poder dar a todos eles que não percebi o custo resultante de evitar soluções permutadas. A observação de @ Lynn explicou isso para mim e deixe-me economizar 7 bytes.
Isso vincula números triangulares mais do que suficientes
l
e verifica todas as combinações.fonte
a>=b,b>=c
condições e o sufixo!!0
do código também são uma resposta válida? A saída de todas as soluções não ajuda muito aqui.Retina ,
6359 bytesExperimente online! O link inclui casos de teste.
(1(?(1)\1))*
é um correspondente de número triangular generalizado, mas, para o primeiro número triangular, podemos salvar alguns bytes usando^
a correspondência inicial.fonte
PHP , 351 bytes
Experimente online!
fonte
Python 3 , 119 bytes
Experimente online!
Obrigado a @WheatWizard por salvar 12 bytes!
fonte
map
(e talvez seu filtro) pode ser escrito mais curto como uma compreensão da lista.map
[*filter(...)]
(x,y,z) for x,y,z in...
que é mais longo que o seul for l in...
que provavelmente explica essa diferença.C / C ++ - 197 bytes
Golpe por golpe:
Necessário para printf. Pode ser escolhido para determinadas versões de C
Economia de espaço para loop.
Avaliador de triângulo recursivo.
Esse cara faz o trabalho pesado. Três loops aninhados para iteram a, b, c de 0 a n, observe que b e c iteram do valor anterior até n. Não é estritamente necessário reduzir a iteração dessa maneira, uma vez que a
return
chegada em um minuto resolve o problema "duplicado".No nível interno, se a soma dos três triângulos numerar
==
o valor desejado, imprima os triângulos e retorne.Você pode remover legalmente a
return
palavra - chave e converter o tipo de retorno de c em anulado para economizar mais alguns bytes e imprimir todas as soluções possíveis. É por esta razão que as iterações são limitados, se todos os loops decorreu entre0
an
causaria duplicatas.fonte
Mathematica, 63 bytes
fonte
First
que economiza 2 bytes ,(t=#;#&@@Select[Table[i(i+1)/2,{i,0,t}]~Tuples~{3},Tr@#==t&])&
para 62 bytes.CJam , 26 bytes
Porta da minha resposta MATL. Este é um bloco anônimo que espera a entrada na pilha e a substitui pela matriz de saída.
Experimente online!
fonte
R , 66 bytes
Algoritmo de força bruta; lê
n
stdin e retorna um quadro de dados em que cada linha é uma combinação de 3 números triangulares que somamn
. Se necessário, posso retornar apenas a primeira linha para +4 bytes.Experimente online!
fonte
Java 8, 164 bytes
Explicação:
Experimente aqui.
fonte
JavaScript, 108 bytes
Explicação
x
representa a entradawhile(a<=x)r.push(a=i++*i/2)
Cria uma matriz de todos os números triangulares até xO
for
loop imprime o número triangular mais alto menor quex
, e subtrai esse número dex
, por três iterações. (basicamente um algoritmo ganancioso)fonte
x = 103
:91 + 10 + 1 = 102
Pitão, 19 bytes
Estou tão sem prática com Pyth, é falso: /
Experimente aqui .
fonte
J , 36 bytes
Experimente online!
fonte
Ruby
615755 bytesInspirado pela resposta Python de Lynn . Ele gera trigêmeos aleatórios até que a soma desejada seja alcançada:
Requer Ruby 2.4. No Ruby 2.3 e mais antigo, é um erro de sintaxe e
Range#sum
não está definido. Esta versão mais longa (64 bytes) é necessária para o Ruby 2.3:Aqui está um pequeno teste:
Experimente online com Ruby 2.3!
fonte
Javascript (ES6), 108 bytes - corrigido
Pega um número inteiro como uma entrada, gera uma matriz que
[a, b, c]
contém uma lista classificada de números de triângulosa + b + c = x
, ondea
é o maior número de triângulos menor ou igual à entrada eb
é o maior número de triângulos menor ou igual à entrada menosa
.Explicação
Mostrar snippet de código
fonte
x-m-n
um número triangular, ou seja, por que isso funciona?