Triangle Area Side Side Side


17

Dati tre lati di un triangolo, stampare l'area di questo triangolo.

Casi test:

In: 2,3,4

Fuori: 2.90473750965556

In: 3,4,5

Fuori: 6

Supponiamo che i tre lati a, b, c siano sempre a> 0, b> 0, c> 0, a + b> c, b + c> a, c + a> b.

Risposte:


6

J, 23 19 caratteri

   (4%~2%:[:*/+/-0,+:)

   (4%~2%:[:*/+/-0,+:) 2 3 4
2.90474

   (4%~2%:[:*/+/-0,+:) 3,4,5
6

Versione a 17 caratteri se l'input è in i:4%~%:*/(+/,+/-+:)i

versione originale 23 caratteri: (%:@(+/**/@(+/-+:))%4:)


7

21 APL 20

Cattura l'input dello schermo tramite ← ⎕

(×/(+/t÷2)-0,t←⎕)*.5

6

Python 2, 53

t=input()
s=a=sum(t)/2.
for x in t:a*=s-x
print a**.5

Ingresso: 2,3,4

Produzione: 2.90473750966


3
Ho perso molto tempo cercando di trovare una soluzione migliore. Sono convinto che
vada bene

2
@jamylak sia io che entrambi;)
primo

6

Mathematica 23

√Times@@(+##/2-{0,##})&

Solo un commento a parte. Di solito (proviamo) a fornire il codice Mma come funzioni qui. Ad esempio, nel tuo casoSqrt[Tr@#*Times@@(Tr@#-2#)]/4&
Dr. belisarius,

2
28 caratteri, come una funzione (Tr@#Times@@(Tr@#-2#))^.5/4&, o 27 usando una variabile
Dr. belisarius

@belisarius Grazie per il tuo suggerimento.
chyanog,

5

Python 57 byte

a,b,c=input()
s=(a+b+c)*.5
print(s*(s-a)*(s-b)*(s-c))**.5

Usando la formula di Heron .

Esempio di utilizzo:

$ echo 2,3,4 | python triangle-area.py
2.90473750966

$ echo 3,4,5 | python triangle-area.py
6.0

Una variante da 58 byte:

a,b,c=input()
print((a+b+c)*(b+c-a)*(a+c-b)*(a+b-c))**.5/4

Non ho molta familiarità con Python, ma perché la linea 2 *.5invece di /2?
jdstankosky,

@jdstankosky L'operatore di divisione in Python è di default la divisione intera, quindi se la somma di a+b+cè dispari, il risultato sarà errato. Ciò è cambiato in Python 3, sebbene la maggior parte delle proposte di golf siano considerate Python 2.7 se non diversamente specificato (così come le presentazioni di Perl sono considerate 5.10+ e non Perl 6).
primo

3
Si potrebbe semplicemente dire "Python 3" invece di "Python".
Joe Z.

1
@JoeZ. No. Questo è Python 2; in Python 3, input () restituisce una stringa, interrompendo questa soluzione.
Khuldraeseth na'Barya,

4

GolfScript, 38 caratteri

~].~++:d\{2*d\-*}/'"#{'\+'**0.5/4}"'+~

Poiché la domanda non specificava diversamente, ho scelto di lavorare solo su lunghezze intere. I lati devono essere indicati su STDIN separati da spazi.

Esempio:

> 2 3 4
2.9047375096555625

3

K, 23

{sqrt s**/(s:.5*+/x)-x}

Esempio

k){sqrt s**/(s:.5*+/x)-x} 2 3 4
2.904738

3

APL, 23 20 caratteri

{(×/(+/⍵÷2)-0,⍵)*÷2} 2 3 4

Esempio:

> {(×/(+/⍵÷2)-0,⍵)*÷2} 2 3 4
2.90474

3

R: 48 43 caratteri

f=function(...)prod(sum(...)/2-c(0,...))^.5

Usando anche la formula di Heron ma sfruttando la vettorializzazione di R.
Grazie a @flodel per l'idea dei puntini di sospensione.

Uso:

f(2,3,4)
[1] 2.904738
f(3,4,5)
[1] 6

puoi far cadere le parentesi graffe. E si può guadagnare di più utilizzando puntini di sospensione: function(...)prod(sum(...)/2-c(0,...))^.5. O anche function(x)prod(sum(x)/2-c(0,x))^.5se chiami la tua funzione con un vettore.
flodel

@flodel grazie! Non ho pensato ai puntini di sospensione, è carino.
plannapus,

2

Javascript, 88 85

v=prompt().split(/,/g);s=v[0]/2+v[1]/2+v[2]/2;Math.sqrt(s*(s-v[0])*(s-v[1])*(s-v[2]))

Non buono ma divertente :) Anche Airone ... Dimostra l'ingolfabilità di semplici problemi in JS lol

Nota : eseguire dalla console per vedere il risultato.

88-> 85: Rimosso a, be c.


1
Puoi salvare un po 'dividendo solo per 2 una volta. E in realtà non ottieni nulla assegnando alle variabili: (a=v[0])aè più lungo di v[0]v[0].
Peter Taylor,

Se divido per 2 solo una volta, come s=(v[0]+v[1]+v[2])/2con a, b, c = 3,4,5 si tradurrebbe in "345"/2=172.5" and not 6. Improved without a , b` e ccomunque.
tomsmeding

Ah, il meraviglioso sistema di tipi di JavaScript. Ok, s=(-v[0]-v[1]-v[2])/2e cambia l'altro -in +. È un numero pari di termini, quindi si annulla.
Peter Taylor,

2

Mathematica 20 16 o 22 18 byte

Con 4 byte salvati da @swish.

Questo restituisce una risposta esatta:

Area@SSSTriangle@

Esempio

Area@SSSTriangle[2,3,4]

image


Per restituire la risposta in formato decimale, sono richiesti due byte aggiuntivi.

N@Area@SSSTriangle[2,3,4]

2,90,474 mila


La composizione rade un paio di byteArea@*SSSTriangle
swish

@swish Grazie, molto apprezzato.
DavidC,

1

Haskell: 51 (27) personaggi

readLn>>=(\l->print$sqrt$product$map(sum l/2-)$0:l)

Un'implementazione molto diretta della formula di Heron. Esempio di esecuzione:

Prelude> readLn>>=(\l->print$sqrt$product$map(sum l/2-)$0:l)
[2,3,4]
2.9047375096555625
Prelude>

Si noti che accetta qualsiasi input numerico, non solo numeri interi. E se l'input è già in l, la soluzione deve contenere solo 36 caratteri e se non siamo interessati a stampare la risposta, la soluzione deve contenere solo 30 caratteri. Inoltre, se possiamo permetterci di cambiare il formato di input, possiamo rimuovere altri 3 caratteri. Quindi se il nostro input sembra [2,3,4,0,0] ed è già in l possiamo ottenere la nostra risposta solo con:

sqrt$product$map(sum l/2-)l

Esempio di esecuzione:

Prelude> let l = [2,3,4,0.0]
Prelude> sqrt$product$map(sum l/2-)l
2.9047375096555625
Prelude>

1

PHP, 78 77

<?=sqrt(($s=array_sum($c=fgetcsv(STDIN))/2)*($s-$c[0])*($s-$c[1])*$s-=$c[2]);

Uso:

php triangle.php
2,3,4

Produzione: 2.9047375096556

Non penso di poterlo abbreviare? Sono ancora nuovo al golf. Qualcuno mi faccia sapere se ho trascurato qualcosa.

Grazie Primo per avermi salvato 1 byte, lol.


1
Il finale ($s-$c[2])può essere sostituito con $s-=$c[2]per un byte, ma è tutto ciò che posso vedere.
primo

@primo Grazie amico!
jdstankosky,

1

JavaScript (84 86 )

s=(eval('abc '.split('').join('=prompt()|0;'))+a+b)/2;Math.sqrt(s*(s-a)*(s-b)*(s-c))

Un'altra soluzione JavaScript basata sulla formula di Heron, ma cercando un approccio diverso per il caricamento delle variabili. Deve essere eseguito dalla console. Ogni lato è inserito in un prompt separato.

EDIT : Usa il valore di ritorno di evalper salvare 2 caratteri. Batte @tomsmeding, wahoo! :)


1

Excel, 42 byte

Basato sulla formula di Heron, l'algebra delle scuole superiori al golf.

=SQRT(((A1+B1)^2-C1^2)*(C1^2-(A1-B1)^2))/4

Ungolfed / Unalgebra'ed

=SQRT((A1+B1+C1)/2*(((A1+B1+C1)/2)-A1)*(((A1+B1+C1)/2)-B1)*(((A1+B1+C1)/2)-C1))

1

Japt , 17 16 15 byte

½*Nx
NmnU ×*U q

Provalo

Salvato 2 byte grazie all'ETH che indica una nuova riga ridondante e alcuni modi alternativi per ridurre l'array.


Penso che si possa utilizzare uno di questi per la seconda linea, anche: NmnU ×*U q, NmnU r*U q,Np0 mnU ×q
ETHproductions

1

Tcl, 74 caratteri.

proc R {a b c} {set s ($a+$b+$c)/2.
expr sqrt($s*($s-$a)*($s-$b)*($s-$c))}

Passa i lati come argomento.

Per l'input 2 3 4il valore di sè (2+3+4)/2.come stringa. Doppia valutazione FTW.


Come proc, si estende a soli 81 byte: tio.run/##NYo7CoAwEAV7T/…
sergiol

1

Julia 0.6.0, 48 byte

Fondamentalmente la formula dell'airone:

f(a,b,c)=(p=(a+b+c)/2;sqrt(p*(p-a)*(p-b)*(p-c)))

1

TI-BASIC, 14 12 byte

4⁻¹√(sum(Ansprod(sum(Ans)-2Ans

A partire da una formula di Heron's Formula scritta da Kenneth Hammond (Weregoose) , ho giocato a golf due byte. Si noti che TI-BASIC è tokenizzato e ogni token, come Anse prod(, è uno o due byte nella memoria della calcolatrice.

Immettere tramite Ansie nella forma {a,b,c}:[program name].

Ha spiegato:

                   sum(Ans)-2*Ans   (a+b+c)-2{a,b,c}={b+c-a,c+a-b,a+b-c}
          Ans*prod(                 {a,b,c}*(b+c-a)(c+a-b)(a+b-c)
      sum(                          (a+b+c)(b+c-a)(c+a-b)(a+b-c)
4⁻¹*√(                              √((a+b+c)(b+c-a)(c+a-b)(a+b-c)/16)
                                    =√(s(s-a)(s-b)(s-c))

L'ho convertito in un wiki della comunità in quanto non è opera tua. Non abbiamo davvero un solido consenso su questo, ma sentiti libero di soppesare qui se non sei d'accordo con la mia decisione.
Martin Ender,



0
#include<stdio.h>
#include<math.h>
main()
{
  double a,b,c,s,area;
  scanf("%d %d %d" &a,&b,&c);
  s=sqrt((a*a)+(b*b)+(c*c));
  area=[sqrt(s*(s-a)*(s-b)*(s-c))]/2;
}

Ciao iam principiante della programmazione, se qualche errore mi suggerisce.
Sharath,

Benvenuto in CodeGolf. Dovresti prima verificare che il programma funzioni e in qualche modo genera il risultato. Ci sono alcuni semplici bug in questo.
ugoren,




0

APL (NARS), 16 caratteri, 32 byte

{√×/(+/⍵÷2)-0,⍵}

Bisogna convertire la formula Erone se a, b, c sono lati del triangolo

p   =(a+b+c)/2 
Area=√p*(p-a)(p-b)(p-c)

al linguaggio APL ... test

  f←{√×/(+/⍵÷2)-0,⍵}
  f 2 3 4
2.90473751
  f 3 4 5
6
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.