Zadaniem w tym wyzwaniu jest umieszczenie elementów tablicy w przedziałach czasowych. Dane wejściowe będą stanowić nie malejącą tablicę dodatnich liczb całkowitych reprezentujących czas zdarzeń oraz liczbę całkowitą reprezentującą rozmiar każdego przedziału. Zacznijmy od przykładu. Nazywamy tablicę wejściową A
i tablicę wyjściową O
.
`A = [1,1,1,2,7,10]` and `bin_size = 2`.
`O = [4,0,0,1,1]`.
Dlaczego ? Za pomocą a bin_size = 2
mamy następujące przedziały:, w (0,2], (2,4], (4,6], (6,8], (8,10]
których cztery elementy (1,1,1,2)
znajdują się w pierwszym przedziale (0,2]
, żaden w drugim i trzecim przedziale, jeden 7
w przedziale (6,8]
i jeden 10
w przedziale (8,10]
.
Twój kod powinien uwzględniać każdy przedział długości, bin_size
zaczynając od, 0
i liczyć, ile jest w A
nim liczb . Zawsze powinieneś umieszczać prawy koniec przedziału w pojemniku, więc w powyższym przykładzie 2
jest on uwzględniony w liczbie 4
. Twój kod powinien działać w czasie liniowym jako suma długości danych wejściowych i wyjściowych.
Więcej przykładów:
`A = [1,2,7,12,15]` and `bin_size = 5`.
`O = [2, 1, 2]`.
`A = [1,2,7,12,15]` and `bin_size = 3`.
`O = [2,0,1,1,1]`.
Możesz założyć, że dane wejściowe i wyjściowe można podawać w dowolnym dogodnym dla siebie formacie. Możesz używać dowolnych języków i bibliotek.
0
dozwolone są wyjścia ze znakami końcowymi ? Więc wracasz[2,0,1,1,1,0]
zamiast[2,0,1,1,1]
?bin_size
, czy naprawdę powinniśmy sobie z tym poradzić? Wydaje się, że większość odpowiedzi tak, ale jeśli tak, dobrze byłoby dodać przypadek testowy dla tego scenariusza, aby zapobiec nieporozumieniom.Odpowiedzi:
R , 48 bajtów
Wypróbuj online!
Jeszcze raz
table
icut
zadzwoń dofactor
sztuczki na binowanie. Wypisuje nazwaną,vector
gdzienames
są przedziały, na przykład w notacji przedziałowej(0,5]
.EDYCJA: Przywróć wcześniejszą wersję, która działa, gdy
s
nie dzielin
.źródło
format you [most likely do not] find convenient
beztable
części.cut
dzieli wektor na czynniki o poziomach podanych w interwałach itable
zlicza wystąpienia każdej unikalnej wartości na wejściu.0:ceiling(max(n)/s)*s
zseq(0,max(n)+s-1,s)
. Działa przynajmniej dla dwóch próbek w pytaniu.1:max(n/s+1)*s-s
to kolejne ulepszenie, ponieważ oba są równoważneOktawa , 36 bajtów
Wypróbuj online!
Polowanie na pisanki i rozpalanie ogniska. Dodam wyjaśnienie, kiedy będę miał czas.
źródło
Perl 5
-a
-i
,3228 bajtówPodaj liczbę po opcji -i. Daj każdy element wejściowy w osobnej linii na STDIN
Wypróbuj online!
źródło
Python 2 , 62 bajty
Wypróbuj online!
źródło
I[-1]/s+1
powinno być~-I[-1]/s+1
zamiast.05AB1E , 18 bajtów
Wypróbuj online!
źródło
A.count
max (A) , więc czas działania nie jest liniowy w len (A) + len (O) . Czy to prawda, czy coś nie tak?O(max(A)*max(A))
... więc jest kwadratowa względem maksimum A ... OP określonego, że musi być liniowa pod względem ... co dokładnie?APL + WIN, 23 bajty
Monity o wprowadzenie ekranów pojemników, a następnie wektora liczb całkowitych:
Wyjaśnienie:
źródło
C ++ (gcc) ,
9083 bajtówWypróbuj online!
źródło
Java 8, 75 bajtów
Port odpowiedzi na Python 2 w DeadPossum , więc pamiętaj, aby głosować na jego odpowiedź!
Wyjaśnienie:
Wypróbuj online.
źródło
Rubinowy , 60 bajtów
Wypróbuj online!
źródło
JavaScript (ES6), 60 bajtów / O (len (a) + max (a) / n)
Zaoszczędź 5 bajtów dzięki @Neil
Pobiera dane wejściowe w składni curry
(a)(n)
.Wypróbuj online!
Lub tylko 43 bajty / O (len (a)), jeśli dozwolone są puste elementy.
źródło
[...o].map(n=>n|0)
pobiera pierwsze wyjście z drugiego rozwiązania w mniejszej liczbie bajtów.Haskell ,
637570 bajtówUps, ten krótszy nie jest liniowy, lecz kwadratowy;
Wypróbuj online!
źródło
Pyth,
2322 bajtówWypróbuj tutaj
źródło
Rubin ,
5350 bajtówEdycja: -3 bajty przez iamnotmaynard.
Wypróbuj online!
źródło
a.max
nie jest wielokrotnościąb
(np.f[[1,1,1,2,7,10],3]
=>,[4, 0, 1]
Ale powinno dać[4, 0, 2]
). Próbowałem tego samego podejścia.[4, 0, 1, 1]
)Ta łamigłówka to w zasadzie Count-sort. Nie znamy długości wyjścia bez uprzedniego przejrzenia danych wejściowych.
C (brzęk) , 53 bajty
Wypróbuj online!
To rozwiązanie przyjmuje następujące parametry: długość
A
tablicy wejściowej pamięci bin_size dla Output. Musi mieć wystarczającą długośćl
b
O
i zwraca wynik w O.
To rozwiązanie ma utrudnienie: nie zwraca długości tablicy wyjściowej O, więc osoba dzwoniąca nie wie, ile wydrukować.
Poniższa wersja pokonuje ten utrudnienie:
C (brzęk) , 79 bajtów
Wypróbuj online!
Wymaga dodatkowego parametru
m
i zwracaO
w nim długość . Kosztowało mnie 26 bajtów.źródło
C (gcc) ,
102908986 bajtówWypróbuj online!
Podziękowania dla Kevina Cruijssena za wykrawanie 12 bajtów, a dla kota sufitowego za kolejne 4 bajty!
źródło
int
i zmieniając==1
na>0
.O(n)
czasie, więc nie możesz mieć żadnych zagnieżdżonych pętli for. (Twoja odpowiedź w C ++ wydaje się być w porządku. Więc mam +1 + ed. :))O(n)
przez zapętlenie elementów wejściowych. Nawet jeśli wewnętrzna pętla zapętliby się tylko 2 razy, to już jest powyżejO(n)
. A może coś źle zrozumiałem ... Muszę przyznać, żeO
czasy nie są tak naprawdę moją wiedzą ...