( lié )
Un triple de Pythagore est une liste (a, b, c)
qui satisfait l'équation a 2 + b 2 = c 2 .
Un triple pythagoricien primitif (PPT) est celui où a
, b
et c
sont tous des coprimes (c'est-à-dire que le seul diviseur commun entre les trois éléments est 1
). Par exemple, le (3, 4, 5)
triangle rectangle est un fameux triple primitif de Pythagore.
Le défi
- Étant donné l'entrée
n
, la sortie dun
th PPT. Ou, - Étant donné l'entrée
n
,n
sortez les premiers PPT.
Il existe plusieurs façons de commander ces PPT pour former une liste bien ordonnée, afin de déterminer quel est le n
th. Vous pouvez choisir n'importe quel ordre que vous souhaitez, tant que vous pouvez prouver (informellement, c'est bien) que votre algorithme peut générer tous les PPT uniques possibles. Par exemple, votre code ne devrait pas sortir les deux (3,4,5)
et (4,3,5)
puisque ce sont des doublons du même triple - l'un ou l'autre, s'il vous plaît.
De même, que votre code soit à zéro ou à un index est correct, tant que vous indiquez lequel vous utilisez.
Exemples
Pour les exemples ci-dessous, j'utilise l'indexation unique, la sortie du n
PPT et la commande par le plus petit c
, puis le plus petit a
, puis le plus petit b
.
n | output
1 | (3, 4, 5)
2 | (5, 12, 13)
5 | (20, 21, 29)
12| (48, 55, 73)
Règles
- L'entrée et la sortie peuvent être données dans n'importe quel format pratique .
- Dans votre soumission, veuillez indiquer comment vos entrées sont classées et si vos entrées sont indexées 0 ou 1.
- La commande que vous avez choisie ne peut pas créer de doublons.
- Un programme complet ou une fonction sont acceptables. S'il s'agit d'une fonction, vous pouvez renvoyer la sortie plutôt que de l'imprimer.
- Si possible, veuillez inclure un lien vers un environnement de test en ligne afin que d'autres personnes puissent essayer votre code!
- Les failles standard sont interdites.
- Il s'agit de code-golf, donc toutes les règles de golf habituelles s'appliquent et le code le plus court (en octets) l'emporte.
la source
Réponses:
Gelée ,
2725 octets2 octets merci à Jonathan Allan.
Essayez-le en ligne!
Génère les premiers
n
triplets indexés sur 1[b, a, c]
, triés par augmentationb
puisa
.Utilise l'algorithme de Wikipedia :
Cela génère tous les triplets primitifs pour toutes les paires uniques de nombres entiers impairs
m > n > 0
.Explication
la source
g/Ị$Ðf
->g/ÐṂ
pour enregistrer deux octets (car le gcd minimal est 1 et il y aura toujours au moins une telle entrée).+2ḶḤ‘Œc
par²Rm2Œc
- scrap qu'il ne fonctionnera pas pour une entrée de1
:(²ḶḤ‘Œc
été l'un des premiersMATL , 36 octets
L'entrée est basée sur 1. L'ordre de sortie garantit que chaque triple apparaît exactement une fois. L'ordre est expliqué ci-dessous. L'explication nécessite d'approfondir un peu le fonctionnement du programme.
Le code continue d'augmenter un compteur
k
dans une boucle, à partir de1
. Pour chaquek
il génère toutes les paires aveca = 1,...,k
,b = 1,...,k
,a < b
, et des pics ceux qui donnent une triple avec Pythagorec <= k
. Les paires sont obtenues par ordre croissantb
, puisa
.Chaque paire est ensuite divisée par son pgcd. Les paires résultantes (éventuellement dupliquées) sont organisées sous forme de matrice à deux colonnes. Cette matrice est concaténée verticalement avec une matrice similaire contenant les résultats cumulés obtenus pour des valeurs plus petites de
k
. Les lignes de la matrice sont ensuite dédupliquées de manière stable. Cela supprime deux types de doublons:Paires qui ont été trouvées plus d'une fois pour le courant
k
(comme3,4
, qui résulte également de la6,8
division par son pgcd);Des paires qui étaient déjà trouvées avec des plus petites
k
.En fait, chaque itération
k
trouve toutes les paires qui ont déjà été trouvées pour les itérations précédentes. Mais il peut les trouver dans un ordre différent . Par exemple,k=25
trouvera le triple7,24,25
et non20,21,29
(carc
ne peut pas dépasserk
). Plus tard, l'itérationk=29
trouvera les deux, mais avec20,21,29
avant7,24,25
(l'ordre augmenteb
alorsa
). C'est pourquoi, au lieu de conserver toutes les paires trouvées pour la dernièrek
, nous les ajoutons aux précédentes et dédupliquons de manière stable. Cela garantit que l'ordre est le même pour n'importe quelle entréen
.Ce qui précède garantit que chaque triple primitif de Pythagore apparaîtra finalement et n'apparaîtra qu'une seule fois. Pour l'entrée
n
, la boucle sek
termine quand au moins desn
triplets valides ont été obtenus; puis len
-ième triple est ouput.Essayez-le en ligne!
Ou utilisez ce code modifié pour voir les premiers
n
triplets:Essayez-le en ligne!
la source
Haskell , 98 octets
Essayez-le en ligne!
Comment ça marche
Cela interprète les chiffres bijectifs de la base 3 de n comme un chemin vers le bas de l' arbre des triplets pythagoriciens primitifs . Il s'exécute sans recherche dans les opérations O (log n ).
la source
Gelée ,
1918 octetsLe programme prend un index n basé sur 1 et imprime les n premiers PPT [c, b, a] dans l'ordre lexicographique.
Il s'agit d'une solution O (64 n ) , donc TIO s'étouffera sur les entrées 4 et supérieures. Je vais travailler pour le rendre plus rapide.
Essayez-le en ligne!
Version alternative, O (n 3 ), probablement valide
Pour trouver le n ième triplet - [c n , b n , a n ] - la solution ci - dessus suppose que c n ≤ 4 n , est de vérifier facilement. Cependant, A020882 prouve que c n ~ 2πn , donc il y a un k tel que c n ≤ kn pour tout n .
Si nous pouvons prendre k = 7 , la solution ci-dessous est également valide (et beaucoup plus rapide).
Essayez-le en ligne!
Comment ça marche
la source
JavaScript (ES7),
106105103 octetsSort le Nth PPT. Les résultats sont indexés 1 et classés par la valeur de b .
Démo
Afficher l'extrait de code
la source
MATL , 63 octets
Essayez-le en ligne!
Une leçon de golf a terriblement mal tourné. Je le poste quand même parce que je me demande s'il existe des moyens de mieux jouer au golf.
J'ai basé ça sur ça page Wikipédia en combinaison avec la formule d'Euclide, pour générer de manière constructive tous les triplets plutôt que les approches par essais et erreurs.
Tout d'abord, les paires de coprimes impaires sont générées sous forme d'arbre ternaire. Cela se fait comme une grande multiplication matricielle, représentant la majeure partie du nombre d'octets. Ensuite, la formule d'Euclide est appliquée, peut-être aussi d'une manière très gaspilleuse d'octets. Si quelqu'un a des conseils pour ces deux parties, j'aimerais bien les entendre.
Notez que, pour économiser des octets, ce programme génère un arbre de la même profondeur que l'entrée, plutôt que
log3(n)
. En outre, les enfants sont générés pour chaque ligne plutôt que uniquement pour la dernière ligne de l'arborescence, puis filtrés à nouveau avecXu
. Voilà pour une approche constructive efficace.la source
Haskell, 65 octets
Indexation basée sur 0. Pour une donnée
c
,b
va jusqu'àc
eta
jusqu'àb
, doncc > b > a
tient toujours.Essayez-le en ligne!
la source
Python,
67504846 octetsEn utilisant les formules trouvées sur wikipedia,
a=m*n, b=(m^2-n^2)/2, c=(m^2+n^2)/2
où
m>n>0
etm
etn
sont des nombres premiers et impairs. Voici le code-17 octets grâce à @Martin Ender
Essayez-le en ligne
Fonctionne en ayant toujours la valeur de la
n
variable dans l'équation étant 1, ce qui signifie qu'ilm
s'agit simplement de toute autre valeur impaire, dans ce cas,3+2*n
oùn
est le numéro du triple de Pythagore primitif. Cela nous permet de supposer la valeur 1 pour toutes lesn
valeurs.la source
a
(et si vous le faisiez, vous pourriez vous débarrasser des deux espaces). Je ne sais pas non plus pourquoi vousprint
là-bas, vous pouvez simplement retourner les valeurs du lambda lui-même.Husk , 18 octets
Essayez-le en ligne!
-4 octets merci à Zgarb, avec l'inspiration de Dennis
Approche de force brute ultra-lente, ne fonctionnera pas sur TIO pour des entrées supérieures à 1. Vous pouvez essayer une version plus facile à gérer, limitée à a, b≤200 ici
Explication
la source
c
? dans ce cas, cette solution devrait être corrigéec
. Cette solution de 18 octets (qui utilise une autre astuce de Dennis) fonctionne malgré tout.Mathematica, 89 octets
en utilisant Solve ordonné par c
Mathematica, 124 octets
la source
R (+ numéros), 88 octets
Pour utiliser une fonction intégrée pour générer les nombres, il faut en fait une quantité surprenante d'octets pour obtenir ce que nous voulons. Le builtin prend deux arguments
c1
etc2
, et retourne les triplets qui ontc >= c1 & c <= c2
. Cela rend légèrement ennuyeux len
triplet. Cela ne fera qu'augmenterc2
1 à la fois jusqu'à ce que la sortie soit juste assez de lignes.la source
PHP , 273 octets
t($n)
renvoie un tableau de [a, b, c] avec ordrea < b < c
Essayez-le en ligne! (le code y est également lisible)
la source
C, 158 octets
Je crois que c'est ma première soumission ici, vous pouvez donc probablement faire mieux.
Et version non golfée:
Pour a 2 + b 2 = c 2 , l'ordre augmente c puis augmente a .
Il ne peut pas y avoir deux fois le même PPT que b est au moins a dans cet algorithme.la source
Gelée ,
2725 octetsIl s'agit d'une implémentation de l'approche arborescente de la réponse Haskell de @ AndersKaseorg , avec un ordre de branchement différent. Le programme utilise une indexation basée sur 0 et prend les données de STDIN.
Essayez-le en ligne!
Contexte
Comme mentionné sur la page Wikipedia Arbre des triplets pythagoriciens primitifs , chaque PPT peut être obtenu en multipliant à plusieurs reprises à gauche le vecteur ligne (3, 4, 5) par des matrices ayant certaines propriétés.
Dans chaque itération, le résultat précédent peut être multiplié à gauche par A , B ou C , qui peuvent être choisis comme suit.
Lorsque A , B et C sont fixes, chaque PPT peut être obtenu d'une manière unique.
Comment ça marche
la source
APL (NARS), 90 caractères, 180 octets
si l'argument de la fonction ci-dessus est ⍵, la fonction ci-dessus retournerait l'élément de l'index ⍵ (basé sur 1) du tableau a des éléments triplets pythagoriciens (a, b, c) où a <= b <= c et ce tableau est d'ordre d'abord pour a, (le côté le plus court), puis pour b (l'autre côté n'est pas hypoténuse). Il y aurait quelque chose de mal car on ne voit pas où je commande pour b aussi ... test:
il est lié à http://oeis.org/A020884 et http://oeis.org/A020884/b020884.txt
A020884: Jambes courtes ordonnées de triangles pythagoriciens primitifs.
Je ne sais pas si c'est vrai, il semble que la fonction donne un résultat correct du premier côté du triangle jusqu'à 1000, mais je ne sais pas pour le reste, et il pourrait y avoir un triple non pas trop, même <1000.
la source
JavaScript, 101 octets
Par la formule d'Euclide, tous les triplets primitifs de Pythagore peuvent être générés à partir d'entiers
m
etn
avecm>n>0
,m+n
impairgcd(m,n)==1
( Wikipedia )Cette fonction énumère toutes les
m,n
paires incrémentant m à partir dem=2
et décrémentantn
de 2 à partir dem-1
(ce quim+n
est impair)Moins golfé
Tester
la source