Próbujesz dopasować kulę do 5-stronnego pudełka, ale czasami nie pasuje ona całkowicie. Napisz funkcję, aby obliczyć, ile kuli znajduje się na zewnątrz (powyżej krawędzi) pudełka.
Istnieją 3 możliwe sytuacje:
- Kula pasuje całkowicie do pudełka. Odpowiedź będzie wynosić 0.
- Kula znajduje się na krawędzi pudełka. Odpowiedź będzie stanowić ponad połowę całkowitego wolumenu.
- Kula znajduje się na dole pudełka.
Tutaj możesz zobaczyć każdą sytuację:
Musisz napisać program lub funkcję, aby obliczyć tę wartość na co najmniej 4 cyfry znaczące.
Dane wejściowe: 4 nieujemne liczby rzeczywiste w dowolnym dogodnym formacie * - szerokość, długość, głębokość pudełka (wymiary wewnętrzne) i średnica kuli.
Wyjście: 1 nieujemna liczba rzeczywista w użytecznym formacie * - całkowita objętość (nie procent) kuli poza polem.
* musi być konwertowany na / z łańcucha dziesiętnego
Zachęcamy do maksymalnego ograniczenia używania trygonometrii.
To konkurs popularności, więc pomyśl nieszablonowo!
źródło
Odpowiedzi:
Naprzód
Poniżej znajduje się kula poza polem.
„Kula” to funkcja obliczania objętości
f
. Referencyjne przypadki testowe składają się na „pudełko”.Wynik:
źródło
Java - oparte na liczbach całkowitych
Ten program nie używa pi i nie wywołuje żadnej funkcji zewnętrznej - nawet sqrt. To tylko używa prostych działań arytmetycznych -
+
,-
,*
i/
. Ponadto, oprócz kroku skalowania, działa wyłącznie z liczbami całkowitymi. Zasadniczo dzieli kulę na małe kostki i zlicza te, które są poza ramką.Wynik:
W tej formie program wymaga więcej niż 2 GB pamięci (działa
-Xmx2300m
tutaj) i działa powoli. Wykorzystuje pamięć do wstępnego obliczenia liczby pierwiastków kwadratowych (arytmetycznie); nie jest to naprawdę konieczne, ale bez tego byłoby znacznie wolniej. Aby poprawić zarówno zapotrzebowanie na pamięć, jak i szybkość, zmniejsz wartośćMIN
stałej (zmniejszy to jednak dokładność).źródło
Python 2 (podejście oparte na macierzy)
Tworzy tablicę tablic z wartościami prawdy, jeśli konkretny kwadrat w tej siatce znajduje się wewnątrz koła lub na zewnątrz koła. Powinno być bardziej precyzyjne, im większy okrąg rysujesz. Następnie wybiera obszar poniżej lub powyżej określonego rzędu i zlicza liczbę kwadratów należących do koła i dzieli je przez liczbę kwadratów w całym okręgu.
źródło
Python 2.7, Formuła sferycznej czapki
Ta wersja w niektórych przypadkach generuje ostrzeżenie o czasie wykonywania, ale nadal wyświetla poprawną odpowiedź.
Jeszcze dla 11 znaków mogę pozbyć się ostrzeżenia.
Oto przypadki testowe uruchomione w wersji 1:
źródło
import numpy as n
dofrom numpy import*
i zabrać wszystkie wymienionen.
w kodzie.Matematyka
Korzystanie z integracji numerycznej z odpowiednimi limitami.
źródło
Implementacja referencyjna - C #
Wynik:
źródło
Rubin
Zobaczmy ...
Jeśli pudełko jest całkowicie wewnątrz, to szerokość> średnica; długość> średnica i wysokość> średnica.
To powinien być pierwszy czek do uruchomienia.
Jeśli siedzi na dole, to w> d; l> dh h
V=(pi*h^2 /3)*(3r-h)
W takim przypadku, po prostu uzyskujemy wysokość i przez nią ją przejeżdżamy.Jeśli utknie, używamy podobnej formuły (
V=(pi*h/6)*(3a^2 + h^2)
). W rzeczywistości nasza wcześniejsza formuła jest oparta na tej! Zasadniczo używamy tego, a a jest po prostu mniejszym spośród w i l. (wskazówka, możemy uzyskać wysokość wykonująch=r-a
)Teraz kod!
Uwaga ** Nie testowałem tego zbyt wiele, więc mógł wkroczyć błąd, jeśli ktoś to zauważy, powiedz!
Matematyka jest jednak solidna.
Krótsza wersja:
(Teraz wiem na pewno, że pobieranie h dla v2 odbywa się inaczej, ale naprawię to później.
źródło
h=r-a
” Właśnie czytałem o sferycznych formułach czapek , a schemat nie sugeruje związku tak prostego. Jeszcze raz przeczytam.a = wi > le ? le : wi
powinien działać. W przeciwnym razie masz błąd.a = wi>le?le:wi
nie działał. Zgaduję, że to dlatego, że korzystam z git ruby (programista 2.2), mogło to oznaczać brak równowagi.c ++
Mój kod znajduje objętość bryły obrotu wykresu pewnej części półkola.
pdbd
utrzymuje liniową odległość rzutu punktu na powierzchni kuli, która styka się z krawędzią pudełka, do średnicy kuli, która, jeśli zostanie przedłużona, będzie normalna do dolnej części pudełka. Te dwa wyrażenia, które zawierają,M_PI
są w zasadzie anty pochodną całkipi * -(x^2)+2rx
względem x (gdzie x jest miarą długości wzdłuż wspomnianej powyżej średnicy przez kulę, a gdzie r jest promieniem kuli) ocenianym dla jednegopdbd
lub dwóch różnica średnicy kuli i głębokości skrzynki w zależności od konkretnego przypadku występującego przy różnych wymiarach.źródło