Die Herausforderung
Diese Herausforderung ist sehr einfach. Berechnen Sie anhand von vier dreidimensionalen Punkten die Oberfläche des Tetraeders, den sie bilden. Das ist Code-Golf , also gewinnt der kürzeste Code. Es gelten Standard-Regelungslücken, mit der zusätzlichen Bedingung, dass jede eingebaute Funktion, die diese Aufgabe mit vier Punkten erfüllt, verboten ist.
Sie können davon ausgehen, dass alle vier Punkte unterschiedlich sind und über STDIN mit 1 Punkt pro Linie angegeben werden. Jeder Punkt besteht aus drei 16-Bit-Ganzzahlen ohne Vorzeichen. Das genaue Format jedes Punkts kann geändert werden, wenn es die Sache einfacher macht, z. B. drei durch Leerzeichen getrennte Ganzzahlen. Es ist jedoch obligatorisch, dass jeder Punkt auf einer eigenen Linie liegt. Die Ausgabe sollte über STDOUT mit mindestens 2 Dezimalstellen erfolgen.
Für diejenigen von euch, die es nicht wissen, ist ein Tetraeder ein 3D-Körper, der aus 4 dreieckigen Flächen besteht.
Beispiel
# input (format is up to you, see clarification above)
[23822, 47484, 57901]
[3305, 23847, 42159]
[19804, 11366, 14013]
[52278, 28626, 52757]
# output
2932496435.95
Bitte hinterlassen Sie eine Nachricht, wenn Sie bemerken, dass meine Mathematik falsch ist.
[[list],[of],[lists]]
?Antworten:
Python,
198 178161 ZeichenDas Eingabeformat ist wie in der Frage angegeben.
Es berechnet die Länge der Kanten, die an die einzelnen Flächen angrenzen, und verwendet dann die Heron-Formel .
quelle
Matlab / Octave 103
Ich gehe davon aus, dass die Werte in der Variablen gespeichert werden
c
. Dies nutzt die Tatsache, dass die Fläche eines Dreiecks die halbe Länge des Kreuzprodukts zweier seiner Seitenvektoren ist.quelle
Input[]
Input[]
,InputString[]
,Import[]
, undImportString[]
.APL, 59
Arbeitet durch Berechnung von Kreuzprodukten
Erläuterung
In der ersten Zeile wird eine Funktion definiert, die zwei Argumente (implicity named
⍺
und⍵
) verwendet, implizit numerische Arrays der Länge 3 erwartet, sie als 3D-Vektoren behandelt und die quadratische Größe ihres Kreuzprodukts berechnet .Die zweite Zeile erledigt den Rest.
quelle
Python 3,
308 298 292 279 258254Dies verwendet:
quelle
for i in">"*4
ist cleverx**0.5
anstelle von verwendenmath.sqrt(x)
.def a(t,u,v)
wie so auf einer Linie:def a(t,u,v):w=(t+u+v)/2;return(w*(w-t)*(w-u)*(w-v))**0.5
.Mathematica
168154Dieser ermittelt die Kantenlängen des Tetraeders und bestimmt anhand der Heronschen Formel die Flächen der Flächen.
Es gibt einen direkteren Weg, der nur 60 Zeichen erfordert , der jedoch gegen die Regeln verstößt, da er die Fläche jedes Gesichts mit einer eingebauten Funktion berechnet
Area
:quelle
Salbei - 103
Der Eingabe-Leseteil ist aus Keith Randalls Antwort adaptiert .
quelle
Python - 260
Ich bin nicht sicher, wie die Etikette beim Posten von Antworten auf Ihre eigenen Fragen lautet, aber sie ist meine Lösung, mit der ich mein Beispiel überprüft habe:
Es wird dasselbe Verfahren angewendet wie bei Laurencevs.
quelle
r=range
.lambda
ist kürzer alsdef
.math.sqrt
kann durch ersetzt werden(…)**.5
.p=copy.copy(P);p.pop(j);
kann auf gekürzt werdenp=P[:j-1]+P[j:]
.A
wird nur einmal verwendet.C 303
Ohne unnötige Leerzeichen. Es gibt hier jedoch noch viel zu golfen (ich werde versuchen, es später noch einmal zu versuchen.) Es ist das erste Mal, dass ich eine
for
Schleife in einer deklariere#define
. Ich habe schon immer Wege gefunden, die Anzahl der Schleifen zu minimieren.Ich hatte von zu ändern ,
float
umdouble
die gleiche Antwort wie die OP für den Testfall zu erhalten. Vorher war es eine Runde 300.scanf
Funktioniert gleichermaßen, unabhängig davon, ob Sie Ihre Eingabe durch Leerzeichen oder Zeilenumbrüche trennen, sodass Sie sie in beliebig viele oder so wenige Zeilen formatieren können.quelle