Outro desafio fácil para você.
Sua tarefa
Escreva um programa ou função que aceite a entrada, que contenha 3 pares de coordenadas xe y e calcule a área do triângulo formado dentro delas. Para aqueles que não conseguem se lembrar de como calculá-lo, você pode encontrá-lo aqui .
Exemplo:
1,2,4,2,3,7 # input as x1,y1,x2,y2,x3,y3
7.5 # output
Veja no Wolfram Alpha
Algumas considerações:
- A entrada será de seis números inteiros positivos da base 10.
- Você pode assumir que a entrada está em qualquer formato razoável .
- Os pontos sempre formarão um triângulo válido.
- Você pode assumir que a entrada já está armazenada em uma variável como
t
. - O código mais curto em bytes vence!
Edit: Para evitar qualquer confusão, simplifiquei como a entrada deve ser tratada sem comprometer nenhum dos códigos atuais.
Lembre-se de que o seu programa / função deve gerar uma área válida, portanto não pode dar um número negativo como saída
[[1, 2], [4, 2], [3, 7]]
)T
?[1 2;4 2;3 7]
(usando a sintaxe de Julia)?Respostas:
CJam,
1816 bytesExperimente online no intérprete CJam .
Idéia
Como mencionado na Wikipedia , a área do triângulo
[[0 0] [x y] [z w]]
pode ser calculada como|det([[x y] [z w]])| / 2 = |xw-yz| / 2
.Para um triângulo genérico
[[a b] [c d] [e f]]
, podemos traduzir seu primeiro vértice para a origem, obtendo assim o triângulo[[0 0] [c-a d-b] [e-a f-b]]
, cuja área pode ser calculada pela fórmula acima.Código
fonte
Mathematica, 27 bytes
fonte
Partition[t,2]
, que corresponde ao2/
CJam. ;)JavaScript (ES6) 42
.44.Editar Formato de entrada alterado, posso salvar 2 bytes
Uma função anônima que toma a matriz como parâmetro e retorna o valor calculado.
Teste a execução do snippet abaixo em um navegador compatível com EcmaScript 6.
fonte
The input will be a vector with six base 10 positive integers.
Julia, 32 bytes
Constrói uma matriz dos termos apropriados de um produto cruzado, usa
det
para obter o valor resultante, assume valor absoluto para lidar com negativos e depois divide por 2 porque é um triângulo e não um paralelogramo.fonte
Matlab / Octave, 26 bytes
Eu não sabia sobre isso construído até agora =)
fonte
Java,
7988 bytesApenas usa a fórmula básica, nada de especial.
Edit: Esqueceu de levar o valor absoluto :(
fonte
return(t[0]*(t[3]...
deveria bastar, não?Tamanho 0.8 , 34 bytes
Alguém quer ovo
n0g
?Explicação
Muito simples. Usa a fórmula
|(x2-x1)(y3-y1) - (x3-x1)(y2-y1)|/2
.fonte
JayScript , 58 bytes
Declara uma função anônima:
Exemplo:
fonte
Ruby, 45
fonte
PHP - 68
8889bytesObrigado a Martjin por ótimas dicas!
Para usá-lo, crie um arquivo
area.php
com esse conteúdo, a linha extra atende ao pressuposto de que os dados são salvos em umat
parte variável das especificações e o ␍ no final adiciona um retorno de carro para que a saída seja agradável e separada:Em seguida, forneça as coordenadas na linha de comando como
x₁ y₁ x₂ y₂ x₃ y₃
, por exemplo,fonte
t
."$a
->$t
, remova$a=$argv;
salvar 9 bytes<?php echo
por<?=
, salvando outros 7 bytesregister_globals=On
no seuphp.ini
arquivo (padrão). Leia mais em php.net/manual/en/security.globals.phpPitão,
3430 bytesExperimente online.
Funciona calculando abs (a * (df) + c * (fb) + e * (bd)) / 2 a partir da entrada a, b, c, d, e, f.
fonte
R, 37 bytes
Converte o vetor de coordenadas em uma matriz e aderência em uma linha de 1's.
Calcula o determinante e divide por 2.
Retorna o resultado absoluto. Se o pedido fosse sempre no sentido horário,
abs
isso não seria necessário.fonte
Python 2,
484750 bytesMuito simples; segue a equação padrão:
As outras abordagens igualmente simples são mais longas:
O acesso do Python a uma função determinada é através de numpy .
Graças a muddyfish para 1 byte e xnor para a captura de um erro.
fonte
0
partir de2.0
para sair #2.
abs
para tornar a resposta positiva.PHP, 77
Com base na resposta de @Yimin Rong, senti que poderia melhorar alguns bytes usando,
list()
ao invés de direto,$argv
abreviar algumas variáveis. Além dissoecho
não precisa de um espaço se houver delimitador entre eco e a coisa que está sendo ecoada.echo$variable;
,echo(4+2);
eecho'some string';
são igualmente válidos enquantoechofunction($variable)
confunde PHP.Por outro lado, também adicionei
abs()
ser matematicamente preciso, pois algumas combinações de vértices geravam "área negativa"Você pode executá-lo via CLI
fonte
AWK - 51
42bytesO AWK não possui built-in,
abs
portanto, use-osqrt(x^2)
para substituir.Salvar como
area.awk
e usar comoecho x₁ y₁ x₂ y₂ x₃ y₃ | awk -f area.awk
, por exemplofonte
PowerShell, 70 bytes
Usa a mesma fórmula padrão que outras soluções. De acordo com a pergunta, assume que a matriz é pré-preenchida, por exemplo
$t=(1,2,4,2,3,7)
. Mas ooof , a sintaxe$
e[]
mata este ...fonte
$
e[]
me inspirou a tentar uma solução AWK que, por extensão, não é competitiva!dc , 52 bytes
Assume que a entrada está registrada
t
como:x1 y1 x2 y2 x3 y3
withx1
no topo dat
pilha.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
Isso usa a seguinte fórmula para a área:
(x1(y2-y3) + x2(y3-y1) + x3(y1 - y2))/2
E para uma rápida análise do processo:
1k Lt Lt sa Lt sb Lt d sc Lt lt r
: defina a precisão decimal como 1 local, mova partes da pilhat
para a pilha principal e mova várias partes da pilha principal para outros registradores para armazenamento (d
duplica o topo da pilha principal,r
inverte os dois principais elementos da pilha principal,L/l
mova / copiar do registro fornecido para main,s
move o topo da pilha principal para o registro fornecido)A Principal:
y3 x3 y2 x1
a:,
y1
b:,x2
c:,y2
t:y3
la lc lb lt la
: Copiar o topo das pilhas em registosa
,c
,b
,t
, ea
para a pilha principal nessa ordemA Principal:
y1 y3 x2 y2 y1 y3 x3 y2 x1
a:,
y1
b:,x2
c:,y2
t:y3
- * sd
: Calcular((y3-y1)*x2)
eo resultado colocar emd
(registrosa
,b
,c
, et
não são mais usados por isso vou deixá-los na lista de pilhas agora)A Principal:
y2 y1 y3 x3 y2 x1
d:
((y3-y1)*x2)
- * se - *
: computação((y1-y2)*y3)
e((y2-x3)*x1)
; armazenar o primeiro eme
e deixe o último na pilha principalA Principal:
((y2-x3)*x1)
d:,
((y3-y1)*x2)
e:((y1-y2)*y3)
le ld + +
: copie o topo do registroe
ed
para a pilha principal, calcule a soma dos 2 principais valores da pilha (retornando o resultado para a pilha principal) duas vezesA Principal:
(((y3-y1)*x2)+((y1-y2)*y3)+((y2-x3)*x1))
d:,
((y3-y1)*x2)
e:((y1-y2)*y3)
2 /
: pressione 2 na pilha principal, divida o 2º valor na pilha pelo 1º (d
ee
não são mais usados, removendo-os da lista de pilhas)A Principal:
(((y3-y1)*x2)+((y1-y2)*y3)+((y2-x3)*x1))/2
Reorganizando o valor na pilha, podemos ver que é equivalente à fórmula na parte superior desta explicação:
(x1(y2-y3) + x2(y3-y1) + x3(y1 - y2))/2
p
: Imprima a parte superior da pilha principal para a saída.fonte