Pythagoras 'anderes Bein

33

Pythagoras hatte sein Bein im Krieg gesprengt. Es musste amputiert werden, und obwohl er fast gestorben wäre, zog er durch und machte eine vollständige Genesung. Jetzt, nach einem Jahr mit Krücken, hat er das Privileg, eine Beinprothese zu bekommen! Es gibt jedoch einige, die passen, aber welche?

Die Aufgabe

Bei einer positiven Ganzzahl als Eingabe, die der Länge eines Zweigs eines pythagoreischen Tripels entspricht, werden alle Möglichkeiten für den anderen Zweig ausgegeben. Zum Beispiel ist das kleinste pythagoreische Tripel (3,4,5), das ein Dreieck mit zwei Beinen der Länge 3 und 4 und einer Hypotenuse der Länge 5 bildet.

Beispiele

Leg:5
12

Leg:28
21
45
96
195

Leg:101
5100

Leg:1001
168
468
660
2880
3432
4080
5460
6468
10200
38532
45540
71568
501000

Die Regeln

  • Die Eingabe ist eine einzelne positive Ganzzahl n.
  • Die Ausgabe kann in beliebiger Reihenfolge erfolgen, mit einem beliebigen Trennzeichen, in einer beliebigen Basis (obwohl diese Basis konsistent sein muss) und mit optionalen öffnenden und schließenden geschweiften Klammern sowie optionalen nachgestellten Leerzeichen. Das heißt, 1 2 3, [1,2,3], und 1,11,111alle passen diese Ausgabespezifikation.
  • Sie können davon ausgehen, dass dieser nWert niemals größer als ein Viertel der vierten Wurzel Ihrer Sprachbeschränkung ist (ohne Bibliotheken zu verwenden). In der Praxis können Sie davon ausgehen, dass die Eingabe geringer ist als diese oder 10.000, je nachdem, welcher Wert geringer ist.

Pythagoras wartet auf Sie, schreiben Sie Ihren Code also schnell und kurz!

El'endia Starman
quelle
18
Er ist ein wirklich komischer Typ. Er ist bereit, ein paar tausend Jahre auf die Erfindung von Computern zu warten, aber nicht ein paar Nanosekunden mehr, um ein paar zusätzliche hundert Bytes zu lesen. Ein sehr präziser Mann, um es gelinde auszudrücken.
corsiKa

Antworten:

4

Pyth - 13 Bytes

Brute zwingt alle möglichen bis n^2+1.

f!%.a,TQ1S*QQ

Test Suite .

Maltysen
quelle
11

Gelee , 8 Bytes

²R²+²Æ²O

Diese Antwort ist nicht konkurrierend, da sie Funktionen verwendet, die nach dem Posten der Herausforderung implementiert wurden. Probieren Sie es online!

Dieser Ansatz verwendet keine Gleitkomma-Mathematik und gibt die richtige Antwort, solange die dazwischenliegenden Listen in den Speicher passen.

Idee

Wenn (a, b, c) ein pythagoreisches Tripel ist, gibt es streng positive ganze Zahlen k, m, n, so dass die Mengengleichung {a, b} = {km 2 - kn 2 , 2kmn} gilt.

Dies bedeutet insbesondere, dass a <b 2 und b <a 2 ist , sodass wir für Eingabe a einfach prüfen können, ob a 2 + b 2 ein perfektes Quadrat für jedes b in {1,… a 2 } ist .

Code

            Input: x

²           Compute x².
 R          Get get range 1 ... x².
  ²         Square each integer in that range.
   +²       Add x² to each resulting square.
     Ʋ     Check if the resulting sums are perfect squares.
       O    Get all indices of ones.
Dennis
quelle
10

Julia, 35 Bytes

n->filter(i->hypot(i,n)%1==0,1:n^2)

Dies ist eine anonyme Funktion, die eine Ganzzahl akzeptiert und ein Array zurückgibt.

Für jede ivon 1 bis zum Quadrat der Eingabe berechnen wir die Hypotenuse mit Julias integrierter hypotFunktion und bestimmen, ob der Bruchteil 0 ist. Wenn ja, behalten wir ihn bei, andernfalls ist er ausgeschlossen.

