Dreiecksbereich Seite Seite Seite

17

Bei drei Seiten eines Dreiecks wird der Bereich dieses Dreiecks gedruckt.

Testfälle:

In: 2,3,4

Out: 2.90473750965556

In: 3,4,5

Aus: 6

Angenommen, die drei Seiten a, b, c sind immer a> 0, b> 0, c> 0, a + b> c, b + c> a, c + a> b.

Chyanog
quelle

Antworten:

6

J, 23 19 Zeichen

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

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

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

17-Zeichen-Version bei Eingabe in i:4%~%:*/(+/,+/-+:)i

Originalversion mit 23 Zeichen: (%:@(+/**/@(+/-+:))%4:)

randomra
quelle
7

APL 21 20

Übernimmt die Bildschirmeingabe über ← ⎕

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

Python 2, 53

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

Eingang: 2,3,4

Ausgabe: 2.90473750966

Flornbeben
quelle
3
Ich habe viel Zeit damit verschwendet, eine bessere Lösung zu finden. Ich bin überzeugt, das ist so gut wie es nur geht
jamylak
2
@ Jamylak Sie und ich beide;)
Primo
6

Mathematica 23

√Times@@(+##/2-{0,##})&
Chyanog
quelle
Nur eine Bemerkung zur Seite. Wir versuchen (normalerweise), Mma-Code als Funktionen bereitzustellen. Zum Beispiel in Ihrem FallSqrt[Tr@#*Times@@(Tr@#-2#)]/4&
Dr. Belisarius
2
28 Zeichen als Funktion (Tr@#Times@@(Tr@#-2#))^.5/4&oder 27 unter Verwendung einer Variablen
Dr. Belisarius
@belisarius Danke für deinen Vorschlag.
Chyanog
5

Python 57 Bytes

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

Mit Herons Formel .

Beispielnutzung:

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

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

Eine 58-Byte-Variante:

a,b,c=input()
print((a+b+c)*(b+c-a)*(a+c-b)*(a+b-c))**.5/4
primo
quelle
Ich bin mit Python nicht sonderlich vertraut, aber warum ist Linie 2 *.5anstelle von /2?
Jdstankosky
@jdstankosky Der Divisionsoperator in Python ist standardmäßig eine Ganzzahldivision. Wenn also die Summe von a+b+cungerade ist, ist das Ergebnis fehlerhaft. Dies hat sich in Python 3 geändert, obwohl angenommen wird, dass die meisten Golf-Einsendungen Python 2.7 sind, sofern nicht anders angegeben (genau wie bei Perl-Einsendungen 5.10+ und nicht Perl 6).
Primo
3
Sie könnten einfach "Python 3" anstelle von "Python" sagen.
Joe Z.
1
@JoeZ. Nee. Dies ist Python 2; In Python 3 gibt input () eine Zeichenfolge zurück, wodurch diese Lösung beschädigt wird.
Khuldraeseth na'Barya
4

GolfScript, 38 Zeichen

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

Da die Frage nicht anders spezifiziert wurde, habe ich mich entschieden, nur mit ganzzahligen Längen zu arbeiten. Seiten müssen auf STDIN durch Leerzeichen getrennt angegeben werden.

Beispiel:

> 2 3 4
2.9047375096555625
Howard
quelle
3

K, 23

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

Beispiel

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

APL, 23 20 Zeichen

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

Beispiel:

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

R: 48 43 Zeichen

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

Verwenden Sie auch die Formel von Heron, aber nutzen Sie die Vektorisierung von R.
Vielen Dank an @flodel für die Idee der Ellipse.

Verwendung:

f(2,3,4)
[1] 2.904738
f(3,4,5)
[1] 6
Plannapus
quelle
Sie können die geschweiften Klammern fallen lassen. Und Sie können mehr gewinnen durch Auslassungszeichen verwenden: function(...)prod(sum(...)/2-c(0,...))^.5. Oder auch function(x)prod(sum(x)/2-c(0,x))^.5wenn Sie Ihre Funktion mit einem Vektor aufrufen.
Flodel
@flodel danke! Ich habe nicht an die Auslassungspunkte gedacht, das ist schön.
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]))

Nicht gut, aber lustig :) Auch Heron ... Demonstriert die Ungolfbarkeit einfacher Probleme in JS lol

Hinweis : Führen Sie von der Konsole aus, um das Ergebnis zu sehen.

88-> 85: Entfernte a, bund c.

Tomsmeding
quelle
1
Sie können ein wenig sparen, indem Sie nur einmal durch 2 teilen. Und Sie erhalten eigentlich nichts, wenn Sie Variablen zuweisen: (a=v[0])aist länger als v[0]v[0].
Peter Taylor
Wenn ich nur einmal durch 2 dividiere, wie s=(v[0]+v[1]+v[2])/2bei a, b, würde c = 3,4,5 zu "345"/2=172.5" and not 6. Improved without einem , b` und cobwohl führen.
Tomsmeding
Ah, das wunderbare Typensystem von JavaScript. Ok, s=(-v[0]-v[1]-v[2])/2und ändern Sie die andere -zu +. Es ist eine gerade Anzahl von Begriffen, so dass es storniert.
Peter Taylor
2

