Koleksi koordinat dimensi N disediakan. Contohnya di bawah ini:
{2,3,4}
Ini dapat dianggap sebagai array 3 dimensi dengan 2x, 3y dan 4z; mungkin ada sejumlah dimensi. Dalam contoh ini, ada 24 total node. Setiap node dapat diindeks menggunakan {x, y, z}. Untuk mengakses simpul ke-5, indeks yang disediakan adalah {0, 1, 0} berdasarkan tabel di bawah ini.
## | x y z
0 1 2
-----------
0 | 0 0 0
1 | 0 0 1
2 | 0 0 2
3 | 0 0 3
4 | 0 1 0
5 | 0 1 1
6 | 0 1 2
7 | 0 1 3
8 | 0 2 0
...
23 | 1 2 3
Tujuan dari aplikasi ini adalah untuk bekerja mundur untuk menentukan indeks jika diberi nomor simpul.
Jika ditanya indeks "y" dari node ke-8, program harus mencetak "2".
Dengan input berikut disediakan:
{2,3,4}|8|1
<List of Coordinates>|<Node>|<Index>
Berikut ini harus dicetak:
2
Anda dapat mengasumsikan bahwa input akan disediakan dengan cara yang nyaman dalam bahasa pilihan Anda dan tidak memerlukan pemeriksaan batas. Misalnya, Anda dapat mengasumsikan bahwa indeks pilihan yang disediakan ("y" dalam contoh) valid terhadap koordinat yang disediakan. Anda dapat menggunakan pengindeksan berbasis 0 atau 1; contoh menganggap 0 berdasarkan.
Ini adalah semacam kebalikan dari pertanyaan ini: Indeks array multidimensi
sumber
Jawaban:
MATL , 8 byte
Ini menggunakan pengindeksan berbasis 1 untuk node dan untuk dimensi. Jadi simpul pertama adalah
1
,2
dll; dan dimensi "x" adalah1
, "y" adalah2
dll.Cobalah online!
Penjelasan
Kuncinya adalah menggunakan fungsi
X[
(sesuai denganind2sub
di Matlab atau Oktaf), yang mengubah indeks linier menjadi indeks multidimensi. Namun, urutan dimensi jika kebalikannya seperti yang didefinisikan dalam tantangan, makaP
(flip
) diperlukan sebelum memanggil fungsi, dan sekali lagi setelah menyatukan (v
) ouputnya.sumber
Haskell , 45 byte
(#)
mengambil tiga argumen dan mengembalikan integer, gunakan sebagai[2,3,4]#8$1
.Cobalah online!
Bagaimana itu bekerja
l
adalah daftar koordinat,n
nomor simpul.l#n
adalah fungsi yang mengambil indeks akhiri
.[2,3,4]
dan simpul8
, pertama-tama ekor daftar diambil, memberi[3,4]
. Maka iniscan
ditentukan darir
ight,div
iding nomor node oleh setiap elemen berturut-turut, memberikan daftar[0,2,8]
.[0,2,8]
dan aslil=[2,3,4]
yangzip
pedwith
yangmod
Operator ulus, memberikan[0,2,0]
.!!
operator pengindeksan daftar sebagian diterapkan, dengan fungsi yang dihasilkan siap untuk diberikan indeks akhir.sumber
APL (Dyalog Classic) , 5 byte
Tidak, Anda tidak melewatkan font. Seharusnya terlihat seperti itu.
Ini adalah program REPL yang mengambil input dari STDIN: nomor simpul, dimensi, dan indeks (dalam urutan itu). Yang terakhir dapat berbasis 0 atau 1, tergantung pada nilai
⎕IO
.Cobalah online!
Bagaimana itu bekerja
Pengindeksan array multidimensi pada dasarnya adalah konversi basis campuran, demikian
⊤
juga apa yang diminta bagian pertama dari tantangan. Setiap kemunculan⎕
membaca dan menghindari garis dari STDIN, jadiAkhirnya,
⌷
ambil elemen pada indeks yang ditentukan. Yang paling kiri⎕
membaca input ketiga dan terakhir dari STDIN dansumber
Haskell,
38302928 byteIni menggunakan indeks dan koordinat berbasis 0 mulai dari 1. Coba online!
Ubah setiap dimensi
x
input menjadi daftar[1..x]
, mis.[2,3,4]
->[[1,2],[1,2,3],[1,2,3,4]]
.mapM
membuat daftar semua kemungkinan n-tupel di mana elemen pertama diambil dari daftar pertama, dll. Dua kali!!
untuk mengindeks n-tupel dan dimensi.Sunting: @ Ørjan Johansen menyimpan
89 byte. Terima kasih!sumber
mapM id.map f=mapM f
. Dan(`take`[0..])
lebih pendek.l#n=(mapM(`take`[0..])l!!n!!)
lebih pendek. (Kebetulan Anda tidak memerlukannyaf=
, fungsinya bisa anonim. Oh, saya kira Anda tidak menghitungnya.)f=
adalah kesalahan salin dan tempel dari TIO.Brachylog ,
2523 byteCobalah online!
Argumen kedua adalah 1-diindeks, 2 lainnya adalah 0 diindeks.
Penjelasan
sumber
Mathematica,
2623 byteMenggunakan pengindeksan berbasis 1 untuk input, dan pengindeksan berbasis 0 untuk output.
Mengapa
Or
? Karena itu adalah fungsi built-in terpendek dengan atributFlat
.Contoh:
sumber
APL (Dyalog) , 6 byte
Untuk mendapatkan pengindeksan berbasis 0
⎕IO←0
,, yang merupakan default pada banyak sistem. Anjuran untuk dimensi, lalu daftar terlampir (simpul, koordinat).Cobalah online!
⎕
meminta dimensi⍳
menghasilkan sebuah array dari bentuk yang dengan setiap item menjadi i ndices untuk item yang,
ravel (membuat daftar indeks)↑
konversi satu tingkat kedalaman ke tingkat peringkat tambahan⎕⊃
meminta daftar terlampir (node, koordinat) dan menggunakannya untuk memilih elemen dari itusumber
Jelly ,
76 byteCobalah online!
Ini menggunakan pengindeksan 1 untuk input dan output.
Bagaimana itu bekerja
sumber
Oktaf , 63 byte
Port jawaban MATL saya.
Cobalah online!
sumber
Pyth , 12 byte
Cobalah online!
Bagaimana itu bekerja
sumber
R, 52 byte
mengembalikan fungsi anonim, 1-diindeks.
sebagai contoh.
expand.grid
menghasilkan daftar, tetapi argumen pertama bervariasi paling cepat, jadi kami harus memasukkannya dalam urutan terbalik, yaituz,y,x
,. Kemudian kita cukup mengindeks[n,4-i]
, jika4-i
diperlukan untuk urutan terbalik, dan kurangi 1 untuk memastikan mereka lari0:(x-1)
, dll.Cobalah online!
sumber
Java , 77 byte
Cobalah online!
sumber
JavaScript (ES6), 44 byte
Tidak Disatukan:
Sedihnya
reduce
dua byte lebih lama:sumber
Python 3 , 57 byte
Cobalah online!
Garpu jawaban Java saya .
sumber