Mengevaluasi Indeks Koordinat Multidimensi

9

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

Mark Johnson
sumber
1
Mungkin tambahkan beberapa test case
Luis Mendo
1
Bisakah kita membiarkan koordinat berjalan dari 1 ke x alih-alih 0 ke x-1? Jadi simpul # 0 akan menjadi (1,1,1) dan simpul # 23 (2,3,4).
nimi
@nimi Ya, pengindeksan berdasarkan 1 baik-baik saja.
Mark Johnson

Jawaban:

4

MATL , 8 byte

PiX[vPi)

Ini menggunakan pengindeksan berbasis 1 untuk node dan untuk dimensi. Jadi simpul pertama adalah 1, 2dll; dan dimensi "x" adalah 1, "y" adalah 2dll.

Cobalah online!

Penjelasan

Kuncinya adalah menggunakan fungsi X[(sesuai dengan ind2subdi Matlab atau Oktaf), yang mengubah indeks linier menjadi indeks multidimensi. Namun, urutan dimensi jika kebalikannya seperti yang didefinisikan dalam tantangan, maka P( flip) diperlukan sebelum memanggil fungsi, dan sekali lagi setelah menyatukan ( v) ouputnya.

P    % Implicit input: size as a row vector. Flip
i    % Input: node (linear) index
X[   % Convert from linear index to multidimensional indices. Produces
     % as many outputs as entries there are in the size vector
v    % Concatenate all outputs into a column vector
P    % Flip
i    % Input: dimension
)    % Index: select result for that dimension. Implicitly display
Luis Mendo
sumber
3

Haskell , 45 byte

(#)mengambil tiga argumen dan mengembalikan integer, gunakan sebagai [2,3,4]#8$1.

l#n=(zipWith mod(scanr(flip div)n$tail l)l!!)

Cobalah online!

Bagaimana itu bekerja

  • ladalah daftar koordinat, nnomor simpul. l#nadalah fungsi yang mengambil indeks akhir i.
  • Diberikan daftar contoh [2,3,4]dan simpul 8, pertama-tama ekor daftar diambil, memberi [3,4]. Maka ini scanditentukan dari right, dividing nomor node oleh setiap elemen berturut-turut, memberikan daftar [0,2,8].
  • Kemudian daftar [0,2,8]dan asli l=[2,3,4]yang zipped withyang modOperator ulus, memberikan [0,2,0].
  • Akhirnya !!operator pengindeksan daftar sebagian diterapkan, dengan fungsi yang dihasilkan siap untuk diberikan indeks akhir.
Ørjan Johansen
sumber
3

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, jadi

        
⎕:
      8
⎕:
      2 3 4
0 2 0

Akhirnya, ambil elemen pada indeks yang ditentukan. Yang paling kiri membaca input ketiga dan terakhir dari STDIN dan

        (0 2 0)
⎕:
      1
2
Dennis
sumber
Konversi campuran basis menyerang lagi!
Adám
3

Haskell, 38 30 29 28 byte

l#n=(mapM(\x->[1..x])l!!n!!)

Ini menggunakan indeks dan koordinat berbasis 0 mulai dari 1. Coba online!

Ubah setiap dimensi xinput menjadi daftar [1..x], mis. [2,3,4]->[[1,2],[1,2,3],[1,2,3,4]] . mapMmembuat 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 8 9 byte. Terima kasih!

nimi
sumber
Ooh, pintar! Tapi mapM id.map f=mapM f. Dan (`take`[0..])lebih pendek.
Ørjan Johansen
@ ØrjanJohansen: 8 byte, itu luar biasa! Terima kasih banyak! Masih menunggu jawaban OP jika koordinat berbasis 1 diizinkan.
nimi
Juga, l#n=(mapM(`take`[0..])l!!n!!)lebih pendek. (Kebetulan Anda tidak memerlukannya f=, fungsinya bisa anonim. Oh, saya kira Anda tidak menghitungnya.)
Ørjan Johansen
@ ØrjanJohansen: Terima kasih lagi. Itu f=adalah kesalahan salin dan tempel dari TIO.
nimi
2

Brachylog , 25 23 byte

tT&bhH&h{>ℕ}ᵐ:H≜ᶠ⁾t:T∋₎

Cobalah online!

Argumen kedua adalah 1-diindeks, 2 lainnya adalah 0 diindeks.

Penjelasan

tT                          Input = [_, _, T]
  &bhH                      Input = [_, H, T]
      &h{>ℕ}ᵐ               Create a list where each element is between 0 and the
                              corresponding element in the first element of the Input
             :H≜ᶠ⁾          Find the first H possible labelings of that list
                  t         Take the last one
                   :T∋₎     Output is the T'th element
Fatalisasi
sumber
1

Mathematica, 26 23 byte

Array[f,#,0,Or][[##2]]&

Menggunakan pengindeksan berbasis 1 untuk input, dan pengindeksan berbasis 0 untuk output.

Mengapa Or? Karena itu adalah fungsi built-in terpendek dengan atribut Flat.

Contoh:

In[1]:= Array[f,#,0,Or][[##2]]&[{2,3,4},9,2]

Out[1]= 2
alephalpha
sumber
1

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 itu

Adm
sumber
1

Jelly , 7 6 byte

Œp⁴ị⁵ị

Cobalah online!

Ini menggunakan pengindeksan 1 untuk input dan output.

Bagaimana itu bekerja

Œp⁴ị⁵ị
Œp      Cartesian product of the first input
        numbers are converted to 1-based ranges
  ⁴ị    index specified by second input
    ⁵ị  index specified by third input
Biarawati Bocor
sumber
0

Oktaf , 63 byte

function z=f(s,n,d)
[c{nnz(s):-1:1}]=ind2sub(flip(s),n);z=c{d};

Port jawaban MATL saya.

Cobalah online!

Luis Mendo
sumber
0

Pyth , 12 byte

@.n]@*FUMQEE

Cobalah online!

Bagaimana itu bekerja

@.n]@*FUMQEE
       UMQ    map each element in the first input to
              [0,1,...,that element]
     *F       reduce by Cartesian product
    @     E   obtain index at second input
 .n]          listify and flatten
@          E  obtain index at third input
Biarawati Bocor
sumber
0

R, 52 byte

function(x,y,z,n,i)expand.grid(1:z,1:y,1:x)[n,4-i]-1

mengembalikan fungsi anonim, 1-diindeks.

sebagai contoh. expand.gridmenghasilkan daftar, tetapi argumen pertama bervariasi paling cepat, jadi kami harus memasukkannya dalam urutan terbalik, yaitu z,y,x,. Kemudian kita cukup mengindeks [n,4-i], jika 4-idiperlukan untuk urutan terbalik, dan kurangi 1 untuk memastikan mereka lari 0:(x-1), dll.

Cobalah online!

Giuseppe
sumber
0

Java , 77 byte

int f(int[]a,int m,int n){for(int i=a.length-1;i>n;m/=a[i--]);return m%a[n];}

Cobalah online!

Biarawati Bocor
sumber
0

JavaScript (ES6), 44 byte

(a,n,i,g=j=>a[++j]?g(j)/a[j]|0:n)=>g(i)%a[i]

Tidak Disatukan:

(a,n,i)=>a.reduceRight(([n,...a],e)=>[n/e|0,n%e,...a],[n])[i+1]

Sedihnya reducedua byte lebih lama:

(a,n,i)=>a.reduce((r,d,j)=>j>i?r/d|0:r,n)%a[i]
Neil
sumber
Sepertinya kami datang dengan ide yang sama \ o /
Leaky Nun
@ LeakyNun Ya, tidak mengherankan kok, mengingat cara kerja pengindeksan.
Neil