Mathematica 20 16 oder 22 18 Bytes

Mit 4 Bytes von @swish gespeichert.

Dies gibt eine genaue Antwort zurück:

Area@SSSTriangle@

Beispiel

Area@SSSTriangle[2,3,4]

Bild


Um die Antwort in Dezimalform zurückzugeben, sind zwei zusätzliche Bytes erforderlich.

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

2.90474

DavidC
quelle
Komposition rasiert paar BytesArea@*SSSTriangle
Swish
@swish Danke, sehr geschätzt.
DavidC
1

Haskell: 51 (27) Zeichen

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

Eine sehr einfache Implementierung der Heron-Formel. Beispiellauf:

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

Beachten Sie, dass jede numerische Eingabe akzeptiert wird, nicht nur ganze Zahlen. Und wenn die Eingabe bereits in 1 ist, muss die Lösung nur 36 Zeichen lang sein, und wenn wir nicht daran interessiert sind, die Antwort auszudrucken, muss die Lösung nur 30 Zeichen lang sein. Was mehr ist, wenn wir uns erlauben können, das Eingabeformat zu ändern, können wir 3 weitere Zeichen entfernen. Wenn unsere Eingabe also wie [2,3,4,0.0] aussieht und bereits in l ist, können wir unsere Antwort nur mit Folgendem erhalten:

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

Beispiellauf:

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

PHP, 78 77

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

Verbrauch:

php triangle.php
2,3,4

Ausgabe: 2.9047375096556

Ich glaube nicht, dass ich es kürzer machen kann? Ich bin noch neu im Golfen. Jeder ließ mich wissen, wenn ich etwas übersah.

Danke Primo, dass du mir 1 Byte gespart hast, lol.

jdstankosky
quelle
1
Das Finale ($s-$c[2])kann durch $s-=$c[2]ein Byte ersetzt werden, aber das ist alles, was ich sehen kann.
Primo
@primo Danke, Mann!
Jdstankosky
1

JavaScript (84 86 )

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

Eine weitere JavaScript-Lösung, die auf der Formel von Heron basiert, aber einen anderen Ansatz zum Laden von Variablen ausprobiert. Muss von der Konsole ausgeführt werden. Jede Seite wird in einer separaten Eingabeaufforderung eingegeben.

BEARBEITEN : Verwenden Sie den Rückgabewert von eval, um 2 Zeichen zu speichern. Beats @tomsmeding, wahoo! :)

mellamokb
quelle
1

Excel, 42 Bytes

Basierend auf Herons Formel, High School Algebra bis 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))
Wernisch
quelle
1

Japt , 17 16 15 Bytes

½*Nx
NmnU ×*U q

Probier es aus

2 Bytes gespart dank Hinweis der ETH auf eine redundante Newline und einige alternative Möglichkeiten zur Reduzierung des Arrays.

Zottelig
quelle
Ich denke , dass Sie eines dieser für die zweite Zeile verwenden können, auch: NmnU ×*U q, NmnU r*U q,Np0 mnU ×q
ETHproductions
1

Tcl, 74 Zeichen.

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

Übergeben Sie die Seiten als Argument.

Für die Eingabe 2 3 4des Wertes sist (2+3+4)/2.als String. Doppelte Bewertung FTW.

Johannes Kuhn
quelle
Als procerstreckt sie sich auf nur 81 Bytes tio.run/##NYo7CoAwEAV7T/...
sergiol
1

Julia 0.6.0, 48 Bytes

Grundsätzlich Reiher Formel:

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

TI-BASIC, 14 12 Bytes

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

Ausgehend von einer von Kenneth Hammond (Weregoose) geschriebenen Heron's Formula-Routine spielte ich zwei Bytes Golf. Beachten Sie, dass TI-BASIC tokenisiert ist und jedes Token wie Ansund prod(ein oder zwei Bytes im Speicher des Rechners enthält.

Eingabe über AnszB in das Formular{a,b,c}:[program name] .

Erklärt:

                   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))
Lirtosiast
quelle
Ich habe dies in ein Community-Wiki umgewandelt, da es nicht deine eigene Arbeit ist. Wir sind uns darüber nicht wirklich einig, aber Sie können sich gerne hier äußern , wenn Sie meiner Entscheidung nicht zustimmen.
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;
}
sharath
quelle
Hallo, ich bin Programmieranfänger, wenn Fehler auftauchen, empfehle ich diese.
Sharath
Willkommen bei CodeGolf. Sie sollten zuerst überprüfen, ob das Programm funktioniert und das Ergebnis irgendwie ausgeben. Es gibt einige einfache Fehler in diesem.
Ugoren
0

APL (NARS), 16 Zeichen, 32 Byte

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

Man muss die Erone-Formel umwandeln, wenn a, b, c Seiten des Dreiecks sind

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

zur APL Sprache ... testen

  f←{√×/(+/⍵÷2)-0,⍵}
  f 2 3 4
2.90473751
  f 3 4 5
6
RosLuP
quelle