Bahasa tingkat rendah, seperti C dan C ++ sebenarnya tidak memiliki konsep array multidimensi. (Selain vektor dan array dinamis) Saat Anda membuat array multidimensi dengan
int foo[5][10];
Ini sebenarnya hanya gula sintaksis . Apa yang sebenarnya dilakukan C adalah membuat sebuah array bersebelahan yang terdiri dari 5 * 10 elemen. Ini
foo[4][2]
juga merupakan gula sintaksis. Ini benar-benar merujuk pada elemen di
4 * 10 + 2
atau, elemen ke-42. Secara umum, indeks elemen [a][b]
dalam array foo[x][y]
berada di
a * y + b
Konsep yang sama berlaku untuk array 3d. Jika kita memiliki foo[x][y][z]
dan mengakses elemen, [a][b][c]
kita benar-benar mengakses elemen:
a * y * z + b * z + c
Konsep ini berlaku untuk n- dimensi array. Jika kita memiliki array dengan dimensi D1, D2, D3 ... Dn
dan kita mengakses elemen S1, S2, S3 ... Sn
rumusnya
(S1 * D2 * D3 ... * Dn) + (S2 * D3 * D4 ... * Dn) + (S3 * D4 ... * Dn) ... + (Sn-1 * Dn) + Sn
Tantangan
Anda harus menulis program atau fungsi yang menghitung indeks array multidimensi sesuai dengan rumus di atas. Input akan menjadi dua array. Array pertama adalah dimensi, dan array kedua adalah indeks. Panjang kedua array ini akan selalu sama dan setidaknya 1.
Anda dapat dengan aman mengasumsikan bahwa setiap angka dalam array akan menjadi bilangan bulat non-negatif. Anda juga dapat mengasumsikan bahwa Anda tidak akan mendapatkan 0
dalam array dimensi, meskipun a 0
mungkin ada dalam indeks. Anda juga dapat mengasumsikan bahwa indeks tidak akan lebih besar dari dimensi.
Tes IO
Dimensions: [5, 10]
Indices: [4, 2]
Output: 42
Dimensions: [10, 10, 4, 62, 7]
Indices: [1, 2, 3, 4, 5]
Output: 22167
Dimensions: [5, 1, 10]
Indices: [3, 0, 7]
Output: 37
Dimensions: [6, 6, 6, 6, 6, 6, 6, 6, 6, 6]
Indices: [3, 1, 5, 5, 3, 0, 5, 2, 5, 4]
Output: 33570178
sumber
int[10]
.Jawaban:
APL, 1 byte
Uji di TryAPL .
sumber
J, 2 byte
Di mana ada APL, ada J! Agak. Mengambil dimensi sebagai arg kiri dan indeks sebagai arg kanan. "Mengindeks array multidimensi pada dasarnya adalah konversi basis campuran."
sumber
JavaScript (ES6), 34 byte
Tentunya
reduce
harus lebih baik daripadamap
.sumber
Python, 43 byte
Uji di Ideone .
sumber
Jelly ,
76 byteCobalah online! atau verifikasi semua kasus uji .
Bagaimana itu bekerja
sumber
Pyth, 10 byte
Cobalah online: Demonstrasi atau Test Suite
Menggunakan metode Horner untuk menghitung indeks.
sumber
MATL , 9 byte
Ini menggunakan pengindeksan berbasis 1 (sekarang diizinkan oleh tantangan), yang merupakan pilihan alami di MATL.
Untuk membandingkan dengan kasus uji dalam tantangan, tambahkan
1
ke setiap entri dalam vektor indeks input, dan kurangi1
dari output.Cobalah online!
Penjelasan
Kode ini didasarkan pada
X]
fungsi bawaan , yang mengubah indeks multidimensi menjadi indeks linier tunggal (sepertisub2ind
fungsi Matlab atau Oktaf ).sumber
Julia,
2927 byteCobalah online!
sumber
MATL , 11 byte
Ini menggunakan pengindeksan berbasis 0, seperti pada tantangan aslinya.
Cobalah online!
Penjelasan
Kode secara eksplisit melakukan penggandaan dan penambahan yang dibutuhkan.
sumber
Python, 85 byte
Saya mungkin akan mendapatkan pantat saya ditendang oleh pegolf python yang lebih baik di luar sana.
sumber
Python 3.5, 69
Tes di sini
sumber
Haskell, 34 byte
Contoh penggunaan:
[10,10,4,62,7] # [1,2,3,4,5]
->22167
.Bagaimana itu bekerja:
sumber
C ++, 66 byte
Makro cepat:
Gunakan seperti:
Ini mungkin sedikit penyalahgunaan aturan. Membuat array dengan ukuran yang diberikan, daripada memeriksa untuk melihat seberapa jauh indeks yang diberikan mengimbangi pointer. Output ke STDOUT.
Ini terasa sangat kotor ... Tapi saya suka fakta ini valid.
sumber
Mathematica, 27 byte
Fungsi tanpa nama yang mengambil daftar indeks sebagai argumen pertama dan daftar dimensi kedua. Berdasarkan pengamatan yang sama dengan jawaban APL Dennis yang menghitung indeks benar-benar hanya konversi campuran-basis.
sumber
Oktaf,
5854 byteTerima kasih kepada @AlexA. untuk sarannya, yang menghapus 4 byte
Input dan output berbasis 1. Untuk membandingkan dengan kasus uji, tambahkan
1
setiap entri dalam input dan kurangi1
dari output.Ini adalah fungsi anonim. Untuk menyebutnya, tetapkan ke variabel.
Coba di sini .
Penjelasan
Ini bekerja dengan benar-benar membangun array multidimensi (
reshape(...)
), diisi dengan nilai-nilai1
,2
... dalam rangka linear (1:prod(d)
), dan kemudian mengindeks dengan indeks multidimensi untuk mendapatkan nilai corrresponding.Pengindeksan dilakukan dengan mengubah input indeks multidimensi
i
menjadi array sel (num2cell(...)
) dan kemudian ke daftar yang dipisahkan koma ({:}
).Dua
flip
operasi diperlukan untuk mengadaptasi urutan dimensi dari C ke Oktaf.sumber
reshape
? Itu bukan sintaksis dalam Matlab, tetapi diterima dalam Oktaf. Ini berfungsi sebagai indeks@(...) ...
di baris pertama kode saya, diikuti olehf = ans;
yang kedua. Ini membuat panjang baris pertama sama dengan jumlah byte yang dilaporkan.CJam, 7 byte
Cobalah online!
Bagaimana itu bekerja
sumber
Haskell, 47 byte
Dua solusi panjang yang sama:
Disebut seperti:
((sum.).s)[4,2][5,10]
.Ini versi infiks:
sumber
Oktaf,
47/43/31 bytes@(d,i)sub2ind(flip(d),num2cell(flip(i+1)){:})-1
Uji di sini .
Karena itu, seperti yang diminta dalam komentar , pengindeksan berbasis 1 dikatakan OK ketika ini alami untuk bahasa yang digunakan. Dalam hal ini, kita dapat menyimpan 4 byte:
@(d,i)sub2ind(flip(d),num2cell(flip(i)){:})
Dalam analogi, saya berpendapat bahwa jika tujuan dari kode ini adalah untuk mengindeks secara linear sebuah array dalam bahasa itu , keseluruhan membalik dan menghitung untuk MATLAB / Octave, urutan utama kolom juga tidak perlu. Dalam hal ini, solusi saya menjadi
@(d,i)sub2ind(d,num2cell(i){:})
Uji yang itu di sini .
sumber
Mathematica, 47 byte
(Unicode adalah U + F3C7, atau
\[Transpose]
.) Untuk ini, saya menulis ulang ekspresi sebagai D n ( D n -1 (⋯ ( D 3 ( D 2 S 1 + S 2 ) + S 3 ) ⋯) + S n -1 ) + S n . HanyaFold
fungsi dari kedua daftar.sumber
Sebenarnya, 13 byte
Cobalah online!
Program ini mengambil daftar indeks sebagai input pertama dan daftar dimensi sebagai input kedua.
Penjelasan:
sumber
Racket 76 byte
Tidak Terkumpul:
Pengujian:
Keluaran:
sumber
C #, 73 byte
Program lengkap dengan uji kasus:
sumber
Perl 6, 39 byte
Golf yang agak naif di sini, hanya memeras sub anonim.
Perl 6 memiliki variabel status anonim
$
yang berguna untuk membuat penghitung dalam satu lingkaran (misalnya, menggunakan penambahan$++
atau pra-kenaikan++$
). Saya melakukan pra-kenaikan variabel status ini untuk menambah indeks awal dari irisan larik dimensi di dalam peta.Berikut adalah fungsi yang tidak dikenali yang membuat sub-daftar
Maka tinggal mengurangi sub-daftar dengan
×
operator multiplikasi ( ), dansum
hasilnya.sumber
Perl, 71 byte
Tidak Terkumpul:
sumber
C ++ 17,
133115 byte-18 byte untuk digunakan
auto...
Tidak Terkumpul:
Pemakaian:
Alternatif, hanya fungsi, 116 byte
Tidak Terkumpul:
Pemakaian:
sumber