( relacionado )
Um triplo pitagórico é uma lista (a, b, c)
que satisfaz a equação a 2 + b 2 = c 2 .
Um Triplo Pitágico Primitivo (PPT) é aquele em que a
, b
e c
são todos coprimes (isto é, o único divisor comum entre os três elementos é 1
). Por exemplo, o (3, 4, 5)
triângulo retângulo é um famoso Triplo Pitágico Primitivo.
O desafio
- Dada a entrada
n
, produza on
th PPT. Ou, - Dada a entrada
n
,n
produza os primeiros PPTs.
Existem várias maneiras de solicitar esses PPTs para formar uma lista bem ordenada, para determinar qual é o n
th. Você pode escolher qualquer pedido que quiser, desde que possa provar (informalmente é bom) que seu algoritmo pode gerar todos os PPT únicos possíveis. Por exemplo, seu código não deve produzir os dois (3,4,5)
e, (4,3,5)
como esses são duplicados do mesmo triplo - um ou outro, por favor.
Da mesma forma, se o seu código é zero ou um indexado é bom, desde que você indique qual está usando.
Exemplos
Para os exemplos abaixo, estou usando a indexação única, produzindo o n
th PPT e solicitando o menor c
, o menor a
e o menor b
.
n | output
1 | (3, 4, 5)
2 | (5, 12, 13)
5 | (20, 21, 29)
12| (48, 55, 73)
Regras
- A entrada e saída podem ser fornecidas em qualquer formato conveniente .
- Em seu envio, indique como suas entradas são ordenadas e se elas são indexadas em 0 ou 1.
- Seu pedido escolhido não pode criar duplicatas.
- Um programa completo ou uma função são aceitáveis. Se uma função, você pode retornar a saída em vez de imprimi-la.
- Se possível, inclua um link para um ambiente de teste on-line para que outras pessoas possam experimentar seu código!
- As brechas padrão são proibidas.
- Isso é código-golfe, portanto todas as regras usuais de golfe se aplicam e o código mais curto (em bytes) vence.
fonte
Respostas:
Geléia ,
2725 bytes2 bytes graças a Jonathan Allan.
Experimente online!
Produz os primeiros
n
triplos indexados em 1[b, a, c]
, classificados por aumentob
e depoisa
.Usa o algoritmo da Wikipedia :
Isso gera todos os triplos primitivos para todos os pares coprime exclusivos de números inteiros ímpares
m > n > 0
.Explicação
fonte
g/Ị$Ðf
->g/ÐṂ
para salvar dois bytes (já que o mínimo gcd é 1 e sempre haverá pelo menos uma dessas entradas).+2ḶḤ‘Œc
com²Rm2Œc
- sucata que ele vai trabalhar para uma entrada de1
:(²ḶḤ‘Œc
Foi um dos primeiro pensamento I do.)MATL , 36 bytes
A entrada é baseada em 1. A ordem de saída garante que cada triplo apareça exatamente uma vez. A ordem é explicada a seguir. A explicação requer um pouco de como o programa funciona.
O código continua aumentando um contador
k
em um loop, começando em1
. Para cadak
ele gera todos os pares coma = 1,...,k
,b = 1,...,k
,a < b
, e picaretas aquelas que dão um terno pitagórico comc <= k
. Os pares são obtidos em ordem crescenteb
, entãoa
.Cada par é então dividido pelo seu MDC. Os pares resultantes (possivelmente duplicados) são organizados como uma matriz de duas colunas. Essa matriz é concatenada verticalmente com uma matriz semelhante contendo os resultados acumulados obtidos para valores menores de
k
. As linhas da matriz são então desduplicadas de forma estável. Isso remove dois tipos de duplicatas:Pares que foram encontrados mais de uma vez para a corrente
k
(como3,4
, que também resulta da6,8
divisão pelo seu MDC);Pares que já foram encontrados com menores
k
.De fato, cada iteração
k
localiza todos os pares que já foram encontrados para iterações anteriores. Mas pode encontrá-los em uma ordem diferente . Por exemplo,k=25
encontrará o triplo7,24,25
e não20,21,29
(porquec
não pode excederk
). Mais tarde, a iteraçãok=29
encontrará os dois, mas com20,21,29
antes7,24,25
(a ordem está aumentandob
, entãoa
). É por isso que, em vez de manter todos os pares encontrados para o mais recentek
, os anexamos aos anteriores e desduplicamos de forma estável. Isso garante que o pedido seja o mesmo para qualquer entradan
.O acima garante que cada triplo pitagórico primitivo acabará por aparecer e aparecerá apenas uma vez. Para entrada
n
, o loop overk
termina quando pelo menosn
triplos válidos foram obtidos; e então on
décimo terceiro triplo é produzido.Experimente online!
Ou use este código modificado para ver os primeiros
n
triplos:Experimente online!
fonte
Haskell , 98 bytes
Experimente online!
Como funciona
Isso interpreta os dígitos bijetivos da base-3 de n como um caminho abaixo da árvore dos triplos pitagóricos primitivos . É executado sem pesquisa nas operações O (log n ).
fonte
Geléia ,
1918 bytesO programa pega um índice baseado em 1 n e imprime os primeiros n PPTs [c, b, a] em ordem lexicográfica.
Como é uma solução O (64 n ) , o TIO engasga com as entradas 4 e superiores. Vou trabalhar para torná-lo mais rápido.
Experimente online!
Versão alternativa, O (n 3 ), provavelmente válida
Para encontrar o n th tripleto - [c n , b n , um n ] - a solução acima assume que c n ≤ 4 N , o qual é fácil de verificar. No entanto, A020882 prova que c n ~ 2πn , então existe um k tal que c n ≤ kn para todos os n .
Se pudermos tomar k = 7 , a solução abaixo também é válida (e muito, muito mais rápida).
Experimente online!
Como funciona
fonte
JavaScript (ES7),
106105103 bytesEmite o enésimo PPT. Os resultados são indexados em 1 e ordenados pelo valor de b .
Demo
Mostrar snippet de código
fonte
MATL , 63 bytes
Experimente online!
Uma lição de golfe deu terrivelmente errado. Estou postando de qualquer maneira, porque estou me perguntando se existem maneiras de jogar isso melhor.
Baseei isso nesta página da Wikipedia em combinação com a fórmula de Euclides, para gerar construtivamente todas as triplas, em vez de abordagens de tentativa e erro.
Primeiro, pares ímpares de coprime são gerados como uma árvore ternária. Isso é feito como uma grande multiplicação de matrizes, representando a maior parte da contagem de bytes. Então, a fórmula de Euclides é aplicada, possivelmente também de uma maneira que desperdiça muitos bytes. Se alguém tiver dicas para essas duas partes, eu adoraria ouvi-las.
Observe que, para salvar bytes, este programa gera uma árvore da mesma profundidade que a entrada, em vez de
log3(n)
. Além disso, os filhos são gerados para cada linha e não apenas para a última linha da árvore e depois filtrados novamente comXu
. É o suficiente para uma abordagem construtiva eficiente.fonte
Haskell, 65 bytes
Indexação baseada em 0. Para um dado
c
,b
corre atéc
ea
atéb
,c > b > a
sempre é válido.Experimente online!
fonte
Python,
67504846 bytesUsando as fórmulas encontradas na wikipedia,
a=m*n, b=(m^2-n^2)/2, c=(m^2+n^2)/2
onde
m>n>0
em
en
são coprimes e ímpares. Aqui está o código-17 bytes graças a @Martin Ender
Experimente Online
Funciona sempre tendo o valor da
n
variável na equação sendo 1, o que significa quem
simplesmente é qualquer outro valor ímpar, neste caso,3+2*n
onden
é o número do triplo pitagórico primitivo. Isso nos permite assumir o valor de 1 para todos osn
valores.fonte
a
(e, se o fez, pode se livrar dos dois espaços). Também não sei por que você estáprint
lá, você pode retornar os valores do próprio lambda.Casca , 18 bytes
Experimente online!
-4 bytes obrigado a Zgarb, com inspiração em Dennis
Abordagem de força bruta super lenta, não funcionará no TIO para entradas maiores que 1. Você pode tentar uma versão mais gerenciável, limitada a a, b≤200 aqui
Explicação
fonte
c
? nesse caso, essa solução precisaria ser consertada #c
. Esta solução de 18 bytes (que usa outro truque de Dennis) funciona independentemente.Mathematica, 89 bytes
usando Solve ordenado por c
Mathematica, 124 bytes
fonte
R (+ números), 88 bytes
Para usar um builtin para gerar os números, são necessários uma quantidade surpreendente de bytes para obter o que queremos. O builtin usa dois argumentos
c1
ec2
, e retorna os trigêmeos que possuemc >= c1 & c <= c2
. Isso torna um pouco chato chegar aon
trigésimo trigêmeo. Isso continuará aumentandoc2
1 de cada vez até que a saída seja apenas o suficiente em linhas.fonte
PHP , 273 bytes
t($n)
retorna uma matriz de [a, b, c] com ordenaçãoa < b < c
Experimente online! (o código também pode ser lido aqui)
fonte
C, 158 bytes
Acredito que esta é a minha primeira submissão aqui, então você provavelmente pode fazer melhor.
E versão não destruída:
Para a 2 + b 2 = c 2 , a ordem está aumentando c e depois aumentando a .
Não pode haver o dobro do mesmo PPT que b é pelo menos a neste algoritmo.fonte
Geléia ,
2725 bytesEsta é uma implementação da abordagem em árvore da resposta Haskell do @ AndersKaseorg , com uma ordem de ramificação diferente. O programa usa indexação baseada em 0 e recebe informações do STDIN.
Experimente online!
fundo
Como mencionado na página da Wikipedia Árvore dos triplos pitagóricos primitivos , todo PPT pode ser obtido multiplicando-se repetidamente o vetor de linha (3, 4, 5) por matrizes com determinadas propriedades.
Em cada iteração, o resultado anterior pode ser multiplicado à esquerda por A , B ou C , que pode ser escolhido da seguinte maneira.
Quando A , B e C são fixos, cada PPT pode ser obtido de uma maneira única.
Como funciona
fonte
APL (NARS), 90 caracteres, 180 bytes
se o argumento da função acima for ⍵, a função acima retornaria o elemento do índice ⍵ (com base em 1) da matriz tem elementos triplos pitagóricos (a, b, c) em que a <= b <= ce essa matriz é ordem primeiro para a, (o lado mais curto), depois para b (o outro lado não é hipotenusa). Haveria algo errado, porque não é visto onde eu pedir para b também ... test:
está relacionado com http://oeis.org/A020884 e http://oeis.org/A020884/b020884.txt
A020884: Pernas curtas ordenadas de triângulos pitagóricos primitivos.
Eu não sei se está certo, parece que a função dá o resultado correto do primeiro lado do triângulo até 1000, mas eu não sei o que resta, e possível pode ser que alguns triplos não estejam certos, mesmo <1000.
fonte
JavaScript, 101 bytes
Pela fórmula de Euclides, todos os triplos pitagóricos primitivos podem ser gerados a partir de números inteiros
m
en
comm>n>0
,m+n
ímpargcd(m,n)==1
( Wikipedia )Esta função enumera todos os
m,n
pares que aumentam m começandom=2
e decrementandon
2 começandom-1
(de modo quem+n
é ímpar)Menos golfe
Teste
fonte