Dalam tantangan sederhana ini Anda akan diberikan array input L
bilangan bulat non-negatif dan sejumlah nampan b
lebih besar dari 0 tetapi tidak lebih dari panjangnya L
. Kode Anda harus mengembalikan array baru M
yang panjangnya b
dan yang telah membuang array L
. Ini paling mudah dijelaskan dengan contoh.
L = [1,0,5,1]
dan b = 2
kembali M = [1,6]
.
L = [0,3,7,2,5,1]
dan b = 3
kembali M = [3,9,6]
.
Sejauh ini, sangat sederhana. Namun dalam pertanyaan b
ini tidak harus membelah len(L)
. Dalam hal ini, nampan terakhir hanya memiliki jumlah yang lebih sedikit untuk menebusnya.
Setiap bin kecuali mungkin yang terakhir harus memiliki jumlah angka yang sama yang berkontribusi terhadap totalnya. Nampan terakhir tidak boleh memiliki lebih banyak angka yang berkontribusi daripada nampan lainnya. Tempat sampah terakhir harus memiliki jumlah yang berkontribusi sebanyak mungkin sesuai dengan aturan lainnya.
L = [0,3,7,2,5,1]
dan b = 4
kembali M = [3,9,6,0]
. M = [10,8,0,0]
bukan keluaran yang dapat diterima karena nampan ketiga tidak memiliki nomor nama yang berkontribusi sebagai nampan 1
dan 2
.
L = [0,3,7,2,5]
dan b = 2
kembali M = [10,7]
. M = [3, 14]
bukan keluaran yang dapat diterima karena nampan terakhir akan memiliki 3
elemen yang berkontribusi padanya tetapi yang pertama hanya memiliki 2
.
L = [1,1,1,1,1,1,1]
dan b = 3
kembali M = [3,3,1]
.
Sebagai aturan terakhir, kode Anda harus dijalankan dalam waktu linier.
Anda dapat menggunakan bahasa atau perpustakaan apa saja yang Anda suka dan dapat berasumsi bahwa input disediakan dengan cara apa pun yang Anda rasa nyaman.
Ternyata ada beberapa input yang tidak bisa diselesaikan. Sebagai contoh [1,1,1,1,1]
dan b=4
. Kode Anda dapat menampilkan apa pun yang diinginkan untuk input tersebut.
your code must run in linear time
- Saya akan menemukan algoritma yang tidak mengikuti ini secara alami sangat anehJawaban:
APL (Dyalog) , 19 byte
Cobalah online!
Kami menambahkan b nol ke array sebelum membentuknya kembali menjadi bagian yang sama
⌈⍺÷⍨≢⍵
( of panjang L ÷ b ⌉ ) dan menjumlahkannya, seperti yang digambarkan,⍺⍴0
, karena jumlah tempat kosong (yang bukan bagian dari array asli) lebih besar dari b - 1 akan diisi dengan setidaknya b - 1 elemen dari bongkahan lain, yang membuat titik penyeimbang grup terakhir maksimum b - 1 berbeda dari yang lain. Kami menggunakan b> b - 1 karena ini adalah kode golf.Misalnya, L dengan 15 elemen dan b = 3 tidak akan dikelompokkan sebagai
melainkan sebagai (perhatikan bagaimana 2
x
s paling kanan "mengisi" nol paling kiri)sedangkan array 16 elemen akan diisi dengan 2 ( 3 - 1 ) tempat kosong, seperti
sumber
Python 2 , 65 byte
Cobalah online!
sumber
R ,
75717063 byteCobalah online!
Ini bantalan
L
denganNA
sampai panjangnya adalah kelipatanb
, kemudian mengambil jumlah kolomL
sebagai matriks denganb
kolom, menghapusNA
nilai-nilai.Menjelaskan sebagai bahasa berbasis tumpukan:
sumber
function(L,b)colSums(matrix("length<-"(L,ceiling(length(L)/b)*b),,b),T)
no bytes saved for less readability
mungkin moto dari golf R ... meskipun saya kira itusum(L|1)
adalah byte yang disimpanlength(L)
!MATL , 6 byte
Cobalah online! Atau verifikasi semua kasus uji .
Penjelasan
Pertimbangkan input
4
,[0,3,7,2,5,1]
sebagai contoh.sumber
Ruby ,
5453 byteMenyimpan satu byte berkat @Kirill L.
Cobalah online!
sumber
[0]*b
dengan1..b
C (gcc) , 107 byte
Cobalah online!
sumber
Haskell , 61 byte
Cobalah online!
sumber
[1, 2, 3, 4, 5, 6] # 3
.Java 10,
968986 byteCobalah online di sini .
Temukan cara yang lebih singkat untuk menulis di
i/(n/b+(n%b==0?0:1)
sini:i/((n+b-1)/b)
Terima kasih kepada Olivier Grégoire karena bermain golf 3 byte.
Versi tidak disatukan:
sumber
Elixir , 98 byte
Cobalah online!
Elixir terbaik yang dimiliki adalah membelah menjadi beberapa bagian dengan panjang n . Dan itu tidak dapat menghentikan pembagian sebagai integer dengan sangat baik, jadi kami melakukan pembagian float, mengumpulkannya. Sayangnya satu-satunya cara untuk melakukan ini menghasilkan float, jadi kami membulatkannya lagi menjadi integer.
sumber
Perl 6 ,
52 5150 byte52 byte: Uji itu
51 byte: Uji itu
50 byte: Cobalah
47 byte non-bersaing Uji itu
Ini tidak bersaing karena
».sum
diperbolehkan melakukan perhitungan secara paralel. Jadi mungkin atau tidak dalam waktu linier.Diperluas:
sumber
Arang , 22 byte
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:
Masukan
b
.Masukan
L
.Mendorong
0
untukL
sampaiL
's panjang habis dibagib
.Bagi
L
panjang denganb
membagiL
menjadi beberapa bagian dari panjang itu, kemudian jumlah masing-masing bagian dan dilemparkan ke string untuk output implisit pada baris yang terpisah.sumber
JavaScript (Node.js) , 71 byte
Cobalah online!
sumber
C (dentang) , 58 byte
Cobalah online!
f()
mengambil parameter sebagai berikut::L
pointer ke array inputl
: panjang array inputb
: jumlah sampahm
: pointer ke buffer yang menerima array baruBerikut ini adalah versi kembali-masuk @ 60 byte:
sumber
PHP, 88 byte
fungsi anonim, mengambil array dan integer, mengembalikan array
Satu-satunya golf potensi ini harus telah menggantikan
ceil(count($a)/$b))
dengan(count($a)-1)/$b+1
dan menyingkat(count($a)-1)
dengan~-count($a)
. Float yang dihasilkan secara implisit dilemparkan ke integer dalamarray_chunk
panggilan.Cobalah online .
sumber