Еще один легкий вызов для вас.
Твое задание
Напишите программу или функцию, которая принимает входные данные, которая содержит 3 пары x- и y-координат и вычисляет площадь треугольника, образованного внутри них. Для тех, кто не помнит, как рассчитать его, вы можете найти его здесь .
Пример:
1,2,4,2,3,7 # input as x1,y1,x2,y2,x3,y3
7.5 # output
Посмотреть это на Wolfram Alpha
Некоторые соображения:
- Входные данные будут шесть целых 10 положительных чисел.
- Вы можете предположить, что ввод в любом разумном формате .
- Точки всегда образуют правильный треугольник.
- Вы можете предположить, что входные данные уже сохранены в такой переменной, как
t
. - Самый короткий код в байтах побеждает!
Изменить: чтобы избежать путаницы, я упростил, как следует обрабатывать ввод, не ставя под угрозу любой из текущих кодов.
Помните, что ваша программа / функция должна выводить правильную область, поэтому она не может дать отрицательное число в качестве вывода
[[1, 2], [4, 2], [3, 7]]
) вT
?[1 2;4 2;3 7]
(используя синтаксис Юлии)?Ответы:
CJam,
1816 байтовПопробуйте онлайн в интерпретаторе CJam .
идея
Как уже упоминалось в Википедии , площадь треугольника
[[0 0] [x y] [z w]]
может быть рассчитана как|det([[x y] [z w]])| / 2 = |xw-yz| / 2
.Для общего треугольника
[[a b] [c d] [e f]]
мы можем перевести его первую вершину в начало координат, получив таким образом треугольник[[0 0] [c-a d-b] [e-a f-b]]
, площадь которого можно рассчитать по приведенной выше формуле.Код
источник
Mathematica, 27 байт
источник
Partition[t,2]
, что соответствует2/
CJam. ;)JavaScript (ES6) 42,44
.Изменить Формат ввода изменен, я могу сохранить 2 байта
Анонимная функция, которая принимает массив в качестве параметра и возвращает вычисленное значение.
Попробуйте запустить приведенный ниже фрагмент в браузере, совместимом с EcmaScript 6.
источник
The input will be a vector with six base 10 positive integers.
Юлия, 32 байта
Создает матрицу соответствующих терминов кросс-произведения, использует
det
для получения результирующего значения, принимает абсолютное значение для работы с негативами, а затем делит на 2, потому что это треугольник, а не параллелограмм.источник
Matlab / Octave, 26 байтов
Я не знал об этом встроенном до сих пор =)
источник
Ява,
7988 байтПросто использует основную формулу, ничего особенного.
Изменить: Забыл принять абсолютное значение :(
источник
return(t[0]*(t[3]...
должно хватить, нет?Минколанг 0,8 , 34 байта
Кто-нибудь хочет яйца
n0g
?объяснение
Очень просто. Использует формулу
|(x2-x1)(y3-y1) - (x3-x1)(y2-y1)|/2
.источник
JayScript , 58 байт
Объявляет анонимную функцию:
Пример:
источник
Руби, 45
источник
PHP - 68
8889байтСпасибо Марджину за отличные советы!
Чтобы его использовать, создайте файл
area.php
с этим содержимым, дополнительная строка соответствует предположению, что данные сохранены в переменнойt
части спецификации, а символ ␍ в конце добавляет возврат каретки, так что вывод будет красивым и разделенным:Затем укажите координаты в командной строке
x₁ y₁ x₂ y₂ x₃ y₃
, например,источник
t
.»$a
->$t
, удалить$a=$argv;
сохранение 9 байтов<?php echo
with<?=
, saving another 7 bytesregister_globals=On
in yourphp.ini
file (default). Read more at php.net/manual/en/security.globals.phpPyth,
3430 bytesTry it online.
Works by calculating abs(a*(d-f) + c*(f-b) + e*(b-d))/2 from input a,b,c,d,e,f.
источник
R, 37 bytes
Converts the vector of coordinates into a matrix and tacks on a row of 1's.
Calculates the determinant and divides by 2.
Returns the absolute result. If the order was always clockwise the
abs
would not be required.источник
Python 2,
484750 bytesVery simple; follows the standard equation:
The other, similarly simple approaches are longer:
Python's access to a determinate function is through numpy.
Thanks to muddyfish for 1 byte and xnor for catching an error.
источник
0
from2.0
to leave2.
abs
to make the answer positive.PHP, 77
Based on @Yimin Rong's answer, I felt I could improve upon it by a few bytes by using
list()
rather than straight$argv
to abbreviate some variables. Alsoecho
doesn't need a space if there is delimiter between echo and the thing being echoed.echo$variable;
,echo(4+2);
, andecho'some string';
are equally valid whereasechofunction($variable)
confuses PHP.On the other hand, I also added
abs()
to be mathematically accurate, since some combinations of vertices yielded "negative area"You can run it via CLI
источник
AWK – 51
42bytesAWK has no built-in
abs
so usingsqrt(x^2)
to substitute.Save as
area.awk
and use asecho x₁ y₁ x₂ y₂ x₃ y₃ | awk -f area.awk
, e.g.источник
PowerShell, 70 Bytes
Uses the same standard formula as other solutions. Per the question, assumes the array is pre-populated, e.g.
$t=(1,2,4,2,3,7)
. But ooof, does the$
and[]
syntax kill this one...источник
$
and[]
inspired me to try an AWK solution which, by length, is not uncompetitive!dc, 52 bytes
Assumes the input is in register
t
as:x1 y1 x2 y2 x3 y3
withx1
at the top oft
's stack.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
This uses the following formula for area:
(x1(y2-y3) + x2(y3-y1) + x3(y1 - y2))/2
And for a quick breakdown of the process:
1k Lt Lt sa Lt sb Lt d sc Lt lt r
: set decimal precision to 1 place, move parts of the stack int
to the main stack and move various parts of the main stack to other registers for storage (d
duplicates the top of main stack,r
reverses the top two elements of main stack,L/l
move/copy from the given register to main,s
moves top of main stack to the given register)Main:
y3 x3 y2 x1
a:
y1
, b:x2
, c:y2
, t:y3
la lc lb lt la
: copy the top of the stacks in registersa
,c
,b
,t
, anda
to the main stack in that orderMain:
y1 y3 x2 y2 y1 y3 x3 y2 x1
a:
y1
, b:x2
, c:y2
, t:y3
- * sd
: calculate((y3-y1)*x2)
and put result ind
(registersa
,b
,c
, andt
are no longer used so I'll drop them from the list of stacks now)Main:
y2 y1 y3 x3 y2 x1
d:
((y3-y1)*x2)
- * se - *
: compute((y1-y2)*y3)
and((y2-x3)*x1)
; store the former ine
and leave the latter on the main stackMain:
((y2-x3)*x1)
d:
((y3-y1)*x2)
, e:((y1-y2)*y3)
le ld + +
: copy top of registere
andd
to the main stack, calculate sum of top 2 stack values (pushing result back to main stack) twiceMain:
(((y3-y1)*x2)+((y1-y2)*y3)+((y2-x3)*x1))
d:
((y3-y1)*x2)
, e:((y1-y2)*y3)
2 /
: push 2 onto main stack, divide 2nd values on stack by the 1st (d
ande
are no longer used, dropping them from list of stacks)Main:
(((y3-y1)*x2)+((y1-y2)*y3)+((y2-x3)*x1))/2
Rearranging the value on the stack we can see it's equivalent to the formula at the top of this explanation:
(x1(y2-y3) + x2(y3-y1) + x3(y1 - y2))/2
p
: Print top of main stack to output.источник