Binning trong thời gian


12

Nhiệm vụ trong thử thách này là đưa các yếu tố của một mảng vào các thùng thời gian. Đầu vào sẽ là một mảng không giảm các số nguyên dương biểu thị thời gian của các sự kiện và một số nguyên biểu thị kích thước của mỗi thùng. Hãy để chúng tôi bắt đầu với một ví dụ. Chúng tôi gọi mảng đầu vào Avà mảng đầu ra O.

`A = [1,1,1,2,7,10]` and `bin_size = 2`.

`O = [4,0,0,1,1]`.

Tại sao ? Với a bin_size = 2, chúng ta sẽ có các khoảng sau : (0,2], (2,4], (4,6], (6,8], (8,10], trong đó bốn mục (1,1,1,2)nằm trong khoảng đầu tiên (0,2], không có mục nào trong khoảng thứ hai và thứ ba, một 7trong khoảng (6,8]và một 10trong khoảng (8,10].

Mã của bạn nên xem xét từng khoảng thời gian bin_sizebắt đầu từ 0và đếm xem có bao nhiêu số Atrong mỗi số. Bạn phải luôn bao gồm đầu bên phải của một khoảng trong một thùng để trong ví dụ trên 2được bao gồm trong số đếm 4. Mã của bạn sẽ chạy trong thời gian tuyến tính bằng tổng độ dài của đầu vào và đầu ra.

Ví dụ khác:

`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]`.

Bạn có thể cho rằng đầu vào và đầu ra có thể được cung cấp ở bất kỳ định dạng nào bạn thấy thuận tiện. Bạn có thể sử dụng bất kỳ ngôn ngữ và thư viện nào bạn thích.


Là đầu ra với dấu vết 0được phép? Vì vậy, trở về [2,0,1,1,1,0]thay vì [2,0,1,1,1]?
Kevin Cruijssen 30/03/18

Không có số 0 xin vui lòng.

2
Thế còn những tình huống mà giá trị mảng tối đa không phải là bội số bin_size, chúng ta có thực sự nên xử lý chúng không? Có vẻ như hầu hết các câu trả lời đều có, nhưng nếu vậy, sẽ rất tốt nếu thêm một trường hợp thử nghiệm cho kịch bản này để tránh nhầm lẫn.
Kirill L.

@KirillL. Vâng, họ nên được xử lý quá.

1
@GPS 0 không phải là số nguyên dương. Đây không phải là một tai nạn :)

Câu trả lời:


9

R , 48 byte

function(n,s)table(cut(n,0:ceiling(max(n)/s)*s))

Hãy thử trực tuyến!

Một lần nữa, tablecutting đến một factorlàm các trick cho di chuyển chuột. Ví dụ, xuất ra một tên được đặt vectortrong đó các nameskhoảng, theo ký hiệu khoảng (0,5].

EDIT: Hoàn nguyên về phiên bản cũ hoạt động khi skhông phân chia n.


Tôi thực sự không R, nhưng trên TIO, điều này dường như xuất ra một phần format you [most likely do not] find convenientmà không có tablephần.
đại từ của tôi là monicareinstate 30/03/18

@someone chính xác là tại sao nó ở đó. cutchia vectơ thành các yếu tố với các mức được cho bởi các khoảng và tabletính số lần xuất hiện của từng giá trị duy nhất trong đầu vào của nó.
Giuseppe

1
@someone ah, tôi hiểu rồi, tôi hiểu nhầm ý kiến ​​của bạn. Không, tôi nghĩ rằng điều đó sẽ không hợp lệ vì chúng tôi cần số lượng của mỗi thùng.
Giuseppe

1
Chưa được kiểm tra đầy đủ, nhưng tôi nghĩ bạn có thể lưu lại một vài byte 0:ceiling(max(n)/s)*svới seq(0,max(n)+s-1,s). Nó hoạt động ít nhất cho hai mẫu trong câu hỏi.
Gregor - phục hồi Monica

1
@Gregor Hmm nếu điều đó hoạt động 1:max(n/s+1)*s-slà một cải tiến khác vì cả hai tương đương nhau
Giuseppe



3

Python 2 , 62 byte

I,s=input()
B=[0]*(~-I[-1]/s+1)
for i in I:B[~-i/s]+=1
print B

Hãy thử trực tuyến!


1
Trước hết: câu trả lời hay, tôi đã + 1-ed nó (và đã tạo một cổng trong Java, vì nó ngắn hơn một chút so với những gì tôi có). Tuy nhiên, không nên cho phép các số 0 không được phép (chỉ cần hỏi OP), vì vậy I[-1]/s+1nên ~-I[-1]/s+1thay thế.
Kevin Cruijssen 30/03/18

