( verwandt )
Ein pythagoreisches Dreifach ist eine Liste (a, b, c)
, die die Gleichung a 2 + b 2 = c 2 erfüllt .
Eine Primitive Pythagoreisches Tripel (PPT) ist eine , wo a
, b
und c
sind alle coprime (dh die einzige gemeinsame Teiler zwischen den drei Elementen ist 1
). Das (3, 4, 5)
rechte Dreieck ist beispielsweise ein berühmtes primitives pythagoreisches Dreieck.
Die Herausforderung
- Bei gegebener Eingabe
n
wird dien
th PPT ausgegeben . Oder, - Bei gegebener Eingabe
n
werden die erstenn
PPTs ausgegeben.
Es gibt mehrere Möglichkeiten, diese PPTs zu ordnen, um eine geordnete Liste zu bilden, um zu bestimmen, welche die n
th ist. Sie können eine beliebige Reihenfolge auswählen, solange Sie nachweisen können (informell ist in Ordnung), dass Ihr Algorithmus jede mögliche eindeutige PPT generieren kann. Zum Beispiel sollte Ihr Code nicht beide ausgeben (3,4,5)
und (4,3,5)
da es sich um Duplikate desselben Tripels handelt, bitte das eine oder andere.
Ebenso ist es in Ordnung, ob Ihr Code null- oder einindexiert ist, solange Sie angeben, welchen Code Sie verwenden.
Beispiele
In den folgenden Beispielen verwende ich die Ein-Indexierung, gebe die n
th-PPT aus und ordne nach kleinsten c
, dann nach kleinsten a
und dann nach kleinsten b
.
n | output
1 | (3, 4, 5)
2 | (5, 12, 13)
5 | (20, 21, 29)
12| (48, 55, 73)
Regeln
- Die Ein- und Ausgabe kann in jedem beliebigen Format erfolgen .
- Bitte geben Sie in Ihrem Beitrag an, wie Ihre Einträge sortiert sind und ob Ihre Einträge 0-indiziert oder 1-indiziert sind.
- Ihre gewählte Bestellung kann keine Duplikate erstellen.
- Es ist entweder ein vollständiges Programm oder eine Funktion zulässig. Bei einer Funktion können Sie die Ausgabe zurückgeben, anstatt sie zu drucken.
- Fügen Sie nach Möglichkeit einen Link zu einer Online-Testumgebung hinzu, damit andere Benutzer Ihren Code ausprobieren können!
- Standardlücken sind verboten.
- Dies ist Codegolf, daher gelten alle üblichen Golfregeln, und der kürzeste Code (in Byte) gewinnt.
quelle
Antworten:
Jelly ,
2725 Bytes2 Bytes dank Jonathan Allan.
Probieren Sie es online!
Gibt die ersten
n
1-indizierten Tripel aus[b, a, c]
, sortiert nach Erhöhenb
und danna
.Verwendet den Algorithmus von Wikipedia :
Dies erzeugt alle primitiven Tripel für alle eindeutigen Coprime-Paare von ungeraden ganzen Zahlen
m > n > 0
.Erläuterung
quelle
g/Ị$Ðf
->g/ÐṂ
um zwei Bytes zu speichern (da der minimale gcd 1 ist und es immer mindestens einen solchen Eintrag geben wird).+2ḶḤ‘Œc
mit²Rm2Œc
- Schrott , dass es nicht funktioniert für eine Eingabe von1
:(²ḶḤ‘Œc
MATL , 36 Bytes
Die Eingabe ist 1-basiert. Die Ausgabereihenfolge garantiert, dass jedes Tripel genau einmal vorkommt. Die Reihenfolge wird im Folgenden erläutert. Die Erklärung erfordert ein wenig Einblick in die Funktionsweise des Programms.
Der Code erhöht ständig einen Zähler
k
in einer Schleife, beginnend bei1
. Für jedek
erzeugt er alle Paare mita = 1,...,k
,b = 1,...,k
,a < b
, und Picks jene , die einen pythagoreischen triple mit gebenc <= k
. Die Paare werden in der Reihenfolge zunehmender erhaltenb
, danna
.Jedes Paar wird dann durch seinen gcd geteilt. Die resultierenden (möglicherweise duplizierten) Paare werden als zweispaltige Matrix angeordnet. Diese Matrix ist vertikal mit einer ähnlichen Matrix verkettet, die die akkumulierten Ergebnisse enthält, die für kleinere Werte von erhalten wurden
k
. Die Zeilen der Matrix werden dann stabil dedupliziert. Dadurch werden zwei Arten von Duplikaten entfernt:Paare, die mehr als einmal für den Strom gefunden wurden
k
(wie z. B.3,4
, was sich auch aus der6,8
Division durch den gcd ergibt );Paare, die bereits mit kleineren gefunden wurden
k
.Tatsächlich findet jede Iteration
k
alle Paare, die bereits für vorherige Iterationen gefunden wurden. Aber es kann sie in einer anderen Reihenfolge finden . Zum Beispielk=25
finden Sie das Triple7,24,25
und nicht20,21,29
(weilc
nicht überschreiten kannk
). Später wird Iterationk=29
beides finden, aber mit20,21,29
vorher7,24,25
(die Reihenfolge nimmtb
dann zua
). Aus diesem Grund werden nicht alle Paare für die neuesten gefunden, sondernk
an die vorherigen angehängt und stabil dedupliziert. Dadurch wird sichergestellt, dass die Reihenfolge für alle Eingaben gleich istn
.Das Obige garantiert, dass jedes primitive pythagoreische Tripel irgendwann auftaucht und nur noch einmal auftaucht. Bei der Eingabe endet
n
die Schleife,k
wenn mindestensn
gültige Tripel erhalten wurden. und dann ist dasn
Dreifache die Ausgabe.Probieren Sie es online!
Oder verwenden Sie diesen geänderten Code, um die ersten
n
Triples zu sehen:Probieren Sie es online!
quelle
Haskell , 98 Bytes
Probieren Sie es online!
Wie es funktioniert
Dies interpretiert die bijektiven Basis-3- Ziffern von n als Pfad entlang des Baums der primitiven pythagoreischen Tripel . Es wird ohne Suchen in O- Operationen (log n ) ausgeführt.
quelle
Jelly ,
1918 BytesDas Programm verwendet einen 1-basierten Index n und druckt die ersten n PPTs [c, b, a] in lexikographischer Reihenfolge.
Dies ist eine O (64 n ) -Lösung, sodass TIO ab Eingang 4 drosselt. Ich werde daran arbeiten, es schneller zu machen.
Probieren Sie es online!
Alternative Version, O (n 3 ), wahrscheinlich gültig
Um das n- te Triplett zu finden - [c n , b n , a n ] - nimmt die obige Lösung an, dass c n ≤ 4 n ist , was leicht zu überprüfen ist. Jedoch A020882 beweist , dass c n ~ 2πn , so gibt es einen k , so dass c n ≤ kn für alle n .
Wenn wir k = 7 nehmen können , ist die unten stehende Lösung ebenfalls gültig (und viel, viel schneller).
Probieren Sie es online!
Wie es funktioniert
quelle
JavaScript (ES7),
106105103 ByteGibt die n-te PPT aus. Die Ergebnisse sind 1-indiziert und nach dem Wert von b geordnet .
Demo
Code-Snippet anzeigen
quelle
MATL , 63 Bytes
Probieren Sie es online!
Eine Golfstunde, die furchtbar schief gelaufen ist. Ich poste es trotzdem, weil ich mich frage, ob es Möglichkeiten gibt, dies besser zu golfen.
Ich habe dies auf dieser Wikipedia-Seite in Kombination mit der Formel von Euclid basiert, um konstruktiv alle Tripel zu generieren und nicht nur Versuche und Irrtümer.
Zunächst werden ungerade Koprime-Paare als ternärer Baum erzeugt. Dies geschieht als eine große Matrixmultiplikation, die den größten Teil der Byteanzahl ausmacht. Dann wird die Euklid-Formel angewendet, möglicherweise auch in einer sehr byteschwachen Weise. Wenn jemand Tipps für diese beiden Teile hat, würde ich sie gerne hören.
Beachten Sie, dass dieses Programm zum Speichern von Bytes einen Baum mit der gleichen Tiefe wie die Eingabe generiert
log3(n)
. Außerdem werden Kinder für jede Zeile und nicht nur für die letzte Zeile des Baums generiert und dann erneut mit gefiltertXu
. Soviel zu einem effizienten konstruktiven Ansatz.quelle
Haskell, 65 Bytes
0-basierte Indizierung. Für eine gegebene
c
,b
zu läuftc
unda
bis zub
,c > b > a
hält also immer.Probieren Sie es online!
quelle
Python,
67504846 BytesVerwenden Sie die Formeln auf Wikipedia,
a=m*n, b=(m^2-n^2)/2, c=(m^2+n^2)/2
wo
m>n>0
undm
undn
sind coprimes und ungerade. Hier ist der Code-17 Bytes dank @Martin Ender
Probieren Sie es online
Arbeitet so, dass der Wert der
n
Variablen in der Gleichung immer 1 ist, was bedeutet, dass diesm
einfach ein anderer ungerader Wert ist, in diesem Fall,3+2*n
bei demn
es sich um die Nummer des primitiven pythagoreischen Tripels handelt. Dies ermöglicht es uns, für allen
Werte den Wert 1 anzunehmen .quelle
a
(und wenn Sie dies tun, könnten Sie die beiden Leerzeichen dort entfernen). Ich bin mir auch nicht sicher warum duprint
da bist , du könntest einfach die Werte vom Lambda selbst zurückgeben.Schale , 18 Bytes
Probieren Sie es online!
-4 Bytes danke an Zgarb, mit Inspiration von Dennis
Super-langsamer Brute-Force-Ansatz, funktioniert bei TIO-Eingängen über 1 nicht. Sie können hier eine handlichere Version ausprobieren, die auf a, b ≤ 200 beschränkt ist
Erläuterung
quelle
c
? In diesem Fall müsste diese Lösung behoben werdenc
. Diese 18-Byte-Lösung (die einen anderen Trick von Dennis verwendet) funktioniert unabhängig davon.Mathematica, 89 Bytes
using Solve sortiert nach c
Mathematica, 124 Bytes
quelle
R (+ Zahlen), 88 Bytes
Um mit einem Built-In die Zahlen zu generieren, ist eine überraschende Menge an Bytes erforderlich, um das zu erhalten, was wir wollen. Das Builtin nimmt zwei Argumente
c1
undc2
und gibt die Triplets zurück, die habenc >= c1 & c <= c2
. Dies macht es etwas ärgerlich, zumn
-ten Triplett zu gelangen. Dies erhöht immer nurc2
1 auf einmal, bis die Ausgabe gerade genug Zeilen ist.quelle
PHP , 273 Bytes
t($n)
Gibt ein Array von [a, b, c] mit der Reihenfolge zurücka < b < c
Probieren Sie es online! (Code ist dort auch lesbar)
quelle
C 158 Bytes
Ich glaube, dies ist meine erste Einreichung hier, also können Sie es höchstwahrscheinlich besser machen.
Und ungolfed version:
Für a 2 + b 2 = c 2 erhöht sich die Reihenfolge von c zu a .
In diesem Algorithmus kann es nicht zweimal die gleiche PPT geben, die b mindestens a hat .quelle
Jelly ,
2725 BytesDies ist eine Implementierung des Baumansatzes von @ AndersKaseorgs Haskell-Antwort mit einer anderen Verzweigungsreihenfolge. Das Programm verwendet eine 0-basierte Indexierung und nimmt Eingaben von STDIN entgegen.
Probieren Sie es online!
Hintergrund
Wie auf der Wikipedia-Seite Tree of primitive Pythagorean triples erwähnt , kann jede PPT durch wiederholtes Linksmultiplizieren des Zeilenvektors (3, 4, 5) erhalten werden. mit Matrizen mit bestimmten Eigenschaften erhalten werden.
In jeder Iteration kann das vorherige Ergebnis mit A , B oder C multipliziert werden , was wie folgt gewählt werden kann.
Wenn A , B und C festgelegt sind, kann jede PPT auf einzigartige Weise erhalten werden.
Wie es funktioniert
quelle
APL (NARS), 90 Zeichen, 180 Byte
Wenn das Argument der obigen Funktion ⍵ ist, würde die obige Funktion das Element des Index zurückgeben. ⍵ (1 basiert) des Arrays enthält Elemente Pythagoreische Tripel (a, b, c), wobei a <= b <= c und dieses Array ist Reihenfolge zuerst für a (die Seite ist kürzer), dann für b (die andere Seite ist nicht hypotenuse). Es wäre etwas nicht in Ordnung, da dort nicht zu sehen ist, wo ich für b bestelle ... test:
es ist verwandt mit http://oeis.org/A020884 und http://oeis.org/A020884/b020884.txt
A020884: Geordnete kurze Beine aus primitiven pythagoreischen Dreiecken.
Ich weiß nicht, ob es richtig ist, es scheint, dass die Funktion das korrekte Ergebnis der ersten Seite des Dreiecks bis 1000 liefert, aber ich weiß nicht, ob es noch übrig ist, und es kann sein, dass ein Triple auch <1000 nicht richtig ist.
quelle
JavaScript, 101 Bytes
Nach der Euklidschen Formel können alle primitiven pythagoreischen Tripel aus ganzen Zahlen
m
undn
mitm>n>0
,m+n
oddgcd(m,n)==1
( Wikipedia ) erzeugt werden.Diese Funktion zählt alle
m,n
Paare auf, die ab m umm=2
eins inkrementieren und abn
2 um eins dekrementierenm-1
(alsom+n
ungerade).Weniger golfen
Prüfung
quelle