Kolejne łatwe wyzwanie dla Ciebie.
Twoje zadanie
Napisz program lub funkcję, która pobiera dane wejściowe, która zawiera 3 pary współrzędnych xi y i oblicza pole utworzonego w nich trójkąta. Dla tych, którzy nie pamiętają, jak to obliczyć, możesz go znaleźć tutaj .
Przykład:
1,2,4,2,3,7 # input as x1,y1,x2,y2,x3,y3
7.5 # output
Zobacz na Wolfram Alpha
Kilka uwag:
- Dane wejściowe będą składały się z sześciu podstawowych liczb całkowitych dodatnich.
- Możesz założyć, że dane wejściowe mają dowolny rozsądny format .
- Punkty zawsze będą tworzyć prawidłowy trójkąt.
- Możesz założyć, że dane wejściowe są już zapisane w zmiennej takiej jak
t
. - Najkrótszy kod w bajtach wygrywa!
Edycja: Aby uniknąć nieporozumień, uprościłem sposób, w jaki należy postępować z danymi wejściowymi bez narażania żadnego z obecnych kodów.
Pamiętaj, że twój program / funkcja musi wypisać prawidłowy obszar, więc nie może podać liczby ujemnej jako wyniku
[[1, 2], [4, 2], [3, 7]]
) WT
?[1 2;4 2;3 7]
(używając składni Julii)?Odpowiedzi:
CJam,
1816 bajtówWypróbuj online w interpretatorze CJam .
Pomysł
Jak wspomniano na Wikipedii , obszar trójkąta
[[0 0] [x y] [z w]]
można obliczyć jako|det([[x y] [z w]])| / 2 = |xw-yz| / 2
.W przypadku ogólnego trójkąta
[[a b] [c d] [e f]]
możemy przełożyć jego pierwszy wierzchołek na początek, uzyskując w ten sposób trójkąt[[0 0] [c-a d-b] [e-a f-b]]
, którego pole można obliczyć za pomocą powyższej formuły.Kod
źródło
Mathematica, 27 bajtów
źródło
Partition[t,2]
, który odpowiada2/
w CJam. ;)JavaScript (ES6) 42
.44.Edytuj zmieniony format wejściowy, mogę zapisać 2 bajty
Anonimowa funkcja, która przyjmuje tablicę jako parametr i zwraca obliczoną wartość.
Przetestuj poniższy fragment kodu w przeglądarce zgodnej z EcmaScript 6.
źródło
The input will be a vector with six base 10 positive integers.
Julia, 32 bajty
Konstruuje macierz odpowiednich warunków iloczynu krzyżowego, używa
det
do uzyskania wartości wynikowej, przyjmuje wartość bezwzględną do czynienia z negatywami, a następnie dzieli przez 2, ponieważ jest to trójkąt, a nie równoległobok.źródło
Matlab / Octave, 26 bajtów
Do tej pory nie wiedziałem o tym wbudowanym =)
źródło
Java,
7988 bajtówPo prostu używa podstawowej formuły, nic specjalnego.
Edycja: Zapomniałem wziąć wartość bezwzględną :(
źródło
return(t[0]*(t[3]...
powinno wystarczyć, nie?Minkolang 0,8 , 34 bajty
Ktoś chce trochę jajka
n0g
?Wyjaśnienie
Bardzo proste. Używa wzoru
|(x2-x1)(y3-y1) - (x3-x1)(y2-y1)|/2
.źródło
JayScript , 58 bajtów
Deklaruje anonimową funkcję:
Przykład:
źródło
Ruby, 45 lat
źródło
PHP - 68
8889bajtówDzięki Martjin za wspaniałe wskazówki!
Aby go użyć, utwórz plik
area.php
z tą zawartością, dodatkowy wiersz spełnia założenie, że dane są zapisywane w zmiennejt
części specyfikacji, a ␍ na końcu dodaje znak powrotu karetki, dzięki czemu dane wyjściowe są ładne i oddzielone:Następnie podaj współrzędne w wierszu polecenia
x₁ y₁ x₂ y₂ x₃ y₃
, npźródło
t
”.$a
->$t
, usuń$a=$argv;
zapisywanie 9 bajtów<?php echo
z<?=
, zapisując kolejne 7 bajtówregister_globals=On
twoimphp.ini
plikiem (domyślnie). Czytaj więcej na php.net/manual/en/security.globals.phpPyth,
3430 bajtówWypróbuj online.
Działa poprzez obliczenie abs (a * (df) + c * (fb) + e * (bd)) / 2 z wejścia a, b, c, d, e, f.
źródło
R, 37 bajtów
Konwertuje wektor współrzędnych na matrycę i pinezki w rzędzie 1.
Oblicza wyznacznik i dzieli przez 2.
Zwraca wynik bezwzględny. Jeśli zamówienie zawsze odbywa się zgodnie z ruchem wskazówek zegara
abs
, nie będzie wymagane.źródło
Python 2,
484750 bajtówBardzo prosty; postępuje zgodnie ze standardowym równaniem:
Inne podobnie proste podejścia są dłuższe:
Dostęp Pythona do określonej funkcji odbywa się przez numpy .
Dzięki błotniakowi za 1 bajt i xnor za złapanie błędu.
źródło
0
z,2.0
aby wyjść2.
abs
aby odpowiedź była pozytywna.PHP, 77
Opierając się na odpowiedzi @Yimin Rong, poczułem, że mogę poprawić ją o kilka bajtów, używając
list()
raczej niż prostych$argv
skrótów niektórych zmiennych. Równieżecho
nie potrzebuje miejsca, jeśli istnieje separator pomiędzy Echo i rzeczą jest echem.echo$variable;
,echo(4+2);
iecho'some string';
są równie ważne, podczas gdyechofunction($variable)
myli PHP.Z drugiej strony dodałem również,
abs()
aby być matematycznie dokładnym, ponieważ niektóre kombinacje wierzchołków dawały „pole ujemne”Możesz uruchomić go za pomocą CLI
źródło
AWK - 51
42bajtówAWK nie ma wbudowanego,
abs
więc używa gosqrt(x^2)
do zamiany.Zapisz jako
area.awk
i użyj jakoecho x₁ y₁ x₂ y₂ x₃ y₃ | awk -f area.awk
npźródło
PowerShell, 70 bajtów
Używa tej samej standardowej formuły co inne rozwiązania. W przypadku pytania zakłada się, że tablica jest wstępnie wypełniona, np
$t=(1,2,4,2,3,7)
. Ale ooof , czy$
i ta[]
składnia zabija ten ...źródło
$
i[]
zainspirował mnie do wypróbowania rozwiązania AWK, które, pod względem długości, nie jest niekonkurencyjne!dc , 52 bajty
Zakłada, że dane wejściowe są rejestrowane
t
jako:x1 y1 x2 y2 x3 y3
zx1
u góryt
stosu.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
Używa następującej formuły dla obszaru:
(x1(y2-y3) + x2(y3-y1) + x3(y1 - y2))/2
I dla szybkiego rozbicia procesu:
1k Lt Lt sa Lt sb Lt d sc Lt lt r
: ustaw precyzję dziesiętną na 1 miejsce, przenieś części stosut
do głównego stosu i przenieś różne części stosu głównego do innych rejestrów w celu przechowywania (d
duplikuje górę stosu głównego,r
odwraca dwa górne elementy stosu głównego,L/l
przesuń / skopiuj z podanego rejestru do głównego,s
przenosi górę stosu głównego do danego rejestru)Główny:
y3 x3 y2 x1
a
y1
:, bx2
:, cy2
:, t:y3
la lc lb lt la
Copy wierzch stosów w rejestracha
,c
,b
,t
, aa
do głównego stosu w tej kolejnościGłówny:
y1 y3 x2 y2 y1 y3 x3 y2 x1
a
y1
:, bx2
:, cy2
:, t:y3
- * sd
: Oblicz((y3-y1)*x2)
i wynik umieścić wd
(rejestrya
,b
,c
, it
nie są już wykorzystywane więc będę upuść je z listy stosy teraz)Główny:
y2 y1 y3 x3 y2 x1
re:
((y3-y1)*x2)
- * se - *
: Oblicz((y1-y2)*y3)
i((y2-x3)*x1)
; przechowywać pierwszy we
i zostaw drugi na głównym stosieGłówny:
((y2-x3)*x1)
d:,
((y3-y1)*x2)
e:((y1-y2)*y3)
le ld + +
: skopiuj górną część rejestrue
id
do głównego stosu, obliczyć sumę wartości z 2 górnych stosów (przesunięcie wyniku z powrotem do głównego stosu) dwukrotnieGłówny:
(((y3-y1)*x2)+((y1-y2)*y3)+((y2-x3)*x1))
d:,
((y3-y1)*x2)
e:((y1-y2)*y3)
2 /
: przesuń 2 na główny stos, podziel 2. wartości na stosie przez 1. (d
ie
nie są już używane, usuwając je z listy stosów)Główny:
(((y3-y1)*x2)+((y1-y2)*y3)+((y2-x3)*x1))/2
Zmieniając wartość stosu, widzimy, że jest on równoważny formule na górze tego objaśnienia:
(x1(y2-y3) + x2(y3-y1) + x3(y1 - y2))/2
p
: Wydrukuj górę głównego stosu, aby wydrukować.źródło