Wprowadzenie
Dzisiaj łowiłem samotnie z kajakiem, niestety zasnąłem i strumień mnie zabrał, zgubiłem wiosła, teraz jest noc i zagubiłem się w oceanie! Nie widzę wybrzeża, więc muszę być daleko!
Mam telefon komórkowy, ale działa nieprawidłowo, ponieważ zmoczył go słona woda, nie mogę nic mówić ani słyszeć, ponieważ mikrofon i głośnik telefonu są zepsute, ale mogę wysyłać SMS-y do mojego przyjaciela, który jest na plaży na wybrzeżu!
Mój przyjaciel ma bardzo mocną pochodnię i podniósł ją na bambusowe laski, aby wskazać mi właściwy kierunek, ale nie mogę wiosłować, ponieważ nie mam wiosła, więc muszę mu powiedzieć, jak daleko jestem, aby mógł wysłać kogoś na Złap mnie!
Mój przyjaciel powiedział mi, że trzyma pochodnię na wysokości 11,50 metra na poziomie morza i widzę światło tuż nad horyzontem. Teraz pamiętam tylko ze szkoły, że promień Ziemi powinien wynosić 6371 km na poziomie morza, i siedzę w czółnie, więc możesz założyć, że moje oczy też są na poziomie morza.
Zadanie
Ponieważ prądy poruszają mnie chwila po chwili, mój przyjaciel od czasu do czasu podnosi pochodnię (teraz ma 12,30 metra), proszę napisać pełny program lub funkcję, która pomoże mi obliczyć odległość od pozycji mojego przyjaciela!
Oto schemat (nie w skali):
Pomarańczowy punkt oznaczony jako M
ja, czerwony punkt oznaczony T
jako pochodnia. Zielona linia to liniowa odległość między M
iT
Wejście
Weź ze standardowego wejścia wysokość pochodni h
w metrach na poziomie morza, którą widzę tuż nad horyzontem, w postaci liczby zmiennoprzecinkowej z dokładnością do dwóch miejsc po przecinku (z dokładnością do 1 centymetra lub 0,01 metra), w zawiera się w zakresie od 0 do 100.
Wynik
Powinieneś zwrócić euklidesową długość zielonej linii z dokładnością do 1 cm. Na przykład, jeśli wyprowadzasz dane w metrach, powinno być z co najmniej dwoma miejscami po przecinku. Wydajność może wynosić albo metry, albo kilometry, ale z zachowaniem dokładności.
Przypadki testowe:
Wszystkie wartości w metrach.
11.5 > 12105.08
13.8 > 13260.45
Zasady
Najkrótszy kod wygrywa.
źródło
Odpowiedzi:
05AB1E ,
131210 bajtówZaoszczędź 2 bajty dzięki Emignie.
Ponieważ nie ma żadnych funkcji trygonometrycznych, które można by wywoływać przy założeniu OP, że Ziemia jest lokalnie płaszczyzną, możliwe jest wykonanie rozwiązania 05AB1E.
Wypróbuj online!
źródło
12742000
można zapisać jako•1#oC•
•1#oC•+*t
w 2sable•
przez ... przedstawia numer ... base 214? 05AB1E czasami cierpi na brak dokumentacji takich specjalnych funkcji. Ładna 2sable odpowiedź również. Dowiedziałem się o tym kilka dni temu, ale nie zastanawiałem się nad użyciem go do tego pytania.Python,
3426 bajtów:( -8 bajtów dzięki Osable! )
Anonimowa funkcja lambda. Pobiera dane wejściowe w kilometrach i dane wyjściowe w kilometrach. Wywołaj jako
print(<Function Name>(<Input>))
.źródło
lambda i:(i*(i+12742))**.5
byłby jeszcze krótszy.i
i 12742, wyrażenie można skrócić w następujący sposób:(i*12742)**.5
PHP, 34 bajty
awaria
jak dotąd jest to identyczne ze starą odpowiedzią Mathematica
teraz pozostaje tylko dodać dane wejściowe
=$argv[1]
i wyjściowe<?=
- gotoweźródło
dc,
1611 bajtów:Monituje o wprowadzenie za pomocą wiersza poleceń w kilometrach, a następnie wyświetla odległość w kilometrach.
Wyjaśnienie
Wykorzystuje to następujące:
źródło
jq, 18 znaków
Jeszcze jedna kopia tej samej formuły.
Przykładowy przebieg:
Test online
źródło
Haskell, 22 bajty
Stosowanie:
Pointfree: (23 bajty)
źródło
R, 29 bajtów
Pobiera dane wejściowe ze standardowego wejścia
źródło
(h=scan())*(1+12742e3/h)^.5
.Mathematica, 16 bajtów
Każda z tych czynności dotyczy zarówno wejścia, jak i wyjścia w kilometrach:
Jest to prosta aplikacja Pitagorasa na problem:
źródło
Galaretka, 9 bajtów na stronie kodowej Galaretki
Postanowiłem spróbować programu w języku golfowym. Znalazłem bardziej wydajny algorytm niż ten, którego używają inni ludzie (przynajmniej na krótkich odległościach, jak ten w pytaniu), ale wymaga on dosłownie liczb zmiennoprzecinkowych, których Jelly nie wydaje się być w stanie skompresować, więc Pitagoras to jest.
Wyjaśnienie:
Potrzeba
µ
separatora denerwuje mnie, ale myślę, że jest to nieuniknione; Galaretka już zapisała bajt ponad 05AB1E, ponieważ jest w stanie odgadnąć, jakich argumentów wymaga wiele poleceń, ale w tym przypadku nie może poprawnie odgadnąć do końca, więc musiałem dać mu podpowiedź.Galaretka, 7 bajtów na stronie kodowej Galaretki
Jak wyjaśniłem w mojej innej odpowiedzi , aproksymacja serii do aproksymacji Pitagorasa faktycznie daje lepsze wyniki na długościach zawartych w pytaniu (przynajmniej są bliższe przykładowym wynikom), a także ma krótszą formułę. Pisząc to, zdałem sobie sprawę, że zamiast z góry obliczyć pierwiastek kwadratowy z 12742000, najpierw mogłem pomnożyć liczbę przez 12742000, a następnie pierwiastek kwadratowy jednocześnie. Jest to zasadniczo równoważne z inną formułą bez dodatku i jako takie można ją wytworzyć z poprzedniego programu, usuwając z niej dodatek. To oszczędza dwa bajty, ponieważ teraz analizuje jednoznacznie, więc nie potrzebujemy
µ
więcej.źródło
Ruby, 23 lata
23 bajty, w km
25 bajtów, wm
źródło
Tcl, 49 bajtów:
Cóż, jestem zupełnie nowy w Tcl, więc wszelkie wskazówki dotyczące gry w golfa są bardzo mile widziane. Podobnie jak moje inne odpowiedzi, monity o wprowadzenie wiersza poleceń w kilometrach i wyjście w kilometrach. Zasadniczo adaptacja Tcl moich istniejących
dc
ipython
odpowiedzi.źródło
x86_64 + kod maszynowy SSE, 16 bajtów
Bajty programu znajdują się po lewej stronie (w systemie szesnastkowym), po prawej stronie znajduje się demontaż, aby ułatwić czytanie. Jest to funkcja zgodna z normalną konwencją x86_64 dla funkcji pobierających i zwracających liczby zmiennoprzecinkowe pojedynczej precyzji (pobiera argument w% xmm0 i zwraca swoją odpowiedź w tym samym rejestrze oraz używa% xmm1 i% eax jako tymczasowych; te są tymi samymi konwencjami wywoływania, których będzie używał program w języku C, i jako taki możesz wywołać funkcję bezpośrednio z programu w języku C, tak jak ją przetestowałem.
Jednak nawet przy demontażu nadal wymaga to wyjaśnienia. Po pierwsze warto omówić formułę. Większość ludzi ignoruje krzywiznę ziemi i używa wzoru Pitagorasa do pomiaru odległości. Też to robię, ale używam przybliżenia rozszerzenia serii; Przyjmuję tylko termin odnoszący się do pierwszej mocy wejściowej i ignoruję moce trzecie, piąte, siódme itd., Które mają bardzo niewielki wpływ na tym krótkim dystansie. (Poza tym przybliżenie Pitagorasa daje niską wartość, podczas gdy późniejsze terminy w rozszerzeniu serii służą do zmniejszenia wartości; jako takie, ignorując niewielki czynnik, który służyłby do popychania przybliżenia w niewłaściwym kierunku, faktycznie się zdarza dokładniejszy wynik przy użyciu mniej dokładnej formuły.) Formuła okazuje się √12742000 × √h;
0x455f1980
.Następną rzeczą, która może mylić ludzi, jest to, dlaczego używam instrukcji wektorowych dla pierwiastka kwadratowego i mnożenia;
%xmm0
i%xmm1
może pomieścić cztery liczby zmiennoprzecinkowe pojedynczej precyzji, i działam na wszystkich czterech. Rozumowanie tutaj jest bardzo proste: ich kodowanie jest o jeden bajt krótsze niż w odpowiednich instrukcjach skalarnych. Mogę więc zmusić FPU do wykonania dodatkowej pracy polegającej na rootowaniu i mnożeniu zer w celu zaoszczędzenia sobie dwóch bajtów, metodą bardzo przypominającą typowy algorytm języka golfowego. (Nazywałam asemblera x86 golfowym językiem asemblerów na czacie jakiś czas temu i nadal nie zmieniłam zdania).Stamtąd algorytm jest bardzo prosty: ładuj
%xmm1
za pomocą √12742000 przez%eax
(który jest krótszy pod względem bajtów niż ładowanie go z pamięci), pierwiastek kwadratowy z argumentem (i trzema zerami), pomnóż odpowiednie elementy%xmm1
i%xmm0
(zależy nam tylko o pierwszym elemencie), a następnie wróć.źródło
Minkolang v0.15, 22 bajty
Wypróbuj online!
źródło
JavaScript (ES6),
3125 bajtówWyświetla wartość w metrach
źródło