Il mio triangolo è giusto?


47

Data a, b, cla lunghezza dei tre lati di un triangolo, dire se il triangolo è ad angolo retto (cioè ha un angolo uguale a 90 gradi) o no.

Ingresso

Tre valori interi positivi in qualsiasi ordine

Produzione

O una specifica vera uscita ( true, 1, yes, ...) o di una potenza specifica falsa ( false, 0, no, ...)

Esempio

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

Regole

  • L'input e l'output possono essere forniti in qualsiasi formato conveniente .
  • Nel tuo invio, indica i valori vero e falso.
  • Non è necessario gestire valori negativi o triple edge non validi
  • È accettabile un programma completo o una funzione. Se una funzione, è possibile restituire l'output anziché stamparlo.
  • Se possibile, includi un collegamento a un ambiente di test online in modo che altre persone possano provare il tuo codice!
  • Sono vietate le scappatoie standard .
  • Si tratta di quindi si applicano tutte le normali regole del golf e vince il codice più breve (in byte).

1
Dobbiamo gestire valori negativi o triple non validi?
user202729,

2
Molto correlate . Lascio al resto della comunità decidere se è un dup.
Digital Trauma,

2
Penso che l'uso delle coordinate anziché delle lunghezze cambi in modo significativo la sfida
Luis Mendo,

8
Non esiste un triangolo con lunghezze 21, 38, 5, perché 21 + 5 <38 . È un caso patologico intenzionale che dobbiamo gestire?
Kevin,

1
@Kevin no non devi gestire questo caso. User202729 ha già posto questa domanda :)
mdahmoune,

Risposte:


37

Gelatina , 5 byte

²µSHe

Provalo online!

Nota tecnica: i byte vengono contati nella tabella codici Jelly.

Spiegazione:

²µ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)

Il problema equivale a ricevere tre numeri a, b, ce chiedere se esiste una permutazione tale a² + b² = c². Questo equivale al fatto che (a² + b² + c²) ÷ 2sia uno dei due a², b² or c², quindi il programma lo controlla.


bene ... io gelatina.
Félix Gagnon-Grenier,

1
Solo una nota tecnica: simboli ²e µcostano due byte ciascuno in UTF-8, quindi il tuo codice ha in realtà 7 byte, non 5
Charlie,

2
@Charlie Risposta modificata per chiarimenti.
user202729,

20

Python 2 , 37 byte

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

Provalo online!

-2 grazie a FlipTack .
-1 grazie a Craig Gidney .

Output tramite il codice di uscita ( 0= false, 1= true).


Bah. È venuto con la stessa risposta esatta. È possibile modificare la suite di test per consentire un numero qualsiasi di casi di test: vedere qui
mbomb007

@ mbomb007 exec(code)hmmm, perché exec (code)invece di exec code? : D ;-p
Erik the Outgolfer,

Haha, in che modo questa risposta ha il doppio dei voti di quella più corta di xnor? Forse alla gente piace solo la dolce semplicità di esso
FlipTack,

1
@FlipTack ¯_ (ツ) _ / ¯ (anche xnor's non è in Python 2)
Erik the Outgolfer

@EriktheOutgolfer Perché la piastra della caldaia non è la parte da golfare. L'ho fatto in modo che funzionasse in Python 2 o 3.
mbomb007,

17

Java 8, 44 byte

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

Spiegazione:

Provalo qui.

(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)

Funziona senza la parentesi sul (c*=c)? Il *=potrebbe avere precidence sul ==ed è possibile salvare due byte.
corsiKa

@corsiKa Temo sia il contrario. ==ha la precedenza *=. =, +=, *=, Assegnazioni e simili in realtà hanno la precedenza più basso in operatori Java .
Kevin Cruijssen,

Non riesco a trovare nulla di più corto ... Ho provato a scambiare le variabili per assegnare il valore massimo a(ad esempio), senza successo. Beh, potrei farlo, ma circa 65 personaggi ...
Olivier Grégoire il

12

JavaScript (ES6), 43 41 40 byte

Salvato 1 byte e corretto un bug grazie a @Neil

Accetta l'input come una matrice di 3 numeri interi. Restituisce trueper angolo retto e falsealtrimenti.

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


Versione originale, 44 byte

Accetta input come 3 numeri interi. Restituisce 1per angolo retto e 0altrimenti.

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

Casi test


Sembra che abbiamo avuto l'esatto stessa risposta (tranne che per l' =>e ->differenza tra JavaScript e Java 8). ;) Così evidente +1 da parte mia.
Kevin Cruijssen,