@KevinCruijssen Cảm ơn bạn đã thông báo!
Xác chết vào

3

05AB1E , 18 byte

θs/Å0¹vDyI/î<©è>®ǝ

Hãy thử trực tuyến!


Tôi không biết rõ về 05AB1E, nhưng điều này dường như gọi A.count max (A) , vì vậy thời gian chạy không phải là tuyến tính trong len (A) + len (O) . Điều đó đúng hay tôi đã làm gì sai?
Dennis

Số lượng @Dennis sẽ là O(max(A)*max(A))... vì vậy, nó là bậc hai trên mức tối đa của A ... OP đã chỉ định nó phải là tuyến tính theo ... chính xác là gì?
Bạch tuộc ma thuật Urn

2
@MagicOctopusUrn Mã của bạn sẽ chạy trong thời gian tuyến tính theo tổng độ dài của đầu vào và đầu ra , theo sửa đổi mới nhất.
Dennis

2
@Dennis mà có vẻ khá độc đoán.
Bạch tuộc ma thuật Urn

2
@MagicOctopusUrn Đó là định nghĩa hợp lý duy nhất cho thời gian tuyến tính cho câu hỏi này tôi nghĩ.

2

APL + THẮNG, 23 byte

Lời nhắc cho đầu vào màn hình của các thùng sau đó vectơ số nguyên:

+⌿<\v∘.≤b×⍳⌈⌈/(v←⎕)÷b←⎕    

Giải trình:

⎕ Prompt for input

⌈⌈/(v←⎕)÷b←⎕ divide the integers by bin size, take maximum and round up for number of bins

b×⍳ take number of bins from previous step and create a vector of bin upper boundaries

v∘.≤ apply outer product to generate boolean matrix where elements of vector ≤ boundaries

<\ switch off all 1's after first 1 in each row to filter multiple bin allocations

+⌿ sum columns for the result


2

Java 8, 75 byte

a->b->{var r=new int[~-a[a.length-1]/b+1];for(int i:a)r[~-i/b]++;return r;}

Câu trả lời Python 2 của Port @ DeadPossum , vì vậy hãy đảm bảo nâng cao câu trả lời của anh ấy!

Giải trình:

Hãy thử trực tuyến.

a->b->{          // Method with integer-array and integer parameters and no return-type
  var r=new int[~-a[a.length-1]/b+1];
                 //  Result integer-array of size `((last_item-1)/bin_length)+1`
  for(int i:a)   //  Loop over the input-array
    r[~-i/b]++;  //   Increase the value at index `(i+1)/bin_length` by 1
  return r;}     //  Return the result-array


2

JavaScript (ES6), 60 byte / O (len (a) + max (a) / n)

Đã lưu 5 byte nhờ @Neil

Đưa đầu vào theo cú pháp currying (a)(n).

a=>n=>[...a.map(x=>o[x=~-x/n|0]=-~o[x],o=[])&&o].map(n=>~~n)

Hãy thử trực tuyến!

Hoặc chỉ 43 byte / O (len (a)) nếu các phần tử trống được cho phép.


[...o].map(n=>n|0)được đầu ra đầu tiên từ giải pháp thứ hai với ít byte hơn.
Neil

@Neil Không chắc tại sao tôi lại đi tìm thứ gì đó quá phức tạp. : - /
Arnauld

2

Haskell , 63 75 70 byte

l!n=l#[n,2*n..]
[]#_=[]
l#(b:i)|h<-length$takeWhile(<=b)l=h:drop h l#i

Rất tiếc, cái ngắn hơn này không phải là tuyến tính mà là bậc hai;

l!n=l#[n,2*n..]
[]#_=[]
l#(b:i)=sum[1|a<-l,a<=b]:[a|a<-l,a>b]#i

Hãy thử trực tuyến!


1

Bình thường, 23 22 byte

Jm/tdeQhQK*]ZheJhXRK1J

Hãy thử nó ở đây

Jm/tdeQhQK*]ZheJhXRK1J
Jm/tdeQhQ                 Find the bin for each time and save them as J.
         K*]ZheJ          Create empty bins.
                 XRK1J    Increment the bins for each time within them.
                h         Take the first (because mapping returned copies).

1

Ruby , 53 50 byte

Chỉnh sửa: -3 byte bởi iamnotmaynard.

