Wprowadzenie
Odległość Hausdorffa mierzy różnicę między dwóch podzbiorów przestrzeni metrycznej. Intuicyjnie przestrzeń metryczna to tylko pewien zestaw z wbudowaną funkcją odległości; w tym wyzwaniu wykorzystamy liczby naturalne ze zwykłym dystansem d(a, b) := abs(a - b)
. Odległość pomiędzy dwoma Hausdorff niepusty zestawów ograniczonych A
i B
jest przez
max(max(min(d(a, b) for b in B) for a in A),
max(min(d(a, b) for a in A) for b in B))
w notacji podobnej do Pythona. Odległość Hausdorffa można obliczyć, znajdując element, A
dla którego odległość do najbliższego elementu B
jest maksymalna, i element, B
dla którego odległość do najbliższego elementu A
jest maksymalna, a następnie biorąc maksimum tych odległości. Innymi słowy, jeśli odległość Hausdorffa jest d
, to każdy element A
jest w odległości d
jakiegoś elementu B
i odwrotnie.
Wkład
Twoje dane wejściowe to pojedyncza lista liczb całkowitych. Zawiera tylko elementy 0,1,2,3
, które wskazują, czy dany indeks listy nie jest elementem ani, A
ani B
tylko A
, ani też B
i jednocześnie A
oraz B
. Na przykład dane wejściowe [0,1,1,0,2,3]
oznaczają, że A = {1,2,5}
i B = {4,5}
jeśli korzystamy z indeksowania opartego na 0 (co nie ma znaczenia, ponieważ nasze wskaźniki są niezmienne w tłumaczeniu).
Wydajność
Twój wynik to odległość Hausdorffa między A
i B
; w powyższym przykładzie jest to 3
. Jeśli któryś z zestawów jest pusty, odległość nie jest zdefiniowana i powrócisz -1
.
Zasady
Możesz napisać pełny program lub funkcję. Wygrywa najniższa liczba bajtów, a standardowe luki są niedozwolone.
Przypadki testowe
[] -> -1
[0] -> -1
[0,1,0] -> -1
[2,0,0,2] -> -1
[0,1,2,3] -> 1
[0,3,3,0,0,0,0,3] -> 0
[1,0,0,1,0,0,1,3,1] -> 7
[1,0,0,0,0,3,0,0,0,0,2] -> 5
[0,1,1,3,1,3,2,1,1,3,0,3] -> 2
[2,2,2,1,2,0,3,1,3,1,0,3] -> 3
[1,3,0,2,0,2,2,1,0,3,2,1,1,2,2] -> 2
[1,0,1,1,2,0,1,2,3,1,0,0,0,1,2,0] -> 4
max(max(min(d(a, b) for b in B) for a in A))
powinno wystarczyć. Jest tak, ponieważd(a,b)
zwraca wartość bezwzględną, a zatem obie funkcje maksymalne zwracają tę samą liczbę za każdym razem.A
jest bardzo zbliżony do jednegoB
, ale istnieją elementyB
bardzo dalekieA
(na przykład, jeśliA
jest podzbioremB
). W takim przypadku krótka formuła jest niepoprawna.Odpowiedzi:
CJam,
5352463837 bajtówPobiera dane wejściowe STDIN jako tablicę stylu CJam:
Oto uprząż testowa, która konwertuje wszystkie przypadki testowe na ten format i uruchamia na nich kod. Chociaż wyniki znajdują się w polu wejściowym, nie są używane przez kod (usuń je, jeśli mi nie ufasz :)).
Wyjaśnienie
Najpierw analizujemy dane wejściowe, aby uzyskać dwa zestawy A i B:
A teraz znajdujemy absolutne różnice i wybieramy maksimum minut:
Zauważ, że przez cały czas trzymaliśmy pustą tablicę wynikającą z początkowej wartości
0
na dole stosu, ale puste tablice nie wnoszą nic do wyniku.źródło
CJam,
57 5652 bajtówMyślę, że można to trochę pograć w golfa, ale oto:
Dane wejściowe są wyświetlane jak lista w stylu CJam, np.
Jak to działa :
Kod jest podzielony na dwie części:
Przetwarzanie danych wejściowych na listy
A
iB
:Wykonanie wymaganych działań na dwóch parach
A
iB
:Wypróbuj online tutaj
źródło
Lua, 235 bajtów
Zdecydowanie nie zwycięzca, ale przynajmniej zabawne wyzwanie.
Wejście działa tak:
... a oto skrypt testowy:
... produkuje ...
źródło
Pyth,
43403938 bajtówMój algorytm działa bezpośrednio na ciągu wejściowym i nigdy nie konwertuje tych liczb. Oblicza się tylko raz maksimum, a nigdy minimum.
Dzięki @isaacg za zapisanie jednego bajtu.
Wypróbuj online: Pyth Compiler / Executor
Objaśnienia:
Najpierw wstawię dużo zer przed wejściem.
Następnie definiuję funkcję pomocnika
y
, która mówi, czy indeksy listy (takie jak wejściowa) pojawiają się w obu zestawach A i BEgy([0, 1, 0, 0, 1, 1]) = False
, aley([0, 1, 0, 2]) = y([3]) = True
.Następnie najpierw sprawdzam, czy wynik jest
-1
.Teraz do ciekawych rzeczy:
Zauważ, że zawsze znajdę liczbę
T
, ponieważ już wiem, że wskaźniki pojawiają się w obu zestawach na liście J. Liczba jest maksymalnalength(Q)
. Jest to również powód wstawiania zer. Jeślilength(Q)
wstawiono co najmniej zera,k-T
zawsze>= 0
jest to konieczne, co jest potrzebne do podziału listy. Dlaczego więc wstawiam2^length(Q)
zera zamiastlength(Q)
zera? W przypadku testowym[]
potrzebuję co najmniej 1 zero, w przeciwnym razieyJ
zwróci błąd.źródło
><Cab
jest taki sam jak:Cba
.Mathematica, 88 bajtów
źródło
m=MaxValue;Max[m[RegionDistance[#[[1]],s],s\[Element]#[[2]]]/.m[__]->-1&/@{#,Reverse@c}]&
który można następnie zastosować do obiektów wielowymiarowych, takich jak%@{Sphere[],Line[{{1,1,0},{3,3,3}}]}
Haskell,
145126124 bajtówTestowe uruchomienie:
s
filtruje liczby naturalne według predykatut
i listy danych wejściowychx
.#
oblicza maksymalną odległość jego parametrówd
ie
.%
łapie puste zestawy A lub B lub przyjmuje końcowe maksimumd#e
ie#d
.f
to główna funkcja, która wywołuje%
zestaw A i B.Edycja: @Zgarb znalazł wiele bajtów do zapisania; @ ali0sha inny 2. Dzięki!
źródło
mod 2
Wydaje się zbędne. Możesz również skorzystać z tego, że nie definiujesza
i nie wyrażaszb
wprost.[]%_= -1
- ale pobiłaś moją próbę na tym :)Perl,
5655Dodano +2 do
-lp
.Lista wejściowa powinna być podana na stdin bez spacji, np .:
hausdorf.pl
:Aby wesprzeć spacje między elementami listy wejściowej, wystarczy podzielić finał
$q
przez 2 za koszt 2 pociągnięćźródło
Python 2, 124
To zdecydowanie wydaje się nieoptymalne. No cóż.
źródło
APL (49)
Przypadki testowe:
Wyjaśnienie:
⍳⍴⍵
: uzyskaj listę liczb od 1 do długości listy danych wejściowych↓2 2⊤⍵
: dla każdej wartości na liście wejściowej pobierz pierwszy bajt i drugi bajt∆←(
...)/⊂⍳⍴⍵
: dla obu list bajtów wybierz odpowiednie wartości z⍳⍴⍵
. Przechowuj je w∆
.(⊂⍬)∊∆
...:¯1
: jeśli ta lista zawiera pustą listę, wróć-1
. Inaczej:|∘.-/∆
: uzyskaj absolutną różnicę między każdą parą wartości, podając macierz(+,⍉¨)
: uzyskaj obróconą i nieobróconą kopię tej matrycy{⌈/⌊/⍵}
: dla obu macierzy uzyskaj maksimum minimum wierszy⌈/
: a następnie uzyskaj maksimum tegoźródło
,X
, aby odróżnić ją od skalaraX
.)Perl,
189176157BTeraz z 500% większym stanem.
Czytelny:
Przykładowe użycie:
wkład
perl golf.pl < input
źródło
Clojure, 167 bajtów
Powinna być krótsza droga ... Czy istnieje?
źródło