Membuang waktu


12

Tugas dalam tantangan ini adalah untuk memasukkan elemen-elemen dari array ke dalam tempat waktu. Input akan berupa susunan bilangan bulat positif yang tidak berkurang yang menunjukkan waktu kejadian, dan bilangan bulat yang mewakili ukuran setiap nampan. Mari kita mulai dengan sebuah contoh. Kami memanggil array input Adan array output O.

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

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

Mengapa ? Dengan a bin_size = 2, kita akan memiliki interval berikut:, di (0,2], (2,4], (4,6], (6,8], (8,10]mana empat item (1,1,1,2)berada dalam interval pertama (0,2], tidak ada di interval kedua dan ketiga, satu 7di interval (6,8], dan satu 10di interval (8,10].

Kode Anda harus mempertimbangkan setiap interval panjang bin_sizemulai dari 0dan menghitung berapa banyak angka Adi masing-masing. Anda harus selalu memasukkan ujung kanan sebuah interval ke nampan sehingga dalam contoh di atas 2termasuk dalam hitungan 4. Kode Anda harus berjalan dalam waktu linier dalam jumlah panjang input dan output.

Lebih banyak contoh:

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

Anda dapat mengasumsikan bahwa input dan output dapat diberikan dalam format apa pun yang Anda rasa nyaman. Anda dapat menggunakan bahasa dan perpustakaan apa saja yang Anda suka.


Apakah output dengan trailing 0dibolehkan? Jadi, [2,0,1,1,1,0]bukannya kembali [2,0,1,1,1]?
Kevin Cruijssen

Tolong, tidak ada nol tambahan.

2
Bagaimana dengan situasi di mana nilai array maks bukan kelipatan bin_size, haruskah kita benar-benar menangani ini? Tampaknya sebagian besar jawaban memang benar, tetapi jika demikian, alangkah baiknya untuk menambahkan test case untuk skenario ini untuk mencegah kebingungan.
Kirill L.

@ KirillL. Ya mereka harus ditangani juga.

1
@ GPS 0 bukan bilangan bulat positif. Ini bukan kecelakaan :)

Jawaban:


9

R , 48 byte

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

Cobalah online!

Sekali lagi, tabledan cutting untuk factormelakukan trik untuk binning tersebut. Menghasilkan nama vectortempat namesinterval, dalam notasi interval, misalnya (0,5],.

EDIT: Kembalikan ke versi sebelumnya yang berfungsi saat stidak dibagi n.


Saya benar-benar tidak R, tetapi pada TIO ini tampaknya menghasilkan format you [most likely do not] find convenienttanpa tablebagian.
kata ganti saya adalah monicareinstate

@ Seseorang yang persis mengapa ada di sana. cutmembagi vektor menjadi faktor dengan level yang diberikan oleh interval, dan tablemenghitung kemunculan setiap nilai unik dalam inputnya.
Giuseppe

1
@ seseorang, saya mengerti, saya salah mengerti komentar Anda. Tidak, saya pikir itu tidak akan valid karena kami membutuhkan jumlah setiap bin.
Giuseppe

1
Tidak sepenuhnya diuji, tapi saya pikir Anda dapat menyimpan beberapa byte 0:ceiling(max(n)/s)*sdengan reaplacing seq(0,max(n)+s-1,s). Ini berfungsi setidaknya untuk dua sampel dalam pertanyaan.
Gregor Thomas

1
@ Gregor Hmm jika itu berhasil 1:max(n/s+1)*s-sadalah perbaikan lain karena keduanya setara
Giuseppe


3

Perl 5 -a -i , 32 28 byte

Berikan hitungan setelah opsi -i. Berikan setiap elemen input pada baris terpisah di STDIN

$G[~-$_/$^I]--}{say-$_ for@G

Cobalah online!


2
Ini mengesankan.

3

Python 2 , 62 byte

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

Cobalah online!


1
Pertama-tama: jawaban yang bagus, saya sudah memberi +1 padanya (dan membuat port di Jawa, karena ini sedikit lebih pendek dari yang saya punya). Mengejar nol tidak diizinkan (hanya bertanya OP), jadi I[-1]/s+1sebaiknya ~-I[-1]/s+1sebaliknya.
Kevin Cruijssen

@KevinCruijssen Terima kasih atas pemberitahuan!
Dead Possum

3

05AB1E , 18 byte

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

Cobalah online!


Saya tidak tahu 05AB1E dengan baik, tapi ini sepertinya memanggil A.count max (A) , jadi run time tidak linier di len (A) + len (O) . Apakah itu benar atau saya salah?
Dennis

@Dennis menghitung akan O(max(A)*max(A))... jadi kuadrat pada maksimum A ... OP ditentukan itu harus linier dalam hal ... apa sebenarnya?
Magic Octopus Urn

2
@MagicOctopusUrn Kode Anda harus berjalan dalam waktu linier dalam jumlah panjang input dan output , sesuai dengan revisi terbaru.
Dennis

2
@ Dennis yang tampaknya agak sewenang-wenang.
Magic Octopus Urn

2
@ MagicOctopusUrn Ini satu-satunya definisi yang masuk akal untuk waktu linier untuk pertanyaan ini, saya pikir.

2

APL + WIN, 23 byte

Meminta input layar dari nampan kemudian vektor bilangan bulat:

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

Penjelasan:

⎕ 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;}