->a,b{(0..~-a.max/b).map{|i|a.count{|x|~-x/b==i}}}

Hãy thử trực tuyến!


Điều này không hoạt động khi a.maxkhông phải là bội số của b(ví dụ f[[1,1,1,2,7,10],3]=> [4, 0, 1]nhưng nên cung cấp [4, 0, 2]). Tôi đã thử cách tiếp cận tương tự.
Tái lập lại Monica - notmaynard 30/03/18

(hay đúng hơn [4, 0, 1, 1])
Tái lập lại Monica - notmaynard 30/03/18

Chà, điều này có thể khắc phục bằng cách chuyển sang giá trị phạm vi tối đa float, nhưng tôi cũng sẽ yêu cầu OP làm rõ điều này trong phần mô tả tác vụ.
Kirill L.


Đẹp, thậm chí tốt hơn, cảm ơn.
Kirill L.

1

Câu đố này về cơ bản là một Count-sort. Chúng tôi không biết độ dài của đầu ra mà không thông qua đầu vào.

C (tiếng kêu) , 53 byte

i,j;f(*A,l,b,*O){for(j=0;j<l;O[(A[j++]+b-1)/b-1]++);}

Hãy thử trực tuyến!

Giải pháp này có các tham số sau: chiều dài
Amảng đầu vào
lcủa bộ lưu trữ
bbin_size
Ocho Đầu ra. Phải đủ độ dài
và trả về đầu ra trong O.

Giải pháp này có một điểm chấp: nó không trả về độ dài của mảng đầu ra O và vì vậy người gọi không biết in bao nhiêu.

Phiên bản sau khắc phục điểm chấp đó:

C (tiếng kêu) , 79 byte

i,j,k;f(*A,l,b,*O,*m){for(k=j=0;j<l;O[i=(A[j++]+b-1)/b-1]++,k=k>i?k:i);*m=++k;}

Hãy thử trực tuyến!

Nó cần một tham số bổ sung mvà trả về độ dài của Onó. Nó có giá 26 byte.


1

C (gcc) , 102 90 89 86 byte

#define P!printf("%d ",k)
i,j,k;f(s){for(i=s;~scanf("%d",&j);k++)for(;j>i;i+=s)k=P;P;}

Hãy thử trực tuyến!

Cảm ơn Kevin Cruijssen vì đã cắt giảm 12 byte và trần cho thêm 4 byte!


1
90 byte bằng cách sử dụng các vòng lặp for, loại bỏ intvà thay đổi ==1thành >0.
Kevin Cruijssen 30/03/18

Không có gì. Btw, chỉ là một ghi chú, hiện tại nó không hợp lệ (giống như câu trả lời Java hiện đã bị xóa của tôi). Đó là yêu cầu để chạy trong O(n)thời gian, vì vậy bạn không thể có bất cứ lồng cho-vòng .. (bạn C ++ câu trả lời có vẻ tốt đẹp, mặc dù vậy tôi đã + 1-ed rằng một :)..)
Kevin Cruijssen

Nó vẫn là O (n). Vòng lặp bên trong sẽ luôn in một giá trị và chúng tôi chỉ in (giá trị tối đa + 1) / tổng giá trị binsize.
G. Sliepen

Hmm, nhưng không phải là vòng lặp bên ngoài O(n)bằng cách lặp qua các mục đầu vào. Ngay cả khi vòng lặp bên trong sẽ chỉ lặp lại 2 lần, nó đã ở trên O(n). Hoặc tôi đang hiểu nhầm điều gì đó .. Tôi phải thừa nhận - Ođôi khi không thực sự là chuyên môn của tôi ..
Kevin Cruijssen

1
Nhưng vòng lặp bên trong không lặp lại trên tất cả các yếu tố đầu vào, nó chỉ lặp đi lặp lại qua nhiều giá trị đầu ra cần in để "bắt kịp" vị trí tương ứng với yếu tố đầu vào mới nhất. Nếu vectơ đầu vào bao gồm rất nhiều trùng lặp hoặc giá trị khác nhau nhỏ hơn kích thước bin, vòng lặp bên trong sẽ không thực hiện bất kỳ lần lặp nào cả. Mặt khác, nếu vectơ đầu vào rất thưa thớt, thì vòng lặp bên trong sẽ thực hiện nhiều lần lặp hơn, in 0 '. Vì vậy, để chính xác, mã chạy trong thời gian O ((số phần tử đầu vào) + (kích thước phần tử / thùng cuối cùng)). Đây vẫn là tuyến tính.
G. Sliepen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.