Le défi
Ce défi est très simple. Étant donné quatre points tridimensionnels, calculez la surface du tétraèdre qu'ils forment. C'est le code-golf , donc le code le plus court l'emporte. Les lacunes standard s'appliquent, avec la stipulation supplémentaire que toute fonction intégrée pour effectuer cette tâche étant donné quatre points est interdite.
Vous pouvez supposer que les quatre points seront distincts et seront donnés via STDIN, 1 point par ligne. Chaque point sera composé de trois entiers non signés 16 bits. Le format exact de chaque point peut être modifié si cela facilite les choses, comme trois entiers séparés par des espaces. Cependant, avoir chaque point sur une ligne distincte est obligatoire. La sortie doit être via STDOUT, à au moins 2 décimales.
Pour ceux d'entre vous qui ne connaissent pas, un tétraèdre est un solide tridimensionnel, formé de 4 faces triangulaires.
Exemple
# input (format is up to you, see clarification above)
[23822, 47484, 57901]
[3305, 23847, 42159]
[19804, 11366, 14013]
[52278, 28626, 52757]
# output
2932496435.95
Veuillez laisser une note si vous remarquez que mes calculs sont erronés.
[[list],[of],[lists]]
?Réponses:
Python,
198 178161 161 caractèresLe format d'entrée est celui indiqué dans la question.
Il calcule la longueur des bords adjacents à chacune des faces, puis utilise la formule de Heron .
la source
Matlab / Octave 103
Je suppose que les valeurs doivent être stockées dans la variable
c
. Cela utilise le fait que l'aire d'un triangle est la demi-longueur du produit croisé de deux de ses vecteurs latéraux.la source
Input[]
Input[]
,InputString[]
,Import[]
etImportString[]
.APL, 59
Fonctionne en calculant des produits croisés
Explication
La première ligne définit une fonction qui prend deux arguments (implicite nommé
⍺
et⍵
), s'attend implicitement à ce qu'ils soient des tableaux numériques de longueur 3, les traite comme des vecteurs 3D et calcule la magnitude au carré de leur produit croisé.La deuxième ligne fait le reste.
la source
Python 3,
308 298 292 279 258254Cela utilise:
la source
for i in">"*4
est intelligentx**0.5
lieu demath.sqrt(x)
.def a(t,u,v)
sur une ligne comme ceci:def a(t,u,v):w=(t+u+v)/2;return(w*(w-t)*(w-u)*(w-v))**0.5
.Mathematica
168154Cela trouve les longueurs des bords du tétraèdre et utilise la formule de Heron pour déterminer les zones des faces.
Il existe un itinéraire plus direct qui ne nécessite que 60 caractères , mais il viole les règles dans la mesure où il calcule l'aire de chaque face avec une fonction intégrée
Area
,:la source
Sauge - 103
La partie lecture-entrée est adaptée de la réponse de Keith Randall .
la source
Python - 260
Je ne sais pas quelle est l'étiquette sur l'affichage des réponses à vos propres questions, mais elle est ma solution, que j'ai utilisée pour vérifier mon exemple, a joué au golf:
Il utilise la même procédure que laurencevs.
la source
r=range
.lambda
est plus court quedef
.math.sqrt
peut être remplacé par(…)**.5
.p=copy.copy(P);p.pop(j);
peut être raccourcip=P[:j-1]+P[j:]
.A
n'est utilisé qu'une seule fois.C, 303
À l'exclusion des espaces inutiles. Cependant, il y a encore beaucoup de golf à faire ici (j'essaierai de revenir et de le faire plus tard.) C'est la première fois que je déclare une
for
boucle dans un#define
. J'ai toujours trouvé des moyens de minimiser le nombre de boucles auparavant.J'ai dû changer de
float
pourdouble
obtenir la même réponse que l'OP pour le cas de test. Avant cela, c'était un round 300.scanf
fonctionne de la même manière si vous séparez votre entrée par des espaces ou des sauts de ligne, vous pouvez donc la formater en autant de lignes que vous le souhaitez.la source