Port of @ DeadPossum's Python 2 answer , jadi pastikan untuk mengunggah jawabannya!

Penjelasan:

Cobalah online.

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) + maks (a) / n)

Disimpan 5 byte berkat @Neil

Mengambil input dalam sintaks currying (a)(n).

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

Cobalah online!

Atau hanya 43 byte / O (len (a)) jika elemen kosong diizinkan.


[...o].map(n=>n|0)mendapatkan output pertama dari solusi kedua dalam lebih sedikit byte.
Neil

@ Neil Tidak yakin mengapa saya pergi untuk sesuatu yang berbelit-belit. : - /
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

Ups, yang lebih pendek ini tidak linier tetapi kuadrat;

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

Cobalah online!


1

Pyth, 23 22 byte

Jm/tdeQhQK*]ZheJhXRK1J

Coba di sini

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

Edit: -3 byte oleh iamnotmaynard.

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

Cobalah online!


Ini tidak berfungsi ketika a.maxbukan kelipatan b(misalnya f[[1,1,1,2,7,10],3]=> [4, 0, 1]tetapi harus memberi [4, 0, 2]). Saya telah mencoba pendekatan yang sama.
Pasang kembali Monica - notmaynard

(atau lebih tepatnya [4, 0, 1, 1])
mengembalikan Monica - notmaynard

Nah, ini bisa diperbaiki dengan beralih ke nilai rentang max float, tapi saya juga akan meminta OP untuk menjelaskan ini dalam deskripsi tugas.
Kirill L.


Bagus, bahkan lebih baik, terima kasih.
Kirill L.

1

Teka-teki ini pada dasarnya adalah Count-sort. Kami tidak tahu panjang output tanpa melalui input terlebih dahulu.

C (dentang) , 53 byte

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

Cobalah online!

Solusi ini mengambil parameter berikut: panjang
Aarray input penyimpanan bin_size untuk Output. Harus cukup panjang dan mengembalikan output di O.
l
b
O

Solusi ini memiliki kekurangan: ia tidak mengembalikan panjang larik keluaran O, dan karenanya penelepon tidak tahu berapa banyak yang harus dicetak.

Versi berikut mengatasi cacat itu:

C (dentang) , 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;}

Cobalah online!

Dibutuhkan parameter tambahan mdan mengembalikan panjang Odi dalamnya. Harganya 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;}

Cobalah online!

Terima kasih kepada Kevin Cruijssen karena memangkas 12 byte, dan ceilingcat untuk 4 byte lainnya!


1
90 byte dengan menggunakan for-loop, menghapus int, dan mengubah ==1ke >0.
Kevin Cruijssen

Sama-sama. Btw, hanya sebuah catatan, saat ini tidak valid (sama seperti jawaban Java saya yang sekarang dihapus) Ini diperlukan untuk berjalan O(n)tepat waktu, sehingga Anda tidak dapat memiliki loop untuk bersarang ... (Jawaban C ++ Anda tampaknya baik-baik saja. Jadi saya telah memberi +1 pada yang itu. :))
Kevin Cruijssen

Masih O (n). Loop dalam akan selalu mencetak nilai, dan kami hanya mencetak (nilai maks + 1) / nilai-nilai bisnis secara total.
G. Sliepen

Hmm, tetapi bukankah sudah loop luar O(n)dengan mengulang item input. Bahkan jika loop dalam hanya akan loop 2 kali sudah di atas O(n). Atau apakah saya salah paham akan sesuatu .. Saya harus mengakui - Okadang-kadang bukan keahlian saya ..
Kevin Cruijssen

1
Tetapi loop dalam tidak mengulangi semua elemen input, itu hanya mengulangi berapa banyak nilai output yang perlu dicetak untuk "mengejar" posisi yang sesuai dengan elemen input terbaru. Jika vektor input terdiri dari banyak duplikat atau nilai yang berbeda kurang dari ukuran nampan, loop dalam tidak akan melakukan iterasi sama sekali. Di sisi lain, jika vektor input sangat jarang, maka loop dalam akan melakukan lebih banyak iterasi, mencetak 0's. Jadi benar, kode berjalan di O ((jumlah elemen input) + (elemen terakhir / ukuran bin)) waktu. Ini masih linear.
G. Sliepen
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.