Wyzwanie
To wyzwanie jest bardzo proste. Biorąc pod uwagę cztery trójwymiarowe punkty, oblicz pole powierzchni czworościanu, który tworzą. To jest golf golfowy , więc wygrywa najkrótszy kod. Obowiązują standardowe luki, z dodatkowym zastrzeżeniem, że żadna wbudowana funkcja do wykonania tego zadania, biorąc pod uwagę cztery punkty, jest zabroniona.
Możesz założyć, że wszystkie cztery punkty będą odrębne i będą przyznawane za pośrednictwem STDIN, 1 punkt na linię. Każdy punkt będzie się składał z trzech 16-bitowych liczb całkowitych bez znaku. Dokładny format każdego punktu można zmodyfikować, jeśli to ułatwi, na przykład trzy liczby całkowite oddzielone spacjami. Jednak umieszczenie każdego punktu na osobnej linii jest obowiązkowe. Dane wyjściowe powinny być przesyłane przez STDOUT, z dokładnością do co najmniej 2 miejsc po przecinku.
Dla tych z was, którzy nie wiedzą, czworościan jest trójwymiarową bryłą, utworzoną przez 4 trójkątne ściany.
Przykład
# input (format is up to you, see clarification above)
[23822, 47484, 57901]
[3305, 23847, 42159]
[19804, 11366, 14013]
[52278, 28626, 52757]
# output
2932496435.95
Zostaw notatkę, jeśli zauważysz, że moja matematyka jest błędna.
[[list],[of],[lists]]
?Odpowiedzi:
Python,
198 178161 znakówFormat wejściowy jest taki, jak podano w pytaniu.
Oblicza długość krawędzi przylegających do każdej ze ścian, a następnie używa wzoru Herona .
źródło
Matlab / Octave 103
Zakładam, że wartości mają być przechowywane w zmiennej
c
. Wykorzystuje to fakt, że pole trójkąta jest połową długości iloczynu poprzecznego dwóch jego wektorów bocznych.źródło
Input[]
Input[]
,InputString[]
,Import[]
, iImportString[]
.APL, 59
Działa poprzez obliczanie produktów krzyżowych
Objaśnienie
Pierwszy wiersz definiuje funkcję, która przyjmuje dwa argumenty (implikacja o nazwie
⍺
i⍵
), domyślnie oczekuje, że będą to tablice liczbowe o długości 3, traktuje je jako wektory 3d i oblicza kwadratową wielkość ich iloczynu krzyżowego.Druga linia zajmuje się resztą.
źródło
Python 3,
308 298 292 279 258254Wykorzystuje to:
źródło
for i in">"*4
is smartx**0.5
zamiastmath.sqrt(x)
.def a(t,u,v)
w jednej linii tak:def a(t,u,v):w=(t+u+v)/2;return(w*(w-t)*(w-u)*(w-v))**0.5
.Mathematica
168154Znajduje długości krawędzi czworościanu i wykorzystuje wzór Herona do określenia obszarów twarzy.
Istnieje bardziej bezpośrednia trasa, która wymaga tylko 60 znaków , ale narusza reguły, ponieważ oblicza obszar każdej twarzy za pomocą wbudowanej funkcji
Area
:źródło
Szałwia - 103
Część do odczytu danych wejściowych jest adaptowana na podstawie odpowiedzi Keitha Randalla .
źródło
Python - 260
Nie jestem pewien, jaka jest etykieta zamieszczania odpowiedzi na twoje pytania, ale ona jest moim rozwiązaniem, którego użyłem do zweryfikowania mojego przykładu, gra w golfa:
Wykorzystuje tę samą procedurę, co laurencevs.
źródło
r=range
.lambda
jest krótszy niżdef
.math.sqrt
można zastąpić(…)**.5
.p=copy.copy(P);p.pop(j);
można skrócić dop=P[:j-1]+P[j:]
.A
jest używany tylko raz.C 303
Z wyłączeniem niepotrzebnych białych znaków. Jednak wciąż jest wiele do grania w golfa (postaram się wrócić i zrobić to później). To pierwszy raz, kiedy zadeklarowałem
for
pętlę w#define
. Zawsze wcześniej znajdowałem sposoby na zminimalizowanie liczby pętli.Musiałem zmienić z
float
na,double
aby uzyskać tę samą odpowiedź co OP dla przypadku testowego. Wcześniej było to okrągłe 300.scanf
działa tak samo, niezależnie od tego, czy oddzielasz dane wejściowe spacjami lub znakami nowej linii, więc możesz sformatować je w dowolnej liczbie wierszy.źródło