Możesz określić objętość obiektów na podstawie danego zestawu wymiarów:
- Objętość kuli można określić za pomocą pojedynczej liczby, promienia (
r
) - Objętość cylindra można określić za pomocą dwóch liczb, promienia (
r
) i wysokości (h
) - Objętość pudełka można określić za pomocą trzech liczb, długości (
l
), szerokości (w
) i wysokości (h
) - Objętość nieregularnej trójkątnej piramidy można określić za pomocą czterech liczb, długości boków (
a, b, c
) i wysokości (h
).
Wyzwanie polega na określeniu objętości obiektu na podstawie jednego z następujących danych wejściowych:
- Pojedyncza liczba
(r)
lub(r, 0, 0, 0)
=>V = 4/3*pi*r^3
- Dwie liczby
(r, h)
lub(r, h, 0, 0)
=>V = pi*r^2*h
- Trzy liczby
(l, w, h)
lub(l, w, h, 0)
=>V = l*w*h
- Cztery liczby
(a, b, c, h)
=>V = (1/3)*A*h
, gdzieA
podana jest formuła Herona :A = 1/4*sqrt((a+b+c)*(-a+b+c)*(a-b+c)*(a+b-c))
Zasady i wyjaśnienia:
- Dane wejściowe mogą być zarówno liczbami całkowitymi, jak i dziesiętnymi
- Możesz założyć, że wszystkie wymiary wejściowe będą dodatnie
- Jeśli Pi jest zakodowana musi być dokładna do:
3.14159
. - Dane wyjściowe muszą mieć co najmniej 6 cyfr znaczących, z wyjątkiem liczb, które można dokładnie przedstawić za pomocą mniejszej liczby cyfr. Możesz wyprowadzać
3/4
jako0.75
, ale4/3
musi być1.33333
(więcej cyfr jest w porządku)- Sposób zaokrąglania niedokładnych wartości jest opcjonalny
- Zachowanie nieprawidłowych danych wejściowych jest niezdefiniowane
- Standardowe reguły we / wy. Dane wejściowe mogą być listą lub osobnymi argumentami
To jest kod golfowy, więc wygrywa najkrótsze rozwiązanie w bajtach.
Przypadki testowe:
calc_vol(4)
ans = 268.082573106329
calc_vol(5.5, 2.23)
ans = 211.923986429533
calc_vol(3.5, 4, 5)
ans = 70
calc_vol(4, 13, 15, 3)
ans = 24
code-golf
math
arithmetic
geometry
Stewie Griffin
źródło
źródło
Odpowiedzi:
MATL ,
57535144 bajtówDane wejściowe to tablica z 1, 2, 3 lub 4 cyframi.
Wypróbuj online!
Wyjaśnienie
Zamiast używać zagnieżdżonych
if
pętli, co jest kosztowne pod względem bajtów, oblicza cztery możliwe wyniki dla dowolnego wejścia, a następnie wybiera odpowiedni wynik w zależności od długości wejścia.Podczas obliczania wyników, chociaż tylko jeden z nich musi być poprawny, inne nie mogą dawać błędów. Oznacza to na przykład, że indeksowanie czwartego elementu danych wejściowych jest niedozwolone, ponieważ dane wejściowe mogą zawierać mniej niż cztery elementy.
źródło
Vitsy, 49 bajtów
Myślałem, że podałeś mi ten na talerzu, ale znalazłem nierozwiązany błąd do obejścia. Jednak mnie nie skrzywdziło.
Zasadniczo, ponieważ dane wejściowe mają określoną długość dla różnych funkcji, podajesz mi łyżkę składni mojej metody do robienia tych rzeczy. Tak, sukces!
Objaśnienie, jedna linia na raz:
Dane wejściowe są akceptowane jako argumenty wiersza poleceń w dokładnie odwrotnej kolejności, w jakiej pojawiają się w pytaniu, bez zer końcowych.
Wypróbuj online!
Nawiasem mówiąc, oto coś, co jest obecnie w fazie rozwoju.
Java z pakietem Vitsy
Pamiętaj, że ten pakiet jest w toku; to jest po prostu pokazać, jak to będzie działać w przyszłości (dokumentacja ta nie jest jeszcze załadowane) i to nie grałem, i to dosłowne tłumaczenie:
źródło
C,
10097 bajtówedycja 1: usuń niepotrzebne dziesiętne
.
, dzięki Immibis!źródło
4./3.
być po prostu4/3.
? A może2.
i12.
po prostu być2
i12
?JavaScript ES6,
12912612511611490 bajtówZaoszczędź dużo bajtów (9) dzięki wspaniałej formule, dzięki Stewie Griffin! Ponieważ dane wejściowe muszą być niezerowe,
variable?
wystarczą do sprawdzenia definicji.Przetestuj to!
źródło
Uncaught SyntaxError: Unexpected token =
(odnosząc się doZ=a*a
)h
, co wydaje się trochę przeoczone.Haskell,
11410910710199 bajtówPobiera listę liczb i zwraca wolumin. Nazwij to jak
dla kuli itp. Funkcja jest polimorficzna dla każdego typu, który implementuje
sqrt
(tak, w zasadzieFloat
lubDouble
).Nie wygra żadnych konkursów na zwięzłość. Ale zauważ, jak to jest czytelne . Nawet jeśli tak naprawdę nie znasz Haskell, możesz łatwo stwierdzić, co on robi. Składnia dopasowywania wzorców Haskella sprawia, że bardzo łatwo jest zdefiniować dziwne funkcje, które robią coś zupełnie innego w zależności od kształtu wejścia.
źródło
(1/3)*(1/4)*h
,,, dlaczego nieh/12
? Oszczędza dużo bajtów!.
i#
a$
i staje Mathematica zupy.PowerShell,
165161 bajtówWięc ... Wiele ... Dolarów ... (31 ze 161 znaków
$
, za 19,25% kodu) ... ale zaoszczędzono 4 bajty dzięki Stewie Griffin!Pobieramy cztery dane wejściowe, a następnie stopniowo indeksujemy na podstawie pseudo-trójskładnikowych instrukcji na ich podstawie w odwrotnej kolejności. Np. Zewnętrzny
(..., ...)[!$h]
sprawdza, czy czwarty sygnał wejściowy jest obecny. Jeśli tak, test!$h
będzie równy,0
a pierwsza połowa zostanie wykonana (objętość nieregularnej piramidy trójkątnej). W przeciwnym razie,!$h
z$h = $null
(ponieważ jest niezainicjowany) będzie równy1
, więc przejdzie do drugiej połowy, która sama w sobie jest pseudo-trójką opartą na[!$c]
i tak dalej.Jest to prawdopodobnie zbliżone do optymalnego, ponieważ przypuszczalnie krótsza formuła, którą stosuje (np.) Cᴏɴᴏʀ O'Bʀɪᴇɴ, jest w rzeczywistości o 2 bajty dłuższa w PowerShell dzięki brakowi
^
operatora ... Jedyne prawdziwe oszczędności pochodzą z(1/3)*(1/4)*A*$h
gry w golfaA*$h/12
i ustawienie$p
później, aby zapisać kilka bajtów zamiast długiego[math]::PI
połączenia.źródło
CJam,
6766 bajtówNiedługo będę pracował nad jego skróceniem. Wypróbuj online !
Wyjaśnienie, które nastąpi.
źródło
Poważnie,
655955 bajtówWypróbuj online!
Wyjaśnienie
Ten jest doozy. Wytłumaczę to na kilka części.
Główny korpus:
Funkcja 0:
Funkcja 1:
Funkcja 2:
Funkcja 3 (21 bajtów; prawie połowa długości programu!)
źródło
Matlab, 78 bajtów
Z całą pewnością nie może być krótszy niż ten.
~b
,~c
i~d
,0
jeśli każdy z wymiarów jest niezerowy. Formuła o zerowym wymiarze da po prostu zero. W ten sposób każdą z formuł można po prostu zsumować. Nieif
ielse
wymagane.Nazwij to tak (lub wypróbuj online tutaj ):
źródło
Python
32,127119116 bajtówKredyt na kogoś i Mego za ich pomoc w golfa. Podziękowania należą się również Cᴏɴᴏʀ O'B J i Joshowi, gdy pożyczyłem części ich odpowiedzi na tę jedną.
Nie golfowany:
źródło
def v(a,b,c,d):z=a*a;p=355/113;return[x for x in[(4*z*b*b-(z+b*b-c*c)**2)**.5*d/12,a*b*c,p*z*b,p*z*a*4/3]if x][0]
przy założeniu, że dane wejściowe są wypełnione0
s.def v(a,b,c,d):z=a*a;P=3.14159;return filter(int,[(4*z*b*b-(z+b*b-c*c)**2)**.5*d/12,a*b*c,P*z*b,P*z*a*4/3])[0]
Mathematica, 114 (103)
Czysta funkcja: 114
Nie golfowany:
Stosowanie:
Jeśli dozwolone są funkcje nazwane: 103
Stosowanie:
źródło
#1==#
, Myślę, żeQuiet[x_]:=Quiet[x,All]
π (Alt-P na Macu) pasuje do rozszerzonego ASCII.#1 #2 #3
z1##
? Nie zapomnij#==#1
Współczynnik, 783 bajtów
Cóż, zajęło to wieczność.
Zadzwoń
{ array of numbers } volume
.źródło