W tym celu kod powinien przyjmować dwie posortowane tablice liczb całkowitych X i Y jako dane wejściowe. Powinien obliczyć sumę bezwzględnych odległości między każdą liczbą całkowitą w X i jej najbliższą liczbą w Y.
Przykłady:
X = (1 5,9)
Y = (3,4,7)
Odległość wynosi 2 + 1 + 2.
X = (1,2,3)
Y = (0,8)
Odległość wynosi 1 + 2 + 3.
Twój kod może pobierać dane w dowolny dogodny sposób.
Głównym ograniczeniem jest to, że kod musi działać w czasie liniowym w sumie długości dwóch tablic. . (Możesz założyć, że dodanie dwóch liczb całkowitych wymaga stałego czasu).
1 + 2 + 3
pochodzi odX = (1,2,3)
aY = (0,8)
?1
,2
oraz3
wY
Is0
. Tak więc różnice są1-0
,2-0
,3-0
.Odpowiedzi:
Haskell ,
7064 bajtówWypróbuj online!
Wyjaśnienie
Najpierw określamy
(%)
bezwzględną różnicę między dwiema liczbami. Następnie określamy,(#)
że jest to interesująca funkcja. W pierwszym wierszu dopasowujemy, gdy obie listy nie są puste:W naszym pierwszym przypadku stąd wiążemy
d
sięe:_
ze:_<-d
. Zapewniad
to, że nie jest pusty i ustawia jego pierwszy elemente
.Następnie, jeśli drugi element ( ) jest bliżej niż pierwszy ( ) do pierwszego elementu X ( ), wracamy usuwanie pierwszego elementu Y i dzwoni ponownie z tym samym X .Y X Y X
e
c
a
x#d
Jeśli dopasujemy wzór, ale nie spełnimy warunku, to:
Haskell , 34 bajty
Wypróbuj online!
źródło
Python 2 ,
124120 bajtówWypróbuj online!
Zaoszczędzono 4 bajty, przechodząc do programu kontra funkcja.
Spełnienie ograniczenia złożoności czasowej jest możliwe, ponieważ obie listy są posortowane. Zauważ, że za każdym razem wokół pętli albo
i
jest zwiększana, alboj
jest zwiększana. Zatem pętla jest wykonywana przez większośćlen(X)+len(Y)
czasu.źródło
C (gcc), 82 bajty
Pobiera to dane wejściowe jako dwie tablice liczb całkowitych i ich długości (ponieważ C nie ma innego sposobu na uzyskanie ich długości). Można to wykazać, prowadzony w
O(a+b)
, ponieważ alboa
czyb
jest zmniejszana w każdej iteracji pętli, który kończy się, gdya
osiągnie0
(ib
nie może być zmniejszony poniżej0
).Wypróbuj online!
Niektóre uwagi:
Zamiast indeksować do tablic, zwiększanie wskaźników i dereferencjonowanie bezpośrednio zapisuje wystarczającą liczbę bajtów, aby było warto (
*x
vsx[a]
iy[1]
vsy[b+1]
).Do
--b&&
kontroli stanu dlab>1
okrężną drogą - jeślib
jest1
, to będzie ocenić na zero. Ponieważ to się zmieniab
, nie musimy go zmieniać w pierwszej gałęzi trójki (która się przesuway
), ale musimy to zmienić w drugiej (która się przesuwax
).Żadne
return
oświadczenie nie jest potrzebne, ponieważ czarna magia. (Myślę , że dzieje się tak, ponieważ ostatnią ocenianą instrukcją będzie zawszen+=...
wyrażenie, które używa tego samego rejestru, co rejestr zwracanych wartości.)źródło
Rubinowy, 88 bajtów
Wypróbuj online!
Ponadto, dla zabawy, krótsza anonimowa funkcja, która nie do końca spełnia ograniczenia dotyczące złożoności:
źródło
[5, 6], [0, 1, 5]
.JavaScript (Node.js) , 80 bajtów
x
,y
są przekazywane przez odniesienie, które nie kopiują treści1/v
jest fałszem, jeślix[i]
jest poza zasięgiem, prawdę mówiąc inaczejt
->d>y[j+1]-v
->v+v>y[j]+y[j+1]
jest fałszem, o ile spełnione są następujące warunki. I środki, którey[j]
oznacza liczbę najbliżejv
wy
v
jest mniejsza niż(y[j]+y[j+1])/2
luby[j+1]
jest poza zakresem, co można przeliczyć naNaN
i porównać zNaN
wydajnościąfalse
>
znaku, aby zaoszczędzić jeszcze 1 bajtt
jest zawsze wartością logiczną i*
konwertuje ją na0
/1
przed obliczeniemWypróbuj online!
źródło
Mathematica, 40 bajtów
Jeśli musisz utworzyć pełny program z danymi wejściowymi:
Oto czas do 1 000 000 punktów (próbkowanych co 10 000) dla
y
:Blisko do liniowego.
źródło