Stimmt mein Dreieck?


47

a, b, cSagen Sie anhand der Länge der drei Seiten eines Dreiecks, ob das Dreieck rechtwinklig ist (dh einen Winkel von 90 Grad hat) oder nicht.

Eingang

Drei positive ganzzahlige Werte in beliebiger Reihenfolge

Ausgabe

Entweder ein spezifischer wahrer Ausgang ( true, 1, yes, ...) oder ein bestimmte falscher Ausgang ( false, 0, no, ...)

Beispiel

5, 3, 4        --> yes
3, 5, 4        --> yes
12, 37, 35     --> yes
21, 38, 50     --> no
210, 308, 250  --> no

Regeln

  • Die Ein- und Ausgabe kann in jedem beliebigen Format erfolgen .
  • Bitte geben Sie in Ihrer Eingabe den wahren und den falschen Wert an.
  • Es ist nicht erforderlich, negative Werte oder ungültige Flankentripel zu verarbeiten
  • 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 daher gelten alle üblichen Golfregeln, und der kürzeste Code (in Byte) gewinnt.

1
Müssen wir mit negativen Werten oder ungültigen Flankentripeln umgehen?
User202729

2
Sehr verwandt . Ich überlasse es dem Rest der Community, zu entscheiden, ob es sich um einen Trottel handelt.
Digitales Trauma

2
Ich denke, dass die Verwendung von Koordinaten anstelle von Längen die Herausforderung erheblich verändert
Luis Mendo

8
Es gibt kein Dreieck mit Längen 21, 38, 5, da 21 + 5 <38 . Ist dies ein vorsätzlicher pathologischer Fall, mit dem wir uns befassen müssen?
Kevin

1
@ Kevin nein, Sie müssen diesen Fall nicht behandeln. User202729 hat diese Frage bereits gestellt :)
mdahmoune

Antworten:


37

Gelee , 5 Bytes

²µSHe

Probieren Sie es online!

Technischer Hinweis: Bytes werden in der Jelly-Codepage gezählt.

Erläuterung:

²µSHe  Main link.
²      Square each number.
 µ     With the new list,
  S    calculate its sum,
   H   and halve it.
    e  Check if the result exists in the new list (squared input)

Das Problem ist gleichbedeutend damit, dass man drei Zahlen erhält a, b, cund fragt, ob es eine solche Permutation gibt a² + b² = c². Dies ist gleichbedeutend damit, ob (a² + b² + c²) ÷ 2es sich um eines von a², b² or c²beiden handelt. Das Programm überprüft dies also nur.


na ja ... ich jelly.
Félix Gagnon-Grenier

1
Nur eine technische Anmerkung: Symbole ²und µkosten jeweils zwei Bytes in UTF-8, also hat Ihr Code tatsächlich 7 Bytes, nicht 5
Charlie

2
@Charlie Antwort zur Verdeutlichung bearbeitet.
User202729

20

Python 2 , 37 Bytes

a,b,c=sorted(input())
1/(a*a+b*b-c*c)

Probieren Sie es online!

-2 dank FlipTack .
-1 danke an Craig Gidney .

Ausgabe über Exit-Code ( 0= false, 1= true).


Bah. Kam mit genau der gleichen Antwort auf. Sie können die Testsuite ändern, um eine beliebige Anzahl von Testfällen zuzulassen: siehe hier
mbomb007

@ mbomb007 exec(code)hmmm, warum exec (code)statt exec code? : D ;-p
Erik der Outgolfer

Haha, wie hat diese Antwort doppelt so viele positive Stimmen wie die kürzere von xnor? Vielleicht mögen die Leute nur die süße Einfachheit davon
FlipTack

