Jesteś właścicielem restauracji. Otwieracie się w nowym obszarze w Kartezji, gdzie jest tylko jedna główna droga, znana jako oś Y. Chcesz umieścić swoją restaurację w taki sposób, aby zminimalizować całkowitą odległość od restauracji i każdego domu w tym obszarze.
Wejście :
Dane wejściowe będą
n, the number of houses
house1
house2
house3
...
houseN
gdzie każdy dom jest współrzędną w formularzu x y
. Każda jednostka reprezentuje jeden kilometr.
Możesz wziąć dane wejściowe jako ciąg znaków lub podać funkcję, która pobiera dane wejściowe, w dowolnym wybranym formacie, jako argumenty.
Wyjście : współrzędna y twojej restauracji (pamiętaj, że będzie ona znajdować się na osi y). W rzeczywistości będzie znajdować się na poboczu drogi, ale różnica jest znikoma.
Zasadniczo, jeśli n-ty dom jest h_n
i D
jest funkcją odległości, to chcesz znaleźćk
taką, która D(h_0, (0, k)) + D(h_1, (0, k)) + D(h_2, (0, k)) + ... + D(h_n, (0, k))
jest zminimalizowana.
Należy pamiętać, że odległość jest obliczana tak, jakby klient podróżował w dokładnie prostej linii od domu do restauracji. To jest odległość od(x, y)
twojej restauracji sqrt(x^2 + (y - k)^2)
.
Dane wyjściowe powinny być dokładne z dokładnością do co najmniej 2 miejsc po przecinku.
Dane wyjściowe mogą być drukowane jako ciąg znaków lub mogą być zwracane z funkcji.
Przykładowe wejście / wyjście:
Input:
2
5.7 3.2
8.9 8.1
Output:
5.113013698630137
Całkowita odległość w tym przykładzie wynosi około 15.4003
kilometrów.
To jest kod golfowy - wygrywa najkrótszy kod.
PS Interesuje mnie również matematyczne rozwiązanie, które nie jest tylko brutalną siłą. Nie wygra golfa kodowego, ale zyska trochę aprobaty. Oto jak zrobiłem przykładowy problem:
Niech punkt A będzie zlokalizowany na A (5.7, 3.2), a B na B (8.9, 8.1). Niech punktem rozwiązania w (0, k) będzie C. Odbij A nad osią y, aby A 'było w (-5,7, 3,2). Odległość od A 'do C jest równa odległości od A do C. Dlatego problem można zredukować do punktu C tak, że A'C + CB jest zminimalizowane. Oczywiście byłby to punkt C, który leży na linii A'B.
Nie wiem, czy dobrze by to uogólniło do 3 lub więcej punktów.
źródło
D
? Euklidesowy?sqrt(diffX^2 + diffY^2)
? Następnie euklidesowy. Wiem, że nie pasuje to idealnie do scenariusza, ale zakładam, że klient podróżuje w linii prostej z domu.Odpowiedzi:
C,
315302 bajtówTo nie jest wcale ładne i nie jest też krótkie. Pomyślałem, że skoro nie zamierzam wygrać konkursu długości, mogę spróbować wygrać (teoretyczną) konkurs dokładności! Kod jest prawdopodobnie rzędu wielkości dwa lub dwa razy szybszy niż rozwiązanie bruteforce i opiera się na matematycznej wygłupie.
Definiujemy funkcję,
g(N,S)
która przyjmuje jako dane wejściowe liczbę domówN
oraz tablicę domówS[][2]
.Tutaj jest rozwikłany, z przypadkiem testowym:
Które wyjścia:
Ostrzeżenie: do pełnego zrozumienia może być wymagana znajomość rachunku różniczkowego!
Porozmawiajmy o matematyce.
Znamy odległość od pożądanego punktu
(0, k)
i domui
:Tak więc całkowitą odległość
D
odn
domów można zdefiniować w następujący sposób:Chcielibyśmy zminimalizować tę funkcję, biorąc pochodną względem
k
i ustawiając ją na równą0
. Spróbujmy. Wiemy, że pochodneD
można opisać następująco:Ale pierwsza częściowa pochodna każdego z nich
Di
jest całkiem zła ...Niestety, nawet przy
n == 2
ustawieniu tych pochodnych0
i rozwiązywaniu problemuk
staje się bardzo katastrofalne. Potrzebujemy bardziej niezawodnej metody, nawet jeśli wymaga ona pewnego przybliżenia.Wprowadź wielomiany Taylora.
Jeśli znamy wartość,
D(k0)
podobnie jak wszystkieD
pochodne wk0
, możemy przepisaćD
jako seria Taylora:Teraz ta formuła zawiera wiele rzeczy, a jej pochodne mogą być dość niewygodne, ale teraz mamy wielomianowe przybliżenie
D
!Robiąc trochę rachunku różniczkowego, otrzymujemy dwa kolejne pochodne
D
, oceniając pochodneDi
, tak jak wcześniej:Skracając i oceniając pochodne, możemy teraz przybliżać
D
jako wielomian 3 stopnia postaci:Gdzie
A, B, C, D
są po prostu liczby rzeczywiste.Teraz to możemy zminimalizować. Kiedy weźmiemy pochodną i ustawimy ją na 0, otrzymamy równanie postaci:
Robiąc rachunek różniczkowy i podstawienia, wymyślamy te formuły dla
a, b, and c
:Teraz nasz problem daje nam 2 rozwiązania podane w formule kwadratowej:
Cała formuła dla
k
byłaby ogromnym obciążeniem do napisania, więc robimy to w częściach tutaj i w kodzie.Ponieważ wiemy, że wyższe
k
zawsze będą skutkować minimalną odległością w przybliżeniuD
(mam na to naprawdę wspaniały dowód, którego margines w tym dokumencie nie jest w stanie pomieścić ...), nie musimy nawet brać pod uwagę mniejszej z rozwiązania.Pozostaje jeszcze jeden problem. Dla celów dokładności konieczne jest, aby zacząć od
k0
tego, co najmniej na boisku, w którym oczekujemy odpowiedzi. W tym celu mój kod wybiera średnią geometryczną wartości y każdego domu.Jako bezpieczne, powtarzamy cały problem ponownie 9 razy, zastępując
k0
gok
przy każdej iteracji, aby zapewnić dokładność.Nie zrobiłem matematyki na temat tego, ile iteracji i ile pochodnych jest naprawdę potrzebnych, ale zdecydowałem się zachować ostrożność, dopóki nie potwierdzę dokładności.
Jeśli udało ci się to ze mną, bardzo dziękuję! Mam nadzieję, że zrozumiałeś, a jeśli zauważysz jakieś błędy (których prawdopodobnie jest wiele, jestem bardzo zmęczony), daj mi znać!
źródło
TI-BASIC, 20
Pobiera dane na ekranie głównym kalkulatora serii TI-83 lub 84 w tej formie (możesz wpisać
2:
pierwszy, który zostanie zignorowany):Jeśli domy są zawsze w odległości mniejszej niż miliard kilometrów od miejsca pochodzenia, E99 można zastąpić E9 dla rozmiaru 18 bajtów.
Gdyby istniał język golfa oparty na Mathematica, mógłby wygrać to wyzwanie w 10-14 bajtach.
źródło
Mathematica, 42 bajty
Jest to anonimowa funkcja, która pobiera listę par jako współrzędne domu i zwraca żądaną współrzędną y.
Jest to dość prosta implementacja. Mapujemy
Norm[#-{0,k}]&
na każdą współrzędną domu (która oblicza odległość do nieokreślonego punktu{0,k}
na osi y) i sumujemy je wszystkieTr[...]
(dla śledzenia, co jest równoważne zTotal
listami 1-d). Następnie używamy wygody,Minimize
aby znaleźć minimum tej sumy wk
. Daje to wynik formularza{distance, {k -> position}
, więc musimyk/.Last@
wyodrębnić toposition
, czego szukamy.źródło
Pyth, 33 bajty
Oto rozwiązanie brutalnej siły: porządkuje wszystkie możliwe lokalizacje restauracji, z rozdzielczością 0,001 km, według ich całkowitej odległości od domów, a następnie wybiera tę o najmniejszej całkowitej odległości. Lokalizacje domów przyjmuje jako listę 2 list wpisów pływaków na STDIN.
Demonstracja.
Rozdzielczość można ustawić w dowolnym miejscu od 1e-2 km do 1e-10 km przy tej samej długości kodu, ale z wykładniczym spowolnieniem w czasie wykonywania.
Wydaje mi się, że można jeszcze trochę zagrać w golfa, przyjrzę się temu później.
źródło
^T3
jest szczególnie imponujące.Python 2, 312
źródło
R,
145143126Podejrzewam, że zostało na to dużo miejsca do gry w golfa. Metoda prawie brutalna. Chciałbym znaleźć lepszy sposób na zrobienie tego. Myślałem, że Geometric Means może pomóc, ale niestety nie.
Testowe uruchomienie
Zainteresowanych, jeśli są tylko dwa domy do rozważenia, zwróci akceptowalny wynik. Jednak spada na trzy. Nie mogę teraz iść dalej, ale pomyślałem, że niektóre mózgi tutaj mogą być w stanie coś z tym zrobić.
źródło
MATLAB, 42
Jeśli możesz przyjąć dane jako
to stwierdzenie
zwroty
5.113014445748538
.Bezwstydnie kradnąc metodę Thomasa Kwa, możesz sprowadzić ją do co najmniej 30:
źródło
n
liczbą domów? Ponieważ o to pyta pytanie.I
.