El reto
Este desafío es muy sencillo. Dados cuatro puntos tridimensionales, calcule el área de superficie del tetraedro que forman. Este es el código de golf , por lo que gana el código más corto. Se aplican las lagunas estándar, con la estipulación adicional de que cualquier función incorporada para realizar esta tarea tiene cuatro puntos prohibidos.
Puede suponer que los cuatro puntos serán distintos y se otorgarán a través de STDIN, 1 punto por línea. Cada punto constará de tres enteros sin signo de 16 bits. El formato exacto de cada punto se puede modificar si facilita las cosas, como tres enteros separados por espacios. Sin embargo, es obligatorio tener cada punto en una línea separada. La salida debe ser a través de STDOUT, con al menos 2 decimales.
Para aquellos de ustedes que no saben, un tetraedro es un sólido tridimensional, formado por 4 caras triangulares.
Ejemplo
# input (format is up to you, see clarification above)
[23822, 47484, 57901]
[3305, 23847, 42159]
[19804, 11366, 14013]
[52278, 28626, 52757]
# output
2932496435.95
Por favor, deje una nota si nota que mis matemáticas están mal.
[[list],[of],[lists]]
?Respuestas:
Python,
198178161caracteresEl formato de entrada es el que figura en la pregunta.
Calcula la longitud de los bordes adyacentes a cada una de las caras y luego usa la fórmula de Heron .
fuente
Matlab / Octave 103
Supongo que los valores se almacenarán en la variable
c
. Esto utiliza el hecho de que el área de un triángulo es la mitad de la longitud del producto transversal de dos de sus vectores laterales.fuente
Input[]
Input[]
,InputString[]
,Import[]
, yImportString[]
.APL, 59
Funciona calculando productos cruzados
Explicación
La primera línea define una función que toma dos argumentos (implícitamente llamado
⍺
y⍵
), implícitamente espera que sean matrices numéricas de longitud 3, los trata como vectores 3d y calcula la magnitud al cuadrado de su producto cruzado.La segunda línea hace el resto.
fuente
Python 3,
308 298 292 279 258254Esto usa:
fuente
for i in">"*4
es inteligentex**0.5
, en lugar demath.sqrt(x)
.def a(t,u,v)
en una sola línea, así:def a(t,u,v):w=(t+u+v)/2;return(w*(w-t)*(w-u)*(w-v))**0.5
.Mathematica
168154Esto encuentra las longitudes de los bordes del tetraedro y usa la fórmula de Heron para determinar las áreas de las caras.
Hay una ruta más directa que requiere solo 60 caracteres , pero viola las reglas en la medida en que calcula el área de cada cara con una función incorporada
Area
:fuente
Sabio - 103
La parte de lectura de entrada está adaptada de la respuesta de Keith Randall .
fuente
Python - 260
No estoy seguro de cuál es la etiqueta al publicar respuestas a sus propias preguntas, pero ella es mi solución, que utilicé para verificar mi ejemplo: golf:
Utiliza el mismo procedimiento que laurencevs.
fuente
r=range
.lambda
es más corto quedef
.math.sqrt
puede ser sustituido por(…)**.5
.p=copy.copy(P);p.pop(j);
se puede acortar ap=P[:j-1]+P[j:]
.A
solo se usa una vez.C, 303
Excluyendo espacios en blanco innecesarios. Sin embargo, todavía hay mucho golf por hacer aquí (intentaré volver y hacerlo más tarde). Es la primera vez que declaro un
for
bucle en un#define
. Siempre he encontrado formas de minimizar el número de bucles antes.Tuve que cambiar de
float
adouble
para obtener la misma respuesta que el OP para el caso de prueba. Antes de eso, era una ronda 300.scanf
funciona igual si separa su entrada con espacios o líneas nuevas, por lo que puede formatearla en tantas o tan pocas líneas como desee.fuente