Napisz program, który przyjmuje dwie liczby jako dane wejściowe. Pierwszy to liczba wymiarów - 0 dla kropki, 1 dla linii prostej, 2 dla koła, 3 dla kuli. Druga liczba to promień obiektu lub, jeśli jest jednowymiarowy, sama liczba. Wyjście 0 dla 0 wymiarów. Dane wyjściowe to długość / powierzchnia / objętość obiektu.
Jeśli wywołamy pierwszy numer n
, drugi r
i wynik x
, otrzymamy:
dla n = 0, x = 1
dla n = 1, x = 2 × r
dla n = 2, x = r 2 × π
dla n = 3, x = ( 4 / 3 ) x R 3 x π
i tak dalej ... jeśli chcesz.
Uwagi:
Przypadki, w których jedna lub obie liczby są ujemne lub gdy pierwsza liczba nie jest pełna, nie muszą być objęte ubezpieczeniem.
Program nie może czytać z żadnego pliku, a jedynymi danymi wejściowymi są te dwie liczby.
Dane wyjściowe powinny zawierać tylko cyfry (np. Nie „14 * pi”) i powinny mieć dokładność co najmniej dwóch cyfr dziesiętnych.
Jeśli chodzi o n = 0, możesz wyprowadzić 0, jeśli spowoduje to, że kod będzie krótszy.
Dodatkowy łup dla odpowiedzi obejmującej nawet 4 i bardziej wymiarowe „kule”!
To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w bajtach!
Przykłady:
1 1 -> 2
2 3 -> 28,27
3 1 -> 4,19
3 4,5 -> 381,70
1 9.379 -> 18.758
0 48 -> 1
== r
jest kulą, zbiór punktów z odległością od początku<= r
jest kulą. Są to 0-piłka = punkt, 1-piłka = odcinek, 2-piłka = dysk, 3-piłka = piłka, 4-piłka, 5-piłka itd. (wymienione jako „n
-ball = nazwa zwyczajowa”).Odpowiedzi:
Galaretka , 13 bajtów + dodatkowy swag
Wypróbuj online!
Działa dla każdego wymiaru, o ile stała wartość π uzyskana przez
ØP
(3.141592653589793
) jest wystarczająco dokładna.W jaki sposób?
źródło
Mathematica, 18 bajtów, do ~ 168,15 bilionów wymiarów
Funkcja anonimowa. Pobiera dwie liczby jako dane wejściowe i zwraca niedokładną liczbę jako dane wyjściowe. Działa z dowolną liczbą wymiarów. Dane wyjściowe
1.
dla n = 0. Używa wzoru z objętości n-piłki na Wikipedii.Wyjaśnienie
Próbujemy obliczyć π n / 2 / Γ ( n / 2 + 1) · R n lub
N[Pi^(n/2)/Gamma[n/2 + 1] R^n]
w Mathematica. W naszym przypadku,#
(pierwszy argument) jest n i#2
(drugi argument) jest R . Pozostaje nam toN[Pi^(#/2)/Gamma[#/2 + 1] #2^#] &
, które można zagrać w golfa w następujący sposób:a zatem nasz oryginalny program.
źródło
!
działa również na nie-całki. Używanie do tego Mathematiki to prawie oszustwo… :)JavaScript (ES6), 45 bajtów + dodatkowy swag
Formuła rekurencyjna z wikipedii , powinna działać dla dowolnej liczby wymiarów
źródło
R,
754038 bajtów (plus dodatkowy swag)Wygląda na to, że mógłbym pograć w golfa, poddając się i używając funkcji gamma zamiast funkcji rekurencyjnych.
Definiuje anonimową funkcję do obliczania objętości
n
dwuwymiarowej hipersfery o promieniur
.Kilka przykładów:
Rozwiązanie Swagless,
3834 bajtówZa kilka bajtów mniej możesz mieć anonimową funkcję, która działa tylko dla wymiarów od 1 do 3. Zwraca
numeric(0)
dlan=0
iNA
dlan>3
. (numeric(0)
jest wektorem numerycznym o długości 0;NA
dotyczy „niedostępnego”.) Wydajność jest poza tym identyczna z ogólnym rozwiązaniem powyżej.źródło
Haskell,
746536 bajtów + dodatkowy swagFormuła rekurencyjna działa dla wszystkich wymiarów, które mogą być przedstawione dokładnie jako liczba zmiennoprzecinkowa podwójnej precyzji, ale zapętla się nieskończenie dla wymiarów niezintegrowanych. Stara wersja dla potomności:
Działa dla wszystkich wymiarów. Wykorzystuje formułę z manifestu tau .product[n,n-2..1.1]
jest podwójnym hackiem silnym, dla którego nie będzie liczone zeron==2
źródło
JavaScript,
61514943 bajtówObsługiwane są wymiary 0-3, ponieważ nie ma czwartego wymiaru .
Dzięki @Hedi za oszczędność 7 bajtów
Tworzy funkcję
d
. Następnie podnosir
don
potęgi, a następnie mnoży ją przez liczbę zależną odn
użycia operatorów trójskładnikowych. Wyjścia1
dlan=0
Daje wynik do co najmniej 2 miejsc po przecinku (10+ dp)
Oto fragment przekąski!
źródło
3 dimensions that behave in the same way and one that behaves in a different way
- W tym momencie zdaje się mówić, że istnieje czwarty wymiar, ale nie ma 1, 2 lub 3!MATL , 17 bajtów
Działa to tylko do 3 wymiarów. Wejścia są w odwrotnej kolejności, to znaczy:,
r
a następnien
.Wypróbuj online!
Rozważmy
r=3
,n=2
jako przykład.źródło
Java / C / C ++ / C #,
6967 bajtów + dodatkowy swag!Edycja: Zapisano 2 bajty dzięki @AlexRacer
Funkcja dyadyczna - pierwszy argument to liczba wymiarów, drugi to promień n-kuli.
float v(int n,float r){return n<1?1:n<2?2*r:6.283f*r*r*v(n-2,r)/n;}
Wzór rekurencyjny dla objętości kuli n: V n = (2πr 2 V n-2 ) ⁄ n
Zaraz! Java (mój język testowy) bije tutaj Scalę dzięki
?:
składni potrójnej trójki! Ta funkcja jest poprawna pod względem składniowym we wszystkich 4 językach w nagłówku i przetestowałem ją z C (MinGW GCC 5.4.0) i C # (VS Ultimate 2016, C # 6.0). Zakładam, że będzie działać również w C ++, więc tam. Ponieważ ta funkcja jest w dużej mierze niezależna od biblioteki, powinna działać w dowolnym języku podobnym do C o podobnej składni.źródło
n==0
można skrócić,n<1
a takżen==1
don<2
Haskell,
52 bajty na wcięcie tabulatora42 bajty + dodatkowy swagEdycja: Zapisano 10 bajtów dzięki @WChargin
Dyadyczna funkcja curry - pierwszy argument to liczba wymiarów, drugi to promień n-kuli.
Wzór rekurencyjny dla objętości kuli n: V n = (2πr 2 V n-2 ) ⁄ n
Zapisz to jako osobny plik skryptu i uruchom z GHCi, z funkcją testowania
v
danych wyjściowych, np.show (v 3 4.5)
. Nie testowałem tego, proszę dać mi znać, jeśli to nie działa.Stary program z przybliżeniem 6,2832 dla zastąpienia 2π (50 bajtów z wcięciem tab):
Można tego używać z GHCi w trybie wielowierszowym (używając
:set +m
lub zamykając kod między:{
&:}
, a obudowy są na swoich liniach. Wymagana funkcja testera.W grę wchodzi wpisywanie statyczne z wnioskowaniem typu pełnego programu, dzięki czemu Haskell radzi sobie znacznie lepiej niż Scala i zbliża się do Groovy, ale nie do końca pokonuje go dzięki dopasowaniu wzorców zamiast trójki, co wymaga powtórzenia postaci.
źródło
2*pi
za6.2832
, a 47 jeśli spadek nawiasy wokół rekurencyjnego wywołania:let{v 0 r=1;v 1 r=2*r;v n r=2*pi*r*r*v(n-2)r/n}
...let{}
i zamień moje średniki na linie, aby uzyskać tylko 42 bajty (bez końcowego znaku nowej linii).Rakieta 69 bajtów (plus dodatkowy swag)
Wykorzystuje rekurencyjną formułę z https://en.wikipedia.org/w/index.php?title=Volume_of_an_n-ball§ion=3#Recursions
W tym sugestie @wchargin
Nie golfowane (v = objętość, d = wymiary, r = promień):
Testowanie:
Wynik:
źródło
v
jest niezwiązane (nie wspominając o innych parametrach). Na pewno też musisz liczyć(define(v d r))
? Daje to do 82 bajtów…cond
jeif
wyrażeniami zagnieżdżonymi , co prowadzi do 78 bajtów(define(v d r)(if(= d 0)1(if(= d 1)(* 2 r)(*(/(* 2 pi(* r r))d)(v(- d 2)r)))))
.match
get”(define(v d r)(match d[0 1][1(* 2 r)][_(*(/(* 2 pi(* r r))d)(v(- d 2)r))]))
.Perl, 63 bajty + dodatkowy swag
Akceptuje dwie liczby całkowite n i r, po jednym na raz, a następnie wyprowadza objętość n dla danego promienia r kuli n. Gdy n = 0, V = 1, a gdy n = 1, V = 2r. Wszystkie dalsze wymiary są obliczane według następującego wzoru:
Ponieważ r n jest czynnikiem promienia w każdym wzorze, zostawiam go z podstawy obliczania i tylko stosuje się go na końcu.
2π jest przybliżone w kodzie przez 6,283.
źródło
Scala, 53 bajty
Przepraszam, nie ma dla mnie dodatkowego łupu :(
Wyjaśnienie:
źródło
JavaScript (ES6), 39 bajtów, bez swaga
źródło
Python 3,
767268 bajtów + dodatkowy łup!Rozwiązanie rekurencyjne z dodatkowym łupem!
Zwraca
0
zan=0
Stare podejście (
1
dlan=1
):Recursywna formuła z Wikipedii .
Wypróbuj online.
źródło
Python 3, 56 bajtów + dodatkowy swag!
Prosto z dodatkowym łupem!
Standardowa formuła.
Wypróbuj online
źródło
Scala,
8179 bajtów + dodatkowy łup!Edycja: Zapisano 2 bajty dzięki @AlexRacer
Funkcja dyadyczna - pierwszy argument to liczba wymiarów, drugi to promień n-kuli.
def v(n:Int,r:Float):Float=if n<1 1 else if n<2 2*r else 6.2832f*r*r*v(n-2,r)/n
Wzór rekurencyjny dla objętości kuli n: V n = (2πr 2 V n-2 ) ⁄ n
Brak wnioskowania typu przez Scalę dla typów zwracanych funkcji rekurencyjnych i parametrów funkcji oraz pełna składnia trójskładnikowa bardzo boli tutaj :(
źródło
Groovy,
4947 bajtów + dodatkowy łup!Edycja: Zapisano 2 bajty dzięki @AlexRacer
Funkcja dyadyczna - pierwszy argument to liczba wymiarów, drugi to promień n-kuli.
def v(n,r){n<1?1:n<2?2*r:6.2832*r*r*v(n-2,r)/n}
Wzór rekurencyjny dla objętości kuli n: V n = (2πr 2 V n-2 ) ⁄ n
Dynamiczne pisanie FTW!
Moje odpowiedzi Scala i Java używają tej samej logiki, ale przy wpisywaniu statycznym, więc większa liczba bajtów dzięki adnotacjom typu :(. Jednak Scala i Groovy pozwalają mi pominąć
return
średnik i średnicę, więc pomaga to w liczeniu bajtów, w przeciwieństwie do Java / C ...źródło
Lithp , 96 znaków + dodatkowy łup
Podział linii na 2 dla czytelności:
Myślę, że muszę zaktualizować parser, aby wymagał mniej miejsca. Rozmiar kodu zostałby ładnie zmniejszony, szczególnie w tej
((/ (* (* (* (*
sekcji.Stosowanie:
Dzięki Rudolfowi za zgolenie kilku bajtów.
źródło
3.141592653589793
” do „3.1416
”, zaoszczędzenie 11 bajtów i dopasowanie do reguł?CJam (27 bajtów z dodatkowym kredytem)
Zestaw testów online . Jest to anonimowy blok (funkcja), który pobiera argumenty
d r
na stos i pozostawia wynik na stosie.Sekcja
Ogólny wzór n-wymiarowy można przepisać jako
źródło