Berechnen Sie bei drei Seitenlängen eines Dreiecks dessen Seitenverhältnis AR mit der folgenden Formel:
woher
Je näher ein Dreieck an der Gleichgewichtsverteilung ist, desto näher ist es an 1
seinem Seitenverhältnis. Das Seitenverhältnis ist größer oder gleich 1
für gültige Dreiecke.
Eingänge
Die Eingabe besteht aus drei reellen positiven Zahlen, die bei Bedarf in eine Liste oder Ähnliches eingeschlossen werden können.
Ihr Programm muss unabhängig von der Reihenfolge, in der die drei Seitenlängen eingegeben werden, denselben Wert ausgeben.
Diese drei Zahlen wird immer gültig sidelengths eines Dreiecks (entarteten Dreiecke wie ein mit sidelengths 1
, 1
und 2
wird nicht als Eingabe gegeben werden). Sie brauchen sich keine Gedanken über Gleitkommaungenauigkeiten zu machen, wenn die Werte einem entarteten Dreieck extrem nahe kommen (z. B. ist es akzeptabel, dass Ihr Programm division by 0
bei der Eingabe Fehler macht [1, 1, 1.9999999999999999]
).
Die Eingabe kann durch STDIN
ein Funktionsargument oder etwas Ähnliches erfolgen.
Ausgänge
Die Ausgabe ist eine reelle Zahl, die größer oder gleich 1
der in Ihrer Sprache akzeptablen Standardgenauigkeit ist.
Die Ausgabe kann auf STDOUT
eine Funktion oder auf eine ähnliche Weise gedruckt oder von dieser zurückgegeben werden.
Testfälle
Inputs Output
1 1 1 1
3 4 5 1.25
42 42 3.14 ≈ 6.9476
14 6 12 1.575
6 12 14 1.575
0.5 0.6 0.7 ≈ 1.09375
Wertung
Das ist Code-Golf , also gewinnt die kürzeste Antwort in Bytes.
quelle
42.0
anstelle von einzugeben42
.0
?Antworten:
Gelee , 6 Bytes
Diese Antwort basiert auf der 05AB1E-Antwort von Emigna . Vielen Dank an Dennis und Lynn für ihre Hilfe, um diese Antwort herauszufinden. Golfvorschläge willkommen! Probieren Sie es online!
Ungolfing
quelle
⁸÷
verliert sich viel aus der Kette als Einheit und sollte so gelesen werden , dass das anfängliche linke Argument durch dieses oder etwas geteilt wird.Gelee , 7 Bytes
Probieren Sie es online!
Erläuterung
Lasst uns diese Kette lesen:
Das implizite Argument ist eine Liste
[a, b, c]
.Zuerst lesen wir
S
. Dies nimmt die Summe:a + b + c
.Dann lesen wir
H
. Dies halbiert es:(a + b + c)/2
. (Dies ists
.)Dann lesen wir eine Dyade
_
(subtrahieren), gefolgt von einer anderen Dyade. Dies ist ein Haken : Es fehlt ein richtiges Argument, so dass es das Argument für diese Kette erhält[a, b, c]
und uns gibt[s-a, s-b, s-c]
. (Dies ist das fünfte Kettenmuster in der Tabelle hier .)Dann lesen wir das Dyad-Monad-Paar
÷@H
. Dies ist eine Gabelung : Wird die÷@
Division mit den Argumenten gespiegelt undH
halbiert, so erhält unser ArbeitswertH
das Argument für diese Kette÷
dadurch. Dies vektorisiert; wir bleiben mit[(a/2)/(s-a), (b/2)/(s-b), (c/2)/(s-c)]
. (Dies ist das zweite Kettenmuster in der Tabelle hier .)Schließlich nehmen wir das Produkt mit
P
und holen es unsabc/(8(s-a)(s-b)(s-c))
.Zeigen Sie ein baumartiges Diagramm an, in dem dargestellt ist, wie die Verknüpfungen zusammenpassen.
quelle
Gelee , 6 Bytes
Probieren Sie es online!
Wie es funktioniert
quelle
³⁴⁵
als Argumente zu verwenden ...JavaScript, 38 Bytes
Dies ist ein ( Curry- ) Lambda:
(Wenn Sie es einer Variablen zuweisen, müssen Sie
f
es wie folgt aufrufenf(3)(4)(5)
)quelle
s = 1/2(a+b+c)
in die Formel einstecken und vereinfachen: D (zBs-a = .5*b+.5*c-.5*a
und die drei Faktoren des.5
8
(a,b,c)=>
ist gleich lang und kostet weniger Bytes;)05AB1E ,
117 Bytes05AB1E verwendet die CP-1252- Codierung.
Probieren Sie es online!
Erläuterung
quelle
MATL ,
87 BytesProbieren Sie es online!
Erläuterung
Verwenden wir
[3 4 5]
als Beispiel die Eingabequelle
R
3429 BytesLiest die Eingabe von stdin und speichert sie als R-Vektor
x
. Verwenden Sie dann die Vektorisierung von R, um den Nenner zu bilden.quelle
Haskell, 36 Bytes
Dies definiert die Funktion,
#
die drei Argumente akzeptiert.Sie müssen es wie folgt aufrufen:
(3#4)5
Ein bisschen länger, aber vielleicht besser zum Golfen:
quelle
MATLAB,
64 3825 BytesDies ist eine beliebige Funktion, die die folgende Formel implementiert:
Es wird angenommen, dass die Eingabe eine Liste von drei Werten ist, z
[3,4,5]
. Dieses Beispiel wird in der folgenden Erläuterung verwendet:quelle
Mathematica, 20 Bytes
Nimmt die Eingabe als eine Liste von drei Werten auf, die als
#
innerhalb der Funktion bezeichnet wird.Tr@
ist der kürzeste Weg, um eine Liste zu summieren (zu erhalten2s
) und1##&@@(...)
die drei Faktoreni/(2s-2i)
füri
in zu multiplizierena, b, c
.Wenn die Eingaben Ganzzahlen oder rationale Zahlen sind, erhalten Sie ein genaues Ergebnis.
quelle
Python 3 , 42 Bytes
Probieren Sie es online!
quelle
OCaml, 51 Bytes
Yay, separate Operatoren für Schwimmer ...
quelle
Wunder , 48 Bytes
RUHE IN FRIEDEN
Verwendung:
Erläuterung
Funktionsaufrufe sind in Wonder im Vergleich zu Infix-Operatoren in anderen Sprachen teuer. Aus diesem Grund habe ich alle Begriffe in einem Array enthalten und das Ergebnis erhalten, anstatt jeden einzelnen Begriff zu multiplizieren. Der Code würde ungefähr so aussehen:
quelle
Eigentlich ,
108 BytesDiese Antwort basiert auf Dennis 'hervorragender Gelee-Antwort . Golfvorschläge willkommen! Probieren Sie es online!
Ungolfing
quelle
Minecraft 1.8, 1607 Bytes + 85 Blöcke = 1692 Blytes
Warnung: Nicht golfen. Golfed nimmt bis zu 1 / 3 weniger blytes.
Hier ist ein kommentierter Screenshot:
Die Eingänge sind
a
,b
undc
und der Ausgang istfin
fin
und alle anderen Variablen in Minecraft sind ganze Zahlen, daher beträgt die Standardgenauigkeit von Minecraft 0 DezimalstellenDer grüne Rand: Die Befehlsblöcke auf der linken Seite werden nach den Befehlsblöcken auf der rechten Seite aktiviert, bei denen es sich nur um variable Initialisierungen handelt.
Der Hebel (grau-braunes Rechteck unten rechts) ist der Apparateauslöser
Es nimmt so viel Zeit in Anspruch, weil Minecraft mit Variablen umgeht . Eine sehr vereinfachte Übersicht:
/scoreboard objectives add name dummy
erstellt eine neue Variable mit dem Namen "name
"/scoreboard players set @p name number
setzt die Variablename
aufnumber
. Zahl muss eine reelle Zahl sein, keine Variable./scoreboard players operation @p name += @p name2
Inkrementename
vonname2
.name2
muss eine Variable sein, keine Zahl.-=
,/=
,*=
,=
Und kann stattdessen verwendet werden ,+=
zu dekrementieren, Multiplizieren, Dividieren, usw.Ich werde hier nicht alle 43 Befehle posten. Es würde mir helfen, Golf zu spielen, aber es würde mir auch helfen, verrücktes Copypasting zu betreiben
Wenn 1.9-Befehlsblöcke verwendet würden, würde die Lösung (mindestens) 42 Blöcke weniger verwenden. Wenn Ein-Buchstaben-Variablen verwendet würden, würden fast 200 Bytes gespeichert.
quelle
Java, 38 Bytes
Testen und ungolfed
Probier es aus!
Ausgabe
quelle
(a,b,c)
hier irgendwie betrogen, weil es keine Typinformationen enthält. IMO sollte die implizite Lambda-Schnittstelle (in Ihrem FallF
) in der Summe der Gesamtbytes zählen.Qualle ,
1716 BytesVielen Dank an Zgarb für das Speichern von 1 Byte.
Probieren Sie es online!
Erläuterung
Dies basiert auf der gleichen reziproken Formel wie Dennis 'Antwort .
In traditionellerer funktionaler Notation lautet das obige Programm wie folgt:
Wo
i
ist die Eingabeliste? Beachten Sie, dassfold(multiply, ...)
nur das Produkt undfold(add, ...)
die Summe berechnet werden , sodass wir dies weiter vereinfachen können, um:Die
sum(i) / i
Implementierung erfolgt über den Hook,)/+
der eine neue unäre Funktion definiert, mit der beide Schritte gleichzeitig ausgeführt werden können.quelle
Dyalog APL ,
109 BytesDies ist ein anonymer Funktionszug (eine Spitze einer Gabel einer Gabel einer Gabel), was bedeutet, dass jede Unterfunktion auf das Argument innerhalb der folgenden Struktur angewendet wird:
TryAPL online!
×/
das Produkt von⊢
die Argumente÷
geteilt durch+/
die Summe der Argumente-
Minus+⍨
die Argumente verdoppelten sichMathematischer Hintergrund.
ngn hat ein Byte rasiert.
quelle
2sable , 6 Bytes
Ein Port von Dennis 'Jelly Antwort .
Verwendet die CP-1252- Codierung. Probieren Sie es online!
quelle
Gleichstrom, 49 Bytes
Eine direkte Umsetzung der angegebenen Formel. Fordert beim Aufruf in drei separaten Zeilen zur Eingabe der drei Eingaben auf und gibt einen Gleitkommawert mit 5 Nachkommastellen zur nächsten Zeile aus.
Erläuterung
quelle
TI-Basic, 11 Bytes
Die Eingabe sollte in Form einer Liste erfolgen
{A B C}
.Vielleicht hilft dieses Bild (denken Sie daran
2s = a+b+c
):quelle
Perl 6 , 44 Bytes
quelle
Python, 55 Bytes
Dank an Dennis . Ich habe gerade portiert. In Python eine viel vernachlässigte Sprache.
quelle
Viertens 83 Bytes
Angenommen, die Gleitkommaparameter beginnen auf dem Gleitkommastapel. Lässt das Ergebnis auf dem Gleitkommastapel. Die Verwendung des Stacks für params / return ist der Standard für Forth.
Online testen - enthält alle Testfälle
Verwendet die Formel
a*b*c * 1/ ( -(a+b-c) * -(b+c-a) * (a+c-b) )
. Fast das gesamte Programm verwendet nur den Gleitkommastapel. Die Ausnahme ist die3
in3 fpick
. Dieses Programm benötigt einen unterstützten Interpreterfpick
(Ideone funktioniert, repl.it nicht).Erklärung: etwas weniger golfen
quelle
ised : 19 Bytes
Nennen wir es als
ised --l 'inputfile.txt' '@*$1/@*{@+$1-2.*$1}'
woinputfile.txt
eine Datei mit Zwischenraum getrennt Array sein kann, oder-
aus Rohr / stdin zu empfangen.Unicode-Version (gleiche Bytecount aber 3 Zeichen weniger):
ised
Verschwendet leider eine Menge Zeichen für die Syntax der Eingabeargumente.quelle
VBA, 76
Mit anrufen
oder in excel mit
quelle
Public Function r(a,b,c):r=a*b*c/(b+c-a)/(a-b+c)/(a+b-c):End Function
82 Bytes
Verwendung:
quelle
Pyke, 12 Bytes
Probieren Sie es hier aus!
Nun, BlueEyedBeast, du hattest deine Chance. Ich habe hier einen guten Algorithmus verwendet .
quelle
k, 19 Bytes
Wertet von rechts nach links aus - Teilen Sie die Liste x durch 2, addieren Sie das Ergebnis und subtrahieren Sie es vom ursprünglichen x. Negieren Sie die Antwort und erhalten Sie das Produkt des Ergebnisses und 8. Das Ergebnis ist der Nenner, der Zähler ist das Produkt der Liste.
quelle
Lua, 45 Bytes
Stark basierend auf der JavaScript-Antwort.
quelle