Çok Boyutlu Koordinatlar Endeksini Değerlendirin


9

N boyutlu koordinatların bir koleksiyonu sağlanır. Aşağıda bir örnek verilmiştir:

{2,3,4}

Bu 2x, 3y ve 4z ile 3 boyutlu bir dizi olarak düşünülebilir; herhangi bir sayıda boyut olabilir. Örnekte toplam 24 düğüm vardır. Her bir düğüm {x, y, z} kullanılarak dizine eklenebilir. 5. düğüme erişmek için, sağlanan endeksler aşağıdaki tabloya göre {0, 1, 0} olacaktır.

## | 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

Bu uygulamanın amacı, bir düğüm numarası verilirse bir dizin belirlemek için geriye doğru çalışmaktır.

8. düğümün "y" dizini istenirse, program "2" yazdırmalıdır.

Aşağıdaki girdi sağlandığında:

{2,3,4}|8|1
<List of Coordinates>|<Node>|<Index>

Aşağıdakiler yazdırılmalıdır:

2

Girişin kendi dilinizde uygun bir şekilde sağlanacağını ve sınırların kontrol edilmesini gerektirmediğini varsayabilirsiniz. Örneğin, sağlanan seçim endeksinin (örnekte "y") sağlanan koordinatlara göre geçerli olduğunu varsayabilirsiniz. 0 veya 1 tabanlı indeksleme kullanabilirsiniz; örnek 0 tabanlı olduğunu varsayar.

Bu, şu sorunun tersidir: Çok boyutlu bir dizinin dizini


1
Belki birkaç test örneği ekleyin
Luis Mendo

1
Koordinatların 0 ile x-1 yerine 1'den x'e gitmesine izin verebilir miyiz? Bu nedenle, # 0 düğümü (1,1,1) ve düğüm # 23 (2,3,4) olacaktır.
nimi

@nimi Evet, 1 tabanlı indeksleme iyidir.
Mark Johnson

Yanıtlar:


4

MATL , 8 bayt

PiX[vPi)

Bu, düğüm ve boyutlar için 1 tabanlı dizinleme kullanır. İlk düğümler 1, 2vb. ve "x" boyutu 1, "y" 2vb.

Çevrimiçi deneyin!

açıklama

