Anda diberi array multi-dimensi bilangan bulat. Setiap dimensi memiliki ukuran tetap (sehingga akan selalu persegi panjang jika 2D). Program Anda harus menghitung jumlah di setiap dimensi dan menambahkan jumlahnya sebagai item terakhir baru di dimensi itu.
Asumsikan array input dan output adalah A dan B, dan ukuran dimensi i dari A adalah n i . B akan memiliki jumlah dimensi yang sama dengan A dan ukuran dimensi i menjadi n i +1. B j 1 , j 2 , ..., j m adalah jumlah dari A k 1 , k 2 , ..., k m di mana:
- k i = j i jika j i <= n i
- 0 <k i <= n i jika j i = n i +1
Untuk input:
[[1 2 3]
[4 5 6]]
Program Anda (atau fungsi) harus menampilkan:
[[1 2 3 6]
[4 5 6 15]
[5 7 9 21]]
Input hanya berisi array. Jumlah total dimensi dan ukuran setiap dimensi tidak diberikan dalam input. (Tapi Anda bisa mendapatkannya dari array dengan kode Anda sendiri.) Anda dapat menggunakan format daftar yang mudah digunakan dalam bahasa Anda, asalkan tidak menentukan jumlah dimensi atau ukuran dimensi secara langsung.
Input memiliki setidaknya 1 dimensi, dan memiliki setidaknya 1 item dalam array.
Ini adalah kode-golf. Kode terpendek menang.
Uji kasus
Input:
[5 2 3]
Output:
[5 2 3 10]
Input:
[[1 2 3] [4 5 6]]
Outputs:
[[1 2 3 6] [4 5 6 15] [5 7 9 21]]
Input:
[[[1] [1] [1] [0]]]
Output:
[[[1 1] [1 1] [1 1] [0 0] [3 3]] [[1 1] [1 1] [1 1] [0 0] [3 3]]]
Input:
[[[[-1]]]]
Output:
[[[[-1 -1] [-1 -1]] [[-1 -1] [-1 -1]]] [[[-1 -1] [-1 -1]] [[-1 -1] [-1 -1]]]]
sumber
Jawaban:
J, 14 byte
Pemakaian:
Fungsi ini setara dengan yang berikut ini
(0|:],+/)^:(#@$)
tetapi menggunakan kata keterangan yang ditentukan pengguna untuk menyimpan parens.Penjelasan untuk kode yang terakhir dari kanan ke kiri:
^:(#@$)
ulangi^:
untuk jumlah#
dimensi$
:],+/
menggabungkan,
argumen]
dengan jumlah itu pada dimensi terakhir+/
0|:
putar dimensi|:
dengan meletakkan yang pertama0
ke akhir daftar dimensiSetelah melakukan prosedur di atas, kami mendapatkan kembali input asli dengan jumlah pada semua dimensi.
Untuk solusi lama saya periksa riwayat revisi.
Cobalah online di sini.
sumber
Mathematica,
3220 byteContoh:
Penjelasan:
Bentuk lengkap
{{1, 2, 3}, {4, 5, 6}}
isList[List[1, 2, 3], List[4, 5, 6]]
. Kemudian ganti semuaList
s dalam ekspresi dengan fungsi({##,+##}&)
.sumber
Python 2, 95 byte
Ini berulang setiap dimensi, menggabungkan jumlah menggunakan NumPy.
Saya menemukan NumPy
r_
, yang cukup bagus untuk bermain golf.r_[:n]
lebih pendek darirange(n)
dan jauh lebih kuat (misr_[:4, 7, 8, 10:100:10]
.). Itu juga dapat melakukan hal-hal lain seperti penggabungan sepanjang sumbu arbitrer.Contoh penggunaan:
sumber
APL,
1615 byteTerima kasih kepada @ user23013 untuk bermain golf 3 byte dan mencari tahu format input yang tepat.
Verifikasi kasus uji online dengan TryAPL .
Ide
Gagasan umum adalah sama seperti dalam pengajuan CJam saya, yang mana APL memungkinkan implementasi yang jauh lebih pendek. Ini hanya terdiri dari dua langkah:
Jumlah array di dimensi terluarnya.
Ulangi langkah 1 untuk setiap subarray.
Kode
sumber
,⊂(,1)(,1)(,1)(,0)
dan,⊂,⊂,⊂,¯1
masing - masing. Jadi, Anda dapat menghapus karakter lain.Pip ,
1815 byteIni adalah fungsi anonim, yang mengambil array sebagai argumen dan mengembalikan hasilnya. Contoh doa, menggunakan
-p
bendera untuk mendapatkan hasil yang dapat dibaca:Idenya pada dasarnya sama dengan APL Dennis , meskipun diturunkan secara independen. Lebih spesifik:
Metode ini berfungsi karena
+
(bersama dengan banyak operator lain) fungsi item-bijaksana pada daftar di Pip - fitur yang terinspirasi oleh bahasa pemrograman array seperti APL. Jadi ketika Anda$+
daftar suka[[1 2 3] [4 5 6]]
, hasilnya[5 7 9]
seperti yang diinginkan. Juga digunakan dalam tes daftar-atau-skalar:[1 2 3] - [1 2 3]
memberi[0 0 0]
, yang benar (seperti semua daftar kecuali daftar kosong).Versi 18-byte sebelumnya:
Perubahan:
[1 2 3] != 123
);M
lebih diutamakan daripada?
(meskipun saya mungkin akan mengubah itu, terutama sekarang): tanpa mereka, kode akan diurai sebagai(Ja=a?af)M(aAE$+a)
, mengarah ke pesan kesalahan aneh. Namun, argumen tengah operator ternary dapat setiap ekspresi diutamakan apapun, tidak ada tanda kurung diperlukan. Jadi dengan membuat daftar kasus kebenaran, saya dapat menyimpan dua byte itu.sumber
APL (25)
Array APL memiliki dimensi bawaan, jadi ini adalah fungsi yang mengambil larik n- dimensi dan kemudian menjumlahkan di sepanjang setiap dimensi.
Penjelasan:
N←⍵
: simpan array diN
.⍴⍴N
: dapatkan jumlah dimensi yangN
dimilikinya. (Berikan⍴
dimensi, yaitu⍴↑(1 2 3)(4 5 6)
memberi2 3
, sehingga⍴⍴
memberikan dimensi dari dimensi.){
...}¨⍳
: untuk setiap nomor dari 1 hingga⍴⍴N
:+/[⍵]N
: jumlahN
sepanjang dimensi⍵
N,[⍵]←
: gabungkan hasilnya keN
dalam dimensi ituN
: akhirnya, kembaliN
.sumber
↑(1 2 3)(4 5 6)
dilakukan adalah hanya membangun array 2 dimensi dari 2 yang menggunakan 1 dimensi↑
. Ini bukan notasi bawaan dan tidak menggeneralisasi cara Anda berpikir. Cara kanonik untuk membangun array ke-3 dan ke-4 adalah1 4 1⍴1 1 1 0
dan1 1 1 1⍴¯1
, tetapi juga memungkinkan untuk membangunnya tanpa merujuk pada ukuran, mis., Array ketiga juga dapat dibangun dengan↑⍉⍪(,1)(,1)(,1)(,0)
, yang keempat dapat dibangun dengan↑⍪⊂⍪¯1
.f←{0=≡⍵:⍵⋄f¨⍵,+/⍵}⋄f((1 2)(3 4))((5 6)(7 8))
), tetapi tampaknya vektor bersarang dan array berbeda dan yang pertama tidak membedakan skalar dari singleton ...{×≡⍵:∇¨⍵,+/⍵⋄⍵}((1 2)(3 4))((5 6)(7 8))
. Tetap:{×⍴⍴⍵:∇↓⍵,+/⍵⋄⍵}1 4 1⍴1 1 1 0
. Ini lebih pendek dari Mathematica sekarang ...CJam, 36 byte
Ini adalah fungsi bernama rekursif yang memunculkan array dari tumpukan dan mengembalikannya.
Coba kasus uji dalam juru bahasa CJam .
Ide
Sayangnya, CJam tidak memiliki beberapa operator otomatis yang memungkinkan untuk menambahkan array bersarang secara sewenang-wenang, jadi kami harus mengimplementasikannya sendiri. Untungnya, ia melakukan itu dua operator infiks,
:
(mengurangi) dan.
(vectorize), yang akan terbukti bermanfaat untuk tugas ini.Langkah pertama adalah menghitung jumlah dimensi. Ini mudah: Konversi array menjadi representasi stringnya dan hitung jumlah leading [ 's.
Sekarang, untuk mengurangi array satu dimensi, Anda biasanya hanya menjalankan
:+
:Untuk array dua dimensi,
+
akan melakukan penggabungan bukannya penambahan, jadi kita harus mengubahnya:Sekarang, untuk array tiga dimensi,
.+
akan beroperasi pada array dua dimensi dan melakukan, sekali lagi, penggabungan. Kali ini, kita harus membuat vektor.+
:Untuk kasus umum, array dimensi D , kita harus menghubungkan satu
:
, D - 1.
dan satu+
.Tentu saja, ini hanya menjumlahkan array hanya di dimensi terluarnya. Kita dapat menyelesaikan ini dengan mendefinisikan fungsi S yang menghitung dimensi (dan tidak melakukan apa-apa jika itu nol), melakukan penjumlahan seperti yang ditunjukkan di atas dan, akhirnya, berlaku sendiri untuk elemen-elemen array.
Kode
sumber
Ruby (
181139119108 byte)Mengasumsikan input dilewatkan sebagai JSON.
sumber
d
dalam jawaban ini.Java, 669 byte
tidak akan berbohong, saya cukup bangga pada diri saya untuk yang satu ini: hal
diperluas dengan pengujian:
menjalankan versi pengujian yang diperluas mencetak ini:
sumber