1
@FlipTack ¯_ (ツ) _ / ¯ (auch xnor's ist nicht in Python 2)
Erik the Outgolfer

@EriktheOutgolfer Weil das Boilerplate nicht das Teil ist, das golfen werden soll. Ich habe es so gemacht, dass es in Python 2 oder 3
funktioniert

17

Java 8, 44 Bytes

(a,b,c)->(a*=a)+(b*=b)==(c*=c)|a+c==b|b+c==a

Erläuterung:

Probieren Sie es hier aus.

(a,b,c)->                // Method with three integer parameters and boolean return-type
  (a*=a)+(b*=b)==(c*=c)  //  Return if `a*a + b*b == c*c`
  |a+c==b                //  or `a*a + c*c == b*b`
  |b+c==a                //  or `b*b + c*c == a*a`
                         // End of method (implicit / single-line return-statement)

Funktioniert das ohne die Klammer auf dem (c*=c)? Das *=könnte Vorrang vor dem haben ==und Sie können zwei Bytes sparen.
corsiKa

@ CorsiKa Ich fürchte, es ist umgekehrt. ==hat Vorrang vor *=. =, +=, *=, Und ähnliche Aufgaben haben tatsächlich die niedrigste Priorität in Java Operatoren .
Kevin Cruijssen

Ich kann nichts kürzeres finden ... Ich habe versucht, die Variablen so zu vertauschen, dass sie a(zum Beispiel) den Maximalwert haben , ohne Erfolg. Nun, ich könnte es schaffen, aber ungefähr 65 Charaktere ...
Olivier Grégoire

12

JavaScript (ES6), 43 41 40 Byte

1 Byte gespeichert und dank @Neil einen Fehler behoben

Nimmt die Eingabe als Array von 3 ganzen Zahlen. Rückgabe truefür rechtwinklig und falsesonst.

a=>a.some(n=>Math.hypot(...a,...a)==n*2)


Originalversion, 44 Bytes

Nimmt die Eingabe als 3 Ganzzahlen. Rückgabe 1für rechtwinklig und 0sonst.

(a,b,c)=>(a*=a)+(b*=b)==(c*=c)|a+c==b|b+c==a

Testfälle


Sieht aus wie wir mit der exakt gleichen Antwort kamen ( mit Ausnahme des =>und ->Unterschied zwischen JavaScript und Java 8). ;) Also offensichtlich +1 von mir.
Kevin Cruijssen

>>1ist unsicher, dies ergibt true für [1, 1, 1].
Neil

2
Wie wäre es Math.hypot(...a,...a)==n*2?
Neil

@ Neil Very nice fix :)
Arnauld

2
@Neil Es sollte einen ~=Operator für "rougly gleich" geben;)
JollyJoker


7

Dreieckig , 57 Bytes

Ich habe noch keine in dieser Sprache gesehen und es schien angebracht zu versuchen, eine zu machen. Es hat ein bisschen gedauert ... als ich mich zuerst darum kümmern musste und ich glaube, das könnte noch ein bisschen mehr golfen werden.

,$\:$:*/%*$"`=P:pp.0"*>/>-`:S!>/U+<U"g+..>p`S:U/U"p`!g<>/

Probieren Sie es online!

Dies erweitert sich zu dem folgenden Dreieck.

          ,
         $ \
        : $ :
       * / % *
      $ " ` = P
     : p p . 0 "
    * > / > - ` :
   S ! > / U + < U
  " g + . . > p ` S
 : U / U " p ` ! g <
> /

Der Weg ist ziemlich verworren, aber ich werde versuchen zu erklären, was ich getan habe. Ich werde die Richtungszeiger überspringen. Der größte Teil des Codes ist Stapelmanipulation.

  • $:* Quadrieren Sie die erste Eingabe.
  • $:* Quadrieren Sie die zweite Eingabe.
  • S":Ug! Prüfen Sie, ob der zweite Wert größer als der erste ist.
    • true p" Tausche mit dem ersten.
    • false p Nichts tun.
  • $:* Quadrieren Sie die dritte Eingabe.
  • P":USg! Prüfen Sie, ob der dritte Wert größer ist als der größte des vorherigen.
    • true p+U- summiert den aktuellen Stack und nimmt den gespeicherten dritten Wert weg
    • Falsche p"U+- Summe die geringste und gespeicherte dritte und vom größten subtrahieren
  • 0=% Testen Sie die Gleichheit auf Null und geben Sie das Ergebnis aus.

6

Haskell ( 33 32 31 Bytes)

(\x->(sum x)/2`elem`x).map(^2)

Originalfassung:

(\x->2*maximum x==sum x).map(^2)

Anonyme Funktion. Nimmt eine Liste in der Form [a, b, c]. Gibt True oder False aus.

Die erste Version prüfte, ob die Summe der Quadrate doppelt so groß war wie das Quadrat des Maximums.

Zweitens prüft eine etwas bessere Version, ob die Hälfte der Quadratsumme ein Element in der Liste der Quadrate ist.

Edit: Habe versehentlich einen Zeilenumbruch gezählt, danke H.PWiz


1
Willkommen auf der Seite! Diese Antwort ist nur 32 Bytes, haben Sie vielleicht einen zusätzlichen Zeilenumbruch gezählt?
H.PWiz

3
Mit der Funktion Monad können Sie hier
H.PWiz

Außerdem können die Klammern sumweggeworfen werden. schöne lösung!
stolzer Haskeller

6

Perl 6 , 24 Bytes

{(*²+*²==*²)(|.sort)}

Probieren Sie es online!

*²+*²==*²ist eine anonyme Funktion, die true zurückgibt, wenn die Summe der Quadrate der ersten beiden Argumente dem Quadrat des dritten Arguments entspricht. Wir übergeben die sortierte Eingabeliste an diese Funktion und glätten sie mit in die Argumentliste |.


6

R 31 26 30 Bytes

cat(sum(a<-scan()^2)/max(a)==2)

Ich mag dieses nicht so sehr, aber es ist kürzer. Summiert die Quadrate und dividiert durch das größte Quadrat. Wahrheit wenn 2.

Vorherige Version (modifiziert mit cat und mit @ Guiseppes Tipp)

cat(!sort(scan())^2%*%c(1,1,-1))

Machen Sie eine Summe der sortierten Eingaben mit dem zuletzt negierten Element und geben Sie das !nicht zurück.

Probieren Sie es online!


Für Ihre vorherige Version sind !sort(scan())^2%*%c(1,1,-1)es 27 Bytes. aber ich denke du brauchst noch eine cat.
Giuseppe

Cheers @ Guiseppe, vergaß die Katze. Die Regeln um REPL ärgern mich, aber sie sind, was sie sind.
MickyT

@ Giuseppe Auch schöne Wendung mit der Matrixmultiplikation. Das hätte ich mir nie ausgedacht.
MickyT

6

Brain-Flak , 68 Bytes

({({({})({}[()])}{}<>)<>})<>({<(({}){}<>[({})])>(){[()](<{}>)}{}<>})

Probieren Sie es online!

Verwendet die Beobachtung in der Antwort von user202729.

 {                      }      for each input number
   {({})({}[()])}{}            compute the square
  (                <>)<>       push onto second stack
(                        )     push sum of squares onto first stack
                          <>   move to second stack

 {                                    }    for each square
   (({}){}<>[({})])                        compute 2 * this square - sum of squares
  <                >(){[()](<{}>)}{}<>     evaluate loop iteration as 1 iff equal
(                                      )   push 1 if any squares matched, 0 otherwise


4

MATL , 7 Bytes

SU&0)s=

Probieren Sie es online!

Erläuterung

Betrachten Sie die Eingabe [12, 37, 35].

S     % Implicit input. Sort
      % [12, 35, 37]
U     % Square each entry
      % [144, 1225, 1369]
&0)   % Push last entry and remaining entries
      % STACK: 1369, [144, 1225]
s     % Sum of array
      % STACK: 1369, 1369
=     % Isequal? Implicit display
      % STACK: 1

4

Python 2 , 43 Bytes

lambda a,b,c:(a*a+b*b+c*c)/2in(a*a,b*b,c*c)

Probieren Sie es online!

Python 2 , 79 70 68 62 Bytes

lambda*l:any(A*A+B*B==C*C for A,B,C in zip(l,l[1:]+l,l[2:]+l))

Probieren Sie es online!


Die Abfrage wurde aktualisiert, um Eingaben auf ganze Zahlen zu beschränken.
Martin Ender


14
A*Aist kürzer ...
Socratic Phoenix


@ mdahmoune 67 Bytes ; Die Bedeutungen des Wahrheitswerts umdrehen und -stattdessen verwenden ==.
Jonathan Frech

4

C  68  54 Bytes

Verwenden der Lösung von user202729 .

f(a,b,c){return!((a*=a)+(b*=b)-(c*=c)&&a-b+c&&a-b-c);}

Vielen Dank an @Christoph fürs Golfen mit 14 Bytes!

Probieren Sie es online!

C 85 Bytes

#define C(a,b,c)if(a*a+b*b==c*c)return 1;
f(a,b,c){C(a,b,c)C(b,c,a)C(c,a,b)return 0;}

Probieren Sie es online!


Ausgaben 1für Parameter, von 1, 1, 1denen falsch ist ...
Neil

@Neil Es ist jetzt behoben.
Steadybox

Die Frage wurde aktualisiert, um Ints zu verwenden. Möglicherweise werden einige Bytes gespart.
corsiKa

f(a,b,c){a=!((a*=a)+(b*=b)-(c*=c)&&a-b+c&&a-b-c);}
Christoph


4

J, 10 Bytes

-6 Bytes dank FrownyFrog

=`+/@\:~*:

ursprüngliche Antwort

(+/@}:={:)@/:~*:

/:Sortiere die Quadrate *:und überprüfe dann, ob die Summe der ersten beiden +/@}:gleich der letzten ist{:

Probieren Sie es online!


das ist verdammt schlau
Jonah

4

Dreieckigkeit ,  49  31 Bytes

...)...
..IEO..
.M)2s^.
}Re+=..

Probieren Sie es online!

Erläuterung

Jedes Triangularity-Programm muss eine dreieckige Polsterung haben (entschuldigen Sie das Wortspiel). Das heißt, die i- te Zeile, die vom Ende des Programms an gezählt wird, muss auf jeder Seite mit i-1 Punkten ( .) aufgefüllt werden . Um die Punktdreiecke symmetrisch und ästhetisch ansprechend zu halten, muss jede Zeile aus 2L - 1 Zeichen bestehen, wobei L die Anzahl der Zeilen im Programm ist. Gehen Sie wie folgt vor, um die Zeichen zu entfernen, aus denen das erforderliche Auffüllen besteht:

)IEOM)2s^}Re+=     Full program. Input: STDIN, Output: STDOUT, either 1 or 0.
)                  Pushes a zero onto the stack.
 IE                Evaluates the input at that index.
   O               Sorts the ToS (Top of the Stack).
    M)2s^}         Runs the block )2s^ on a separate stack, thus squaring each.
          R        Reverse.
           e       Dump the contents separately onto the stack.
            +      Add the top two items.
             =     Check if their sum is equal to the other entry on the stack (c^2).

Überprüfung, ob ein Dreieck in der Dreiecksform rechtwinklig ist ...


3

PowerShell , 39 Byte

$a,$b,$c=$args|sort;$a*$a+$b*$b-eq$c*$c

Probieren Sie es online!

Sortiert die Eingabe und speichert diese in $a,$b,$cVariablen. Verwendet dann den Satz von Pythagoras, um zu prüfen, ob a*a + b*b = c*c. Die Ausgabe ist entweder Boolean Trueoder False.


3

JavaScript 34 Bytes (ohne D =)

D=(d,[a,b,c]=d.sort())=>a*a+b*b==c*c

console.log(D([5, 3, 4       ])== true)
console.log(D([3, 5, 4       ])== true)
console.log(D([12, 37, 35    ])== true)
console.log(D([21, 38, 5     ])== false)
console.log(D([210, 308, 15  ])== false)


Ich hatte eine ähnliche Antwort bei 34: a=>a.sort()[0]**2+a[1]**2==a[2]**2in ES6. Also Requisiten an dich @DanielIndie
WallyWest

1
sort()Verwendet leider die lexikografische Reihenfolge, wenn kein Rückruf bereitgestellt wird, wodurch dieser Code beispielsweise für fehlschlägt [10,6,8].
Arnauld

3

RProgN 2 , 10 Bytes

§²2^r]‘\+e

Erklärt

§²2^r]‘\+e
§           # Sort the input list
 ²2^r       # Square each element in the list.
     ]      # Duplicate it on the reg stack.
      ‘     # Pop the top (largest) element off it
       \+   # Swap it, sum the rest of the list.
         e  # Are they equal?

Probieren Sie es online!


Warum die Liste duplizieren?
Mdahmoune

@mdahmoune RProgN2 behält nicht die ursprüngliche Liste auf dem Stapel bei, wenn ein Element von ihm entfernt wird, sondern die Stapel beziehen sich auf den Referenzwert. Damit der Stapel den gesamten Teil davon übernimmt, muss er zuerst dupliziert werden.
ATaco

Thanx upvote;)
mdahmoune

3

Schläger , 64 60 Bytes

(λ(a b c)(=(+(* a a)(* b b)(* c c))(*(expt(max a b c)2)2)))

Probieren Sie es online!

Wie es funktioniert

Prüft , ob a^2 + b^2 + c^2gleich zweimal den größten a^2, b^2und c^2.

Gibt #tfür rechtwinklige Dreiecke und #ffür alle anderen Eingaben zurück.


  • -4 Bytes dank @ xnors Verwendungsvorschlag expt.

Super;) aber ich denke, (define funmuss ein Teil des Codes sein ...
mdahmoune

Danke! Ich finde es konventionell zu sagen, dass reine Funktionen als Antworten erlaubt sind. Der (define fun ...)on TIO dient nur der Bequemlichkeit: Wir könnten diese Funktion genauso gut verwenden wie die Funktion (... 3 4 5)where ...is the function. (Also könnten wir einen Kopf- (print (und einen Fußbereich von haben, 3 4 5))wenn Sie es vorziehen.)
Misha Lavrov

(Aber dies ist einer meiner ersten Schlägerbeiträge, daher ist mir nicht klar, welche schlägerspezifischen Konventionen es gibt. Einige frühere Lösungen, die Racket verwenden, sind #lang racketim Code enthalten, andere nicht.)
Mischa Lawrow

1
Der Schläger ist so wortreich, dass es kürzer ist, ihn zu wiederholen, (max a b c)als eine letBindung zu machen, oder? Ich nehme nicht an, dass es kürzer wäre, als Argument an ein λ? Zu binden . Oder ist keine Potenzierung eingebaut?
Xnor

2
@ Mischa Lawrow Wie wäre es dann (*(expt(max a b c)2)2)?
Xnor

3

05AB1E , 6 Bytes

n{R`+Q

Probieren Sie es online!


Das erste Beispiel erkennt nicht, dass [1,1,1] keine gültige Eingabe ist (häufiges Problem bei einigen anderen Versuchen), das zweite Beispiel funktioniert jedoch einwandfrei.
Nick Loughlin

@ NickLoughlin Ups, erstes Beispiel entfernt
Okx

Sie könnten tun n{RÆ_, um ein Byte zu speichern.
Emigna

3

Ruby, 31 Bytes

->a{a,b,c=*a.sort;a*a+b*b==c*c}

Nimmt die Eingabe als Liste mit 3 ganzen Zahlen. Verwendet einige Ideen aus anderen Lösungen.


Ich habe gerade festgestellt, dass die Antwort, die ich gerade gepostet habe, fast mit Ihrer identisch ist. Ich verspreche, dass ich Ihre nicht kopiert habe (ich hatte sie tatsächlich eine Weile im Feld "Antwort posten"), aber da Ihre zuerst eingereicht wurde, werde ich sie löschen, wenn Sie der Meinung sind, dass meine zu eng ist.
iamnotmaynard

@iamnotmaynard Es ist so ziemlich dasselbe. das war ein lustiger zufall lol. Vielen Dank für
Ihre Nachricht

Fügen Sie nach Möglichkeit einen Link zu einer Online-Testumgebung hinzu, damit andere Benutzer Ihren Code ausprobieren können!
Mdahmoune

3

Julia 0,6 , 16 Bytes

!x=xx2x.*x

Probieren Sie es online!

Wie es funktioniert

Sei x = [a, b, c] .

x⋅xist das Skalarprodukt von x und sich selbst, also ergibt es a² + b² + c² .

2x.*xist das elementweise Produkt von 2x und x , es ergibt sich also [2a², 2b², 2c²] .

Schließlich wird geprüft, ob die ganze Zahl a² + b² + c² zum Vektor [2a², 2b², 2c²] gehört , was zutrifft, wenn
a² + b² + c² = 2a² oder a² + b² + c² = 2b² oder a² + b² + c² = 2c² Dies gilt für
b² + c² = a² oder a² + c² = b² oder a² + b² = c² .



3

TI-Basic, 13 11 10 Bytes

max(Ans=R►Pr(min(Ans),median(Ans

Funktioniert jetzt für Eingaben in beliebiger Reihenfolge und ist auch kürzer. Noch ein -1 dank @MishaLavrov


Fügen Sie nach Möglichkeit einen Link zu einer Online-Testumgebung hinzu, damit andere Benutzer Ihren Code ausprobieren können!
Mdahmoune

Dies ist nur erkennt sortiert rechtwinklige Dreiecke: Eingang A=5, B=4, C=3wäre nicht richtig behandelt werden.
Mischa Lawrow

@MishaLavrov Danke für den Hinweis, es ist eigentlich eine kürzere Behandlung als eine Liste. Jetzt funktioniert es für Eingaben in beliebiger Reihenfolge.
Timtech

Wenn wir ein einzelnes weglassen ), max(Ans=R►Pr(min(Ans),median(Ansgilt dies auch (obwohl die Berechnung hier anders ist) und ist ein Byte kürzer.
Mischa Lawrow

@ Mischa Lawrow Das ist interessant, ich verstehe, was du meinst. Ich denke, die Ausdrücke sind für alle nicht negativen Eingaben gleich.
Timtech

3

CJam, 9

q~$W%~mh=

Probieren Sie es online aus

Erläuterung:

q~      read and evaluate the input (given as an array)
$W%     sort and reverse the array
~       dump the array on the stack
mh      get the hypotenuse of a right triangle with the given 2 short sides
=       compare with the longer side

Einige Erklärungen;)?
Mdahmoune

@ mdahmoune hier gehen Sie
aditsu

Verdammt noch mal. Hast du diese Sprache nicht geschrieben? Scheint nicht fair. (Witz)
kaine

3

Pari / GP , 29 24 Bytes

f(v)=v~==2*vecmax(v)^2

Probieren Sie es online!

Fünf Bytes gespart durch eine offensichtliche Änderung von norml2(v)nach v*v~.

Inspiriert von anderen Antworten.

Hier vmuss ein Zeilenvektor oder ein Spaltenvektor mit drei Koordinaten sein.

Anwendungsbeispiel: f([3,4,5])

Natürlich bekommen Sie zum Beispiel rationale Seitenlängen gratis dazu f([29/6, 10/3, 7/2]).

Wenn ich den f(v)=Teil nicht zähle , sind das 19 Bytes. Der erste Teil kann auch geschrieben werden v->(insgesamt 22 Bytes).

Erläuterung: Wenn die drei Koordinaten vsind x, yund zdann das Produkt vund seine transponieren v~gibt einen Skalar x^2+y^2+^z^2, und wir müssen prüfen , ob das zweimal gleich dem Quadrat des Maximums der Koordinaten ist x, y, z.

Extra: Dieselben fTests für ein pythagoreisches Quadruple, wenn Ihr Eingabevektor vier Koordinaten hat, und so weiter.


Fügen Sie nach Möglichkeit einen Link zu einer Online-Testumgebung hinzu, damit andere Benutzer Ihren Code ausprobieren können!
mdahmoune

@mdahmoune Du kannst diesen tio.runLink benutzen . Es ist jedoch viel angenehmer, PARI / GP nur lokal zu installieren .
Jeppe Stig Nielsen

3

MS Excel, 49 Bytes

Anonyme Arbeitsblattfunktion, die Eingaben aus dem Bereich [A1: C1] entgegennimmt und an die aufrufende Zelle ausgibt.

=OR(A1^2+B1^2=C1^2,B1^2+C1^2=A1^2,A1^2+C1^2=B1^2)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.