Alex A.
quelle
6

CJam, 17 Bytes

{:A2#{Amh1%!},1>}

Dies ist eine anonyme Funktion, die eine Ganzzahl aus dem Stapel entfernt und ein Array zurückgibt.

Probieren Sie es online!

Idee

Wenn (a, b, c) ein pythagoreisches Tripel ist, gibt es streng positive ganze Zahlen k, m, n, so dass die Mengengleichung {a, b} = {km 2 - kn 2 , 2kmn} gilt.

Dies bedeutet insbesondere, dass a <b 2 und b <a 2 ist , sodass wir für Eingabe a einfach prüfen können, ob a 2 + b 2 ein perfektes Quadrat für jedes b in {1,… a 2 } ist .

Code

:A               Save the input in A.
  2#             Square it.
    {      },    Filter; for each B in {0, ..., A**2}:
     Amh           Calculate the hypotenuse of (A, B).
        1%!        Apply logical NOT to its fractional part.
                 Keep B if ! pushed 1.
             1>  Discard the first kept B (0).  
Dennis
quelle
4

JavaScript ES6, 60 62

Entspricht den anderen Antworten und prüft von 1 bis a * a-1

a=>[...Array(a*a).keys()].filter(b=>b&&!(Math.hypot(a,b)%1))

Danke an @ Mwr247, der kürzeste Weg, um eine Reichweite in ES6 zu erstellen

2 Bytes gespart dank @ETHproductions

edc65
quelle
Genial! Ich denke, Sie könnten ein paar Bytes mit einem eingebauten speichern:a=>[...Array(a*a).keys()].filter(b=>b&&!(Math.hypot(a,b)%1))
ETHproductions
@ETHproductions thx, ich muss mehr über die neuen Mathe-Builtins lernen
edc65
Praktischerweise werden sie auch auf der Seite besprochen, die Sie bereits verlinkt haben. (Ich hätte den Hypot Vorschlag selbst gemacht, aber ich war zu diesem Zeitpunkt nicht eingeloggt.)
Neil
3

C 96 Bytes

Erhöhen Sie abwechselnd y(das andere Bein) und z(die Hypotenuse), bis die Differenz auf 1 sinkt. Geben Sie jede exakte Übereinstimmung ( c==0) aus, die Sie unterwegs finden.

int x,y,z;main(int c,char**a){for(x=z=atoi(a[1]);++y<z;c=x*x+y*y-z*z,c?z+=c>0:printf("%d ",y));}

Rufen Sie das kompilierte Programm mit n als Parameter auf; Es wird eine durch Leerzeichen getrennte Liste von Dezimalzahlen ausgegeben.

Offensichtlich nicht die kürzeste; Ich mag Trost darin finden, den schnellsten zu haben.

$ time ./pyth 9999
200 2020 13332 13668 16968 44440 45360 54540 55660 137532 164832 168168 413080 494900 504900 617120 1514832 1851468 4544540 5554440 16663332 49990000 
real    0m0.846s
user    0m0.800s
sys     0m0.000s
Ruud Helderman
quelle
88 Bytes
Ceilingcat
3

Wolfram Language (Mathematica) , 40 Byte

b/.Solve[#^2+b^2==c^2,PositiveIntegers]&

Ich verwende eine undokumentierte Form von Solve: Wenn die Liste der Variablen weggelassen wird, wird Solvestandardmäßig nach allen Symbolen im Ausdruck aufgelöst. Wir sparen also 6 Bytes gegenüber den regulären Solve[#^2+b^2==c^2,{b,c},PositiveIntegers].

PositiveIntegersist neu in Version 12 von Mathematica und daher in TIO nicht verfügbar . In Desktop Mathematica bekommen wir

F = b/.Solve[#^2+b^2==c^2,PositiveIntegers]& ;

F[5]
(*    {12}    *)

F[28]
(*    {21, 45, 96, 195}    *)

F[101]
(*    {5100}    *)

F[1001]
(*    {168, 468, 660, 2880, 3432, 4080, 5460, 6468, 10200, 38532, 45540, 71568, 501000}    *)
römisch
quelle
2

Python 2, 53 Bytes

lambda n:[i for i in range(1,n*n)if abs(i+n*1j)%1==0]

Eine einfache Lösung, absbei der die Länge der Hypotenuse mithilfe von Komplex berechnet wird. Es ist sicher n*nals obere Schranke für das andere Bein zu verwenden, weil (n*n)^2 + n^2 < (n*n+1)^2. Ich habe versucht, stattdessen eine Rekursion zu verwenden, habe aber nichts Kürzeres gefunden.

xnor
quelle
2

Im Ernst, 20 Bytes

,;╗ªDR;`╜@ÇA1@%Y`M@░

Gleiche Strategie wie die Antwort von xnor in Python: Überprüfen Sie, ob i in range(1,n*n)Werte vorhanden sind abs(i+nj) % 1 == 0, und geben Sie die Liste aus. Probieren Sie es online aus

Erläuterung:

,;╗    get input and save a copy in register 0
ªDR;   push two copies of range(1,n*n)
`╜@ÇA1@%Y`M    map the function across one of the ranges:
    ╜@ÇA         compute abs(i+nj)
    1@%Y         push 1 if result % 1 is 0, else 0
M@░    swap the two lists, take values in the original range where the corresponding values in the second range are truthy
Mego
quelle
2

PARI / GP, 36 Bytes

x->[y|y<-[1..x^2],issquare(x^2+y^2)]
Alephalpha
quelle
2

APL (NARS), 373 Zeichen, 746 Byte

C←{h←{0=k←⍺-1:,¨⍵⋄(k<0)∨k≥i←≢w←⍵:⍬⋄↑,/{w[⍵],¨k h w[(⍳i)∼⍳⍵]}¨⍳i-k}⋄1≥≡⍵:⍺h⍵⋄⍺h⊂¨⍵}⋄P←{1≥k←≢w←,⍵:⊂w⋄↑,/{w[⍵],¨P w[a∼⍵]}¨a←⍳k}⋄d←{∪×/¨{k←≢b←1,π⍵⋄∪{b[⍵]}¨↑∪/101 1‼k k}⍵}⋄t←{(-/k),(×/2,⍵),+/k←⍵*2}⋄b←{⍬≡a←3 C d w←⍵:(⊂1,⍵,1)⋄(⊂1,⍵,1),a/⍨{⍵[2]>⍵[3]}¨a←↑∪/P¨,a/⍨{w=×/⍵}¨a}⋄u←{(↑⍵),2÷⍨(+/a),-/a←1↓⍵}⋄t1←{(↑¨⍵)×t¨1↓¨⍵}⋄f1←{0=2∣⍵:↑¨t1 b⍵÷2⋄{2⊃⍵}¨t1 u¨b⍵}⋄f←{m←⎕ct⋄⎕ct←0⋄r←f1⍵⋄⎕ct←m⋄r}

Kommentar:

C: ⍺ combination in ⍵ list
P: permutations  in ⍵ list
d: divisors of ⍵ unsigned
t: Pythagorian triple from ⍵ list 2 unsigned
b: if argument ⍵ is one unsigned it would return the list of (k,i,j) where 
   k,i,j are all divisors of ⍵, and ⍵=k×i×j and i>j
u: from one triple (k,i,j) return (k,(i+j)/2,(i-j)/2)
t1: apply (k,i,j) to t in the way  k×t i,j 
f: the function of this exercise

Die Idee wäre der Faktor der Eingabe, um das mögliche m, n zu kennen, das unter Verwendung aller Pythagorianischen Tripel erzeugt wird, die die Eingabe als Schenkel haben. Prüfung:

  f 18298292829831839x
167413760243137645229428509060960 15219432749376149566311682641900 99808869980900940 
  1383584795397831778755607512840 
  f 5
12
  f 28
195 96 21 45 
  f 101
5100
  f 1001
501000 6468 38532 2880 468 660 168 5460 45540 4080 71568 3432 10200 
  ≢f 1001
13
  f 1663481166348349x
1383584795397831778755607512900 
  f 198820182831x
19764732550476133587280 346749693868002343608 5664631173992 6083327962596530720 613900915408 115583231289334114460 
  18249983887789596492 1883559626820 1040249081604007030900 54749951663368790920 6588244183492044529092 
  265093577108 2196081394497348176360 
RosLuP
quelle
2

APL (Dyalog Extended) , 15 bis 14 Byte SBCS

Anonyme implizite Präfixfunktion.

(⍸⊢(+∊⊢)⍳×⍳)×⍨

Probieren Sie es online!

×⍨ Quadrat (lit. Multiplikation Selfie) des Arguments

() Wenden folgende anonyme stillschweigende Funktion an:

ɩ Zahlen 1 durch das Argument

 multiplizieren Sie mit ɩ ntegers 1 durch das Argument (dh Quadrat)

⊢() Wende die folgende anonyme implizite Funktion mit dem Argument als linkes Argument an:

  + ist die Summe

   ein Mitglied von

   es?

ɩ ndices von Wahrheiten

Adam
quelle
1

Perl 5, 43 Bytes

$i=<>;{sqrt(++$_**2+$i**2)!~/\./&&say;redo}

Wenn Sie möchten, dass das Skript beendet wird, können wir andere Zweige nur bis zu einer Größe von n² untersuchen, wie von xnor erläutert. Wir haben also 48 Bytes:

map{sqrt(++$_**2+$i**2)!~/\./&&say}1..($i=<>)**2
msh210
quelle
1

Japt , 16 Bytes

1oU² f@!(MhXU %1

Probieren Sie es online!

Wie es funktioniert

        // Implicit: U = input integer
1oU²    // Generate a range of integers from 1 to U squared.
f@!(    // Keep only items X that return falsily to:
MhXU %1 //  Math.hypot(X,U) % 1.
        // This keeps only the items where sqrt(X*X+U*U) = 0.
        // Implicit: output last expression
ETHproductions
quelle
1

05AB1E , 10 Bytes

nDLn+Ųƶ0K

Probieren Sie es online aus oder überprüfen Sie alle Testfälle .

nDLʒnIn+Ų

Probieren Sie es online aus oder überprüfen Sie alle Testfälle .

Erläuterung:

n           # Take the square of the (implicit) input-integer
 D          # Duplicate it
  L         # Create a list in the range [1, input^2]
   n        # Square each value in this list
    +       # Add the input^2 we duplicated to each
     Ų     # Check for each of these if it's a square (1 if truthy; 0 if falsey)
       ƶ    # Multiply each value by its 1-based index
        0K  # Remove all 0s from the list
            # (after which the result is output implicitly)

nDL         # Same as above
   ʒ        # Filter this list by:
    n       #  Get the square of the current number
     In+    #  Add the squared input to it
        Ų  #  And check if it's a square
            # (after the filter, implicitly output the result)
Kevin Cruijssen
quelle
1

MathGolf , 9 Bytes

²╒gƲk²+°

Probieren Sie es online!

Konnte keinen guten Weg finden, um irgendwelche der ²s zu entfernen , die 3/9 Bytes belegen. Ansonsten ist es ganz einfach

Erläuterung

²           square input
 ╒          range(1,n+1)
  gÆ        filter list using next 5 operators
    ²       square list element
     k²     push input squared
       +    pop a, b : push(a+b)
        °   is perfect square
maxb
quelle
1

Java 8, 72 Bytes

n->{for(int i=0;++i<n*n;)if(Math.hypot(i,n)%1==0)System.out.println(i);}

Probieren Sie es online aus.

Erläuterung:

n->{                           // Method with integer as parameter and no return-type
  for(int i=0;++i<n*n;)        //  Loop `i` in the range (0, n²)):
    if(Math.hypot(i,n)         //   If sqrt(i² + n²)
       %1==0)                  //   has no decimal digits after the comma (so is an integer)
      System.out.println(i);}  //    Output `i` with trailing newline
Kevin Cruijssen
quelle