>>1non è sicuro, questo vale per [1, 1, 1].
Neil,

2
Che ne dici Math.hypot(...a,...a)==n*2?
Neil,

@Neil Very nice fix :)
Arnauld,

2
@Neil Dovrebbe esserci un ~=operatore per "approssimativamente uguale";)
JollyJoker

12

Python 3 , 37 byte

lambda*l:sum(x*x/2for x in l)**.5in l

Provalo online!

Potrebbe incorrere in problemi di precisione mobile con input di grandi dimensioni.


7

Triangolare , 57 byte

Non ne ho ancora visto nessuno in questa lingua e mi è sembrato appropriato provare a farlo. Ci è voluto un po '... dato che dovevo prima pensarci su e credo che questo possa essere giocato ancora un po'.

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

Provalo online!

Questo si espande al seguente triangolo.

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

Il percorso è piuttosto complicato, ma proverò a spiegare cosa ho fatto. Salto i puntatori direzionali. Gran parte del codice è manipolazione dello stack.

  • $:* Piazza il primo input.
  • $:* Quadrare il secondo input.
  • S":Ug! Verifica se il secondo valore è maggiore del primo.
    • true p" Scambia con il primo.
    • false p Non fare nulla.
  • $:* Quadrare il terzo input.
  • P":USg! Verifica se il terzo valore è maggiore del massimo del precedente.
    • true p+U- somma lo stack corrente e porta via il terzo valore memorizzato
    • falsa p"U+- somma il minimo e terzo memorizzato e sottrazione dal maggiore
  • 0=% verifica l'uguaglianza a zero e il risultato di output.

6

Haskell ( 33 32 31 byte)

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

Versione originale:

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

Funzione anonima. Prende un elenco nel formato [a, b, c]. Output Vero o Falso.

La prima versione ha verificato se la somma dei quadrati era il doppio del quadrato del massimo.

In secondo luogo, la versione leggermente migliore verifica se la metà della somma dei quadrati è un elemento nell'elenco dei quadrati.

Modifica: accidentalmente contato una nuova riga, grazie H.PWiz


1
Benvenuti nel sito! Questa risposta è di soli 32 byte, forse hai contato una nuova riga in più?
H.Piz,

3
È possibile utilizzare la funzione Monad per salvare altri byte qui
H.Pwiz

inoltre, le parentesi sumpossono essere eliminate. bella soluzione!
orgoglioso haskeller il

6

Perl 6 , 24 byte

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

Provalo online!

*²+*²==*²è una funzione anonima che ritorna vera se la somma dei quadrati dei suoi primi due argomenti è uguale al quadrato del suo terzo argomento. Passiamo l'elenco di input ordinato a questa funzione, appiattendolo nell'elenco di argomenti con |.


6

R , 31 26 30 byte

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

Non mi piace così tanto, ma è più corto. Somma le piazze e divide per la piazza più grande. Veramente se 2.

Versione precedente (modificata con cat e con il suggerimento di @ Guiseppe)

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

Fai una somma dell'input ordinato con l'ultimo elemento negato e restituisci il !non.

Provalo online!


Per la versione precedente, !sort(scan())^2%*%c(1,1,-1)è di 27 byte. ma penso che tu abbia ancora bisogno di un cat.
Giuseppe,

Saluti @Guiseppe, dimenticato il gatto. Le regole su REPL mi infastidiscono, ma sono quello che sono.
MickyT

@Giuseppe Piacevole anche la moltiplicazione con la matrice. Non me ne sarei mai inventato.
MickyT

6

Brain-Flak , 68 byte

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

Provalo online!

Utilizza l'osservazione nella risposta di 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 byte

SU&0)s=

Provalo online!

Spiegazione

Considera l'input [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 byte

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

Provalo online!

Python 2 , 79 70 68 62 byte

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

Provalo online!


La sfida è stata aggiornata per limitare gli input agli interi.
Martin Ender,


14
A*Aè più corto ...
Socratic Phoenix,


@mdahmoune 67 byte ; capovolgere i significati del valore di verità e usare al -posto di ==.
Jonathan Frech,

4

C,  68  54 byte

Utilizzando la soluzione di user202729 .

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

Grazie a @Christoph per il golf 14 byte!

Provalo online!

C, 85 byte

#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;}

Provalo online!


Uscite 1per parametri di 1, 1, 1cui è sbagliato ...
Neil,

@Neil Ora è stato risolto.
Steadybox,

La domanda è stata aggiornata per utilizzare gli ints, potrebbe salvare alcuni byte.
corsiKa

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


4

J, 10 byte

-6 byte grazie a FrownyFrog

=`+/@\:~*:

risposta originale

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

/:ordina i quadrati *:, quindi controlla se la somma dei primi due è +/@}:uguale all'ultimo{:

Provalo online!


è tremendamente intelligente
Giona

4

Triangolarità ,  49  31 byte

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

Provalo online!

Spiegazione

Ogni programma di triangolarità deve avere un'imbottitura triangolare (scusate il gioco di parole). Cioè, l' i esimo conteggio linea dal basso del programma deve essere riempito con i - 1 puntini ( .) su ciascun lato. Per mantenere i triangoli a punti simmetrici ed esteticamente gradevoli, ogni riga deve essere composta da 2L - 1 caratteri, dove L è il numero di righe nel programma. Rimozione dei caratteri che compensano il riempimento necessario, ecco come funziona il codice:

)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).

Verifica se un triangolo è rettangolo in Triangularity ...


3

PowerShell , 39 byte

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

Provalo online!

Ordina l'input, lo memorizza in $a,$b,$cvariabili. Quindi utilizza il teorema di Pitagora per verificare se a*a + b*b = c*c. L'output è booleano Trueo False.


3

JavaScript 34 byte (senza 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)


Ho avuto una risposta simile a 34: a=>a.sort()[0]**2+a[1]**2==a[2]**2in ES6. Quindi ti propongo @DanielIndie
WallyWest,

1
Sfortunatamente, sort()usa l'ordine lessicografico quando non viene fornito alcun callback, facendo fallire questo codice per esempio [10,6,8].
Arnauld,

3

RProgN 2 , 10 byte

§²2^r]‘\+e

spiegato

§²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?

Provalo online!


Perché duplicare l'elenco?
mdahmoune,

@mdahmoune RProgN2 non mantiene l'elenco originale nello stack quando si estrae un elemento da esso, ma gli stack sono di riferimento, quindi per mantenere lo stack per fare la somma di esso, è necessario duplicarlo prima.
ATaco,

Thanx upvote;)
mdahmoune,

3

Racchetta , 64 60 byte

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

Provalo online!

Come funziona

Verifica se a^2 + b^2 + c^2è uguale a due volte più grande di a^2, b^2e c^2.

Restituisce #tper i triangoli retti e #fper tutti gli altri input.


  • -4 byte grazie al suggerimento di @ xnor da usare expt.

Fantastico;) ma penso che (define fundebba essere una parte del codice ...
mdahmoune,

Grazie! Penso che sia convenzionale dire che le funzioni pure sono consentite come risposte. L' (define fun ...)on TIO è solo per comodità: potremmo ugualmente bene utilizzare questa funzione come (... 3 4 5)dove ...è la funzione. (Quindi potremmo avere un'intestazione (print (e un piè di pagina 3 4 5))se preferisci.)
Misha Lavrov,

(Ma questa è una delle mie prime presentazioni su Racket, quindi non sono troppo chiaro su quali convenzioni specifiche per Racket ci siano, se ne esistono. Alcune soluzioni passate che usano Racket hanno incluso #lang racketnel codice; altre no.)
Misha Lavrov

1
La racchetta è così prolissa da essere più breve da ripetere (max a b c)che da letlegare, eh? Non credo che sarebbe più breve legarsi come argomento a un λ? Oppure, non c'è un esponenziale incorporato?
xnor

2
@MishaLavrov Allora che ne dici (*(expt(max a b c)2)2)?
xnor

3

05AB1E , 6 byte

n{R`+Q

Provalo online!


Il primo esempio non riesce a rilevare [1,1,1] non è un input valido (problema comune in altri tentativi), ma il secondo funziona correttamente.
Nick Loughlin,

@NickLoughlin Oops, rimosso il primo esempio
Okx

Potresti fare n{RÆ_per salvare un byte.
Emigna,

3

Rubino, 31 byte

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

Prende l'input come un elenco di 3 numeri interi. Utilizza alcune idee di altre soluzioni.


Ho appena realizzato che la risposta che ho appena pubblicato è quasi identica alla tua. Prometto di non aver copiato il tuo (in realtà l'ho fatto sedere per un po 'nella casella "Posta una risposta"), ma poiché il tuo è stato inviato per primo, se pensi che il mio sia troppo vicino, lo eliminerò.
Ripristina Monica iamnotmaynard il

@iamnotmaynard È praticamente la stessa cosa. questa è stata una divertente coincidenza lol. Grazie per
avermelo

Se possibile, includi un link a un ambiente di test online in modo che altre persone possano provare il tuo codice!
mdahmoune,

3

Julia 0.6 , 16 byte

!x=xx2x.*x

Provalo online!

Come funziona

Sia x = [a, b, c] .

x⋅xè il prodotto punto di xe stesso, quindi produce a² + b² + c² .

2x.*xè il prodotto elementare di 2x e x , quindi produce [2a², 2b², 2c²] .

Infine, verifica se il numero intero a² + b² + c² appartiene al vettore [2a², 2b², 2c²] , che è vero sef
a² + b² + c² = 2a² o a² + b² + c² = 2b² o a² + b² + c² = 2c² , che è vero se
if b² + c² = a² o a² + c² = b² o a² + b² = c² .



3

TI-Basic, 13 11 10 byte

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

Ora funziona per gli input in qualsiasi ordine ed è anche più breve. Un altro -1 grazie a @MishaLavrov


Se possibile, includi un collegamento a un ambiente di test online in modo che altre persone possano provare il tuo codice!
mdahmoune,

Questo solo rileva ordinati triangoli rettangoli: ingresso A=5, B=4, C=3non sarebbe gestito correttamente.
Misha Lavrov,

@MishaLavrov Grazie per averlo sottolineato, in realtà è una gestione più breve come elenco. Ora funziona per gli input in qualsiasi ordine.
Timtech,

Se lasciamo fuori un singolo ), allora max(Ans=R►Pr(min(Ans),median(Ansè anche valido (anche se il calcolo che stiamo facendo qui è diverso) ed è più corto di un byte.
Misha Lavrov,

@MishaLavrov È interessante, capisco cosa intendi. Penso che le espressioni siano equivalenti per tutti gli input non negativi.
Timtech,

3

CJam, 9

q~$W%~mh=

Provalo online

Spiegazione:

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

Alcune spiegazioni;)?
mdahmoune,

@mdahmoune ecco qui
aditsu,

Dang it. Non hai scritto quella lingua? Non sembra giusto. (scherzo)
Kaine,

3

Pari / GP , 29 24 byte

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

Provalo online!

Salvati cinque byte con un evidente cambiamento da norml2(v)a v*v~.

Ispirato da altre risposte.

Qui vdeve esserci un vettore di riga o un vettore di colonna con tre coordinate.

Esempio di utilizzo: f([3,4,5])

Naturalmente, ad esempio, ottieni gratuitamente lunghezze laterali razionali f([29/6, 10/3, 7/2]).

Se non conto la f(v)=parte, sono 19 byte. È anche possibile scrivere la prima parte v->(totale 22 byte).

Spiegazione: Se le tre coordinate di vsono x, ye z, quindi il prodotto di ve la sua trasposta v~dà uno scalare x^2+y^2+^z^2, e abbiamo bisogno di controllare se questo è pari al doppio del quadrato del massimo delle coordinate x, y, z.

Extra: gli stessi ftest per una quadrupla pitagorica se il tuo vettore di input ha quattro coordinate e così via.


Se possibile, includi un collegamento a un ambiente di test online in modo che altre persone possano provare il tuo codice!
mdahmoune,

@mdahmoune Puoi usare questo tio.runlink . Tuttavia, è molto più bello installare PARI / GP localmente.
Jeppe Stig Nielsen,

3

MS Excel, 49 byte

Funzione del foglio di lavoro anonima che accetta input dall'intervallo [A1: C1] e li invia alla cella chiamante.

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.