Otro desafío fácil para ti.
Tu tarea
Escriba un programa o función que tome la entrada, que contiene 3 pares de coordenadas x e y y calcula el área del triángulo formado dentro de ellos. Para aquellos que no recuerdan cómo calcularlo, lo pueden encontrar aquí .
Ejemplo:
1,2,4,2,3,7 # input as x1,y1,x2,y2,x3,y3
7.5 # output
Véalo en Wolfram Alpha
Algunas consideraciones
- La entrada será seis enteros positivos de base 10.
- Puede suponer que la entrada está en cualquier formato razonable .
- Los puntos siempre formarán un triángulo válido.
- Puede suponer que la entrada ya está almacenada en una variable como
t
. - ¡El código más corto en bytes gana!
Editar: para evitar confusiones, he simplificado cómo se debe tratar la entrada sin poner en peligro ninguno de los códigos actuales.
Recuerde que su programa / función debe generar un área válida, por lo que no puede dar un número negativo como salida
[[1, 2], [4, 2], [3, 7]]
)T
?[1 2;4 2;3 7]
(usando la sintaxis de Julia)?Respuestas:
CJam,
1816 bytesPruébelo en línea en el intérprete de CJam .
Idea
Como se menciona en Wikipedia , el área del triángulo
[[0 0] [x y] [z w]]
se puede calcular como|det([[x y] [z w]])| / 2 = |xw-yz| / 2
.Para un triángulo genérico
[[a b] [c d] [e f]]
, podemos traducir su primer vértice al origen, obteniendo así el triángulo[[0 0] [c-a d-b] [e-a f-b]]
, cuya área puede calcularse mediante la fórmula anterior.Código
fuente
Mathematica, 27 bytes
fuente
Partition[t,2]
, que corresponde al2/
en CJam. ;)JavaScript (ES6) 42
.44.Editar el formato de entrada cambiado, puedo guardar 2 bytes
Una función anónima que toma la matriz como parámetro y devuelve el valor calculado.
Pruebe a ejecutar el fragmento a continuación en un navegador compatible con EcmaScript 6.
fuente
The input will be a vector with six base 10 positive integers.
Julia, 32 bytes
Construye una matriz de los términos apropiados de un producto cruzado, usa
det
para obtener el valor resultante, toma el valor absoluto para tratar con los negativos y luego divide por 2 porque es un triángulo y no un paralelogramo.fuente
Matlab / Octave, 26 bytes
No sabía sobre esto construido hasta ahora =)
fuente
Java,
7988 bytesSolo usa la fórmula básica, nada especial.
Editar: Olvidé tomar el valor absoluto :(
fuente
return(t[0]*(t[3]...
debería ser suficiente, ¿no?Minkolang 0.8 , 34 bytes
¿Alguien quiere un poco de huevo
n0g
?Explicación
Muy sencillo Utiliza la fórmula
|(x2-x1)(y3-y1) - (x3-x1)(y2-y1)|/2
.fuente
JayScript , 58 bytes
Declara una función anónima:
Ejemplo:
fuente
Rubí, 45
fuente
PHP - 68
8889bytes¡Gracias a Martjin por algunos buenos consejos!
Para usarlo, cree un archivo
area.php
con este contenido, la línea adicional cumple con el supuesto de que los datos se guardan en unat
parte variable de las especificaciones, y el ␍ al final agrega un retorno de carro para que la salida sea agradable y separada:Luego proporcione las coordenadas en la línea de comando como
x₁ y₁ x₂ y₂ x₃ y₃
, p. Ej.fuente
t
".$a
->$t
, eliminar$a=$argv;
guardar 9 bytes<?php echo
con<?=
, guardando otros 7 bytesregister_globals=On
en suphp.ini
archivo (predeterminado). Lea más en php.net/manual/en/security.globals.phpPyth,
3430 bytesPruébalo en línea.
Funciona calculando abs (a * (df) + c * (fb) + e * (bd)) / 2 a partir de la entrada a, b, c, d, e, f.
fuente
R, 37 bytes
Convierte el vector de coordenadas en una matriz y las tachuelas en una fila de 1.
Calcula el determinante y divide por 2.
Devuelve el resultado absoluto. Si el pedido fuera siempre en sentido horario
abs
, no sería necesario.fuente
Pitón 2,
484750 bytesMuy simple; sigue la ecuación estándar:
Los otros enfoques, igualmente simples, son más largos:
El acceso de Python a una función determinada es a través de numpy .
Gracias a muddyfish por 1 byte y xnor por detectar un error.
fuente
0
de2.0
a la licencia2.
abs
para que la respuesta sea positiva.PHP, 77
Basado en la respuesta de @Yimin Rong, sentí que podría mejorarlo en unos pocos bytes usando
list()
lugar de directamente$argv
para abreviar algunas variables. tambiénecho
necesita un espacio si hay un delimitador entre echo y la cosa que se está haciendo eco.echo$variable;
,echo(4+2);
` yecho'some string';
son igualmente válidos mientras queechofunction($variable)
confunde PHP.Por otro lado, también agregué
abs()
para ser matemáticamente preciso, ya que algunas combinaciones de vértices produjeron "área negativa"Puedes ejecutarlo a través de CLI
fuente
AWK - 51
42bytesAWK no tiene incorporado, por
abs
lo que usarsqrt(x^2)
para sustituir.Guardar como
area.awk
y usar comoecho x₁ y₁ x₂ y₂ x₃ y₃ | awk -f area.awk
, p. Ej.fuente
PowerShell, 70 bytes
Utiliza la misma fórmula estándar que otras soluciones. Según la pregunta, se supone que la matriz está rellenada previamente, por ejemplo
$t=(1,2,4,2,3,7)
. Pero bueno , ¿la sintaxis$
y[]
mata a este ...fuente
$
y[]
me inspiró a tratar una solución AWK, que, por su longitud, no es poco competitivo!corriente continua , 52 bytes
Asume que la entrada está registrada
t
como:x1 y1 x2 y2 x3 y3
conx1
en la parte superior det
la pila.1 2 4 2 3 7stStStStStSt #puts coordinates into register t (closest thing dc has to variables) 1kLtLtsaLtsbLtdscLtltrlalclbltla-*sd-*se-*leld++2/p 7.5
Esto usa la siguiente fórmula para el área:
(x1(y2-y3) + x2(y3-y1) + x3(y1 - y2))/2
Y para un desglose rápido del proceso:
1k Lt Lt sa Lt sb Lt d sc Lt lt r
: establezca la precisión decimal en 1 lugar, mueva partes de la pilat
a la pila principal y mueva varias partes de la pila principal a otros registros para el almacenamiento (d
duplica la parte superior de la pila principal,r
invierte los dos elementos superiores de la pila principal,L/l
mueve / copia del registro dado a main,s
mueve la parte superior de la pila principal al registro dado)Principal:
y3 x3 y2 x1
a:,
y1
b:,x2
c:,y2
t:y3
la lc lb lt la
: Copiar la parte superior de las pilas de registrosa
,c
,b
,t
, ya
de la chimenea principal en ese ordenPrincipal:
y1 y3 x2 y2 y1 y3 x3 y2 x1
a:,
y1
b:,x2
c:,y2
t:y3
- * sd
: Calcular((y3-y1)*x2)
y el resultado puesto end
(registrosa
,b
,c
, yt
ya no se utilizan de manera voy a soltar desde la lista de las pilas ahora)Principal:
y2 y1 y3 x3 y2 x1
re:
((y3-y1)*x2)
- * se - *
: calcular((y1-y2)*y3)
y((y2-x3)*x1)
; almacenar el primero ene
y dejar el último en la pila principalPrincipal:
((y2-x3)*x1)
d:,
((y3-y1)*x2)
e:((y1-y2)*y3)
le ld + +
: copie la parte superior del registroe
yd
en la pila principal, calcule la suma de los valores de la pila superior 2 (empujando el resultado nuevamente a la pila principal) dos vecesPrincipal:
(((y3-y1)*x2)+((y1-y2)*y3)+((y2-x3)*x1))
d:,
((y3-y1)*x2)
e:((y1-y2)*y3)
2 /
: empuje 2 en la pila principal, divida los 2dos valores en la pila por la 1ra (d
ye
ya no se usan, cayéndolos de la lista de pilas)Principal:
(((y3-y1)*x2)+((y1-y2)*y3)+((y2-x3)*x1))/2
Al reorganizar el valor en la pila, podemos ver que es equivalente a la fórmula en la parte superior de esta explicación:
(x1(y2-y3) + x2(y3-y1) + x3(y1 - y2))/2
p
: Imprime la parte superior de la pila principal para imprimir.fuente