Anahtar, doğrusal bir indeksi çok boyutlu indekslere dönüştüren fonksiyonu X[( ind2subMatlab veya Octave'de karşılık gelen) kullanmaktır . Bununla birlikte, boyutları sırası, yani meydan tanımlanan ters halinde P( flip) işlevi çağırmadan önce gerekli olan ve yine (bitiştirme sonra v) kendi çıkışı.

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

3

Haskell , 45 bayt

(#)üç argüman alır ve bir tamsayı döndürür, olarak kullanın [2,3,4]#8$1.

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

Çevrimiçi deneyin!

Nasıl çalışır

  • lkoordinatların listesi n, düğüm numarasıdır. l#nson dizini alan bir işlevdiri .
  • Örnek liste [2,3,4]ve düğüm göz önüne alındığında 8, önce listenin kuyruğu alınır ve verilir [3,4]. Daha sonra bu bir scanmesafede ned r, uş divlistesi veren, arka arkaya her bir elemanı tarafından düğüm sayısı iding [0,2,8].
  • Sonra liste [0,2,8]ve özgün l=[2,3,4]olan zipped veren ulus operatörü .withmod[0,2,0]
  • Sonunda, !!liste indeksleme operatörü kısmen uygulanır ve sonuçta ortaya çıkan fonksiyon nihai indeks verilmeye hazır hale gelir.

3

APL (Dyalog Klasik) , 5 bayt

⎕⌷⎕⊤⎕

Hayır, bir yazı tipini kaçırmıyorsunuz. Böyle görünmesi gerekiyordu.

Bu, STDIN'den girdi alan bir REPL programıdır: düğüm numarası, boyutlar ve dizin (bu sırayla). Sonuncusu, değerine bağlı olarak 0- veya 1 tabanlı olabilir ⎕IO.

Çevrimiçi deneyin!

Nasıl çalışır

Çok boyutlu dizi indeksleme esasen karışık temel dönüşümdür, bu yüzden meydan okumanın ilk kısmı ne ister? Her oluşum STDIN'den bir satır okur ve değiştirir,

        
⎕:
      8
⎕:
      2 3 4
0 2 0

Son olarak, öğeyi belirtilen dizinde alır. En solda STDIN ve üçüncü ve son girdileri okur.

        (0 2 0)
⎕:
      1
2

Karışık temel dönüşüm tekrar grev!
Adam

3

Haskell, 38 30 29 28 bayt

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

Bu, 1'den başlayarak 0 tabanlı indeksler ve koordinatlar kullanır. Çevrimiçi deneyin!

xGirişin her boyutunu bir listeye dönüştürün [1..x], örneğin [2,3,4]-> [[1,2],[1,2,3],[1,2,3,4]]. mapMilk elemanın ilk listeden alındığı tüm olası n-tüplerin bir listesini yapar, vb !!. n-demetini ve boyutu indekslemek için iki kez .

Düzenle: @ Ørjan Johansen 8 9 bayt kurtardı . Teşekkürler!


Ooh, akıllı! Ama mapM id.map f=mapM f. Ve (`take`[0..])daha kısadır.
Ørjan Johansen

@ ØrjanJohansen: 8 bayt, bu çok büyük! Çok teşekkürler! 1 tabanlı koordinatlara izin veriliyorsa hala OP'nin yanıtını beklemektedir.
nimi

Ayrıca, l#n=(mapM(`take`[0..])l!!n!!)daha kısadır. (Bu arada ihtiyaç duymadınız f=, fonksiyonlar anonim olabilir. Oh, sanırım saymıyorsunuz.)
Ørjan Johansen

@ ØrjanJohansen: Tekrar teşekkürler. f=Kopya ve TIO gelen hatayı yapıştırın.
nimi

2

Brachylog , 25 23 bayt

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

Çevrimiçi deneyin!

İkinci argüman 1-indekslenir, diğer 2 0 indekslenir.

açıklama

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

1

Mathematica, 26 23 bayt

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

Giriş için 1 tabanlı indeksleme ve çıktı için 0 tabanlı indeksleme kullanma.

Neden Or? Çünkü öznitelik ile en kısa yerleşik işlevdir Flat.

Misal:

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

Out[1]= 2

1

APL (Dyalog) , 6 bayt

⎕IO←0Birçok sistemde varsayılan olan 0 tabanlı indeksleme almak için . Boyutlar sorulur, sonra ekteki (düğüm, koordinat) liste.

⎕⊃↑,⍳⎕

Çevrimiçi deneyin!

 boyut istemi

 Her bir madde olarak bu biçimde bir dizi oluşturmak ı o öğenin ndices

, ravel (endeksler listesine gir)

 bir derinlik seviyesini ek bir rütbe seviyesine dönüştürün

⎕⊃ ekteki (düğüm, koordinat) liste istemi ve bu öğeden bir öğe seçmek için bunu kullanın


1

Jöle , 7 6 bayt

Œp⁴ị⁵ị

Çevrimiçi deneyin!

Bu, giriş ve çıkış için 1 dizinleme kullanır.

Nasıl çalışır

Œ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


0

Pyth , 12 bayt

@.n]@*FUMQEE

Çevrimiçi deneyin!

Nasıl çalışır

@.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

0

R, 52 bayt

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

1 dizinli anonim bir işlev döndürür.

örneğin. expand.gridlisteyi oluşturur, ancak ilk argüman en hızlı şekilde değişir, bu yüzden bunları ters sırada girmeliyiz, yani z,y,x. Daha sonra , tersine sipariş için gerekli olan [n,4-i]yerleri dizine ekleyebilir 4-ive çalıştıklarından emin olmak için 1 çıkarabiliriz.0:(x-1) .

Çevrimiçi deneyin!



0

JavaScript (ES6), 44 bayt

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

Ungolfed:

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

Ne yazık ki reduceiki bayt daha uzun:

(a,n,i)=>a.reduce((r,d,j)=>j>i?r/d|0:r,n)%a[i]

Görünüşe göre aynı fikirle geldik \ o /
Leaky Nun

@LeakyNun Endekslemenin nasıl çalıştığı göz önüne alındığında, gerçekten şaşırtıcı değil.
Neil

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.