多次元座標のインデックスを評価する


9

N次元座標のコレクションが提供されます。以下に例を示します。

{2,3,4}

これは、2x、3y、4zの3次元配列と考えることができます。次元はいくつあってもかまいません。この例では、合計24のノードがあります。各ノードには、{x、y、z}を使用してインデックスを付けることができます。5番目のノードにアクセスするために提供されるインデックスは、以下の表に基づいて{0、1、0}になります。

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

このアプリケーションの目的は、ノード番号が指定されている場合、逆方向に作業してインデックスを決定することです。

8番目のノードの「y」インデックスを要求された場合、プログラムは「2」を出力するはずです。

次の入力が提供された場合:

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

以下を印刷する必要があります。

2

入力は、選択した言語で便利な方法で提供され、境界チェックを必要としないと想定できます。たとえば、提供された選択インデックス(例では「y」)が提供された座標に対して有効であると想定する場合があります。0または1ベースのインデックスを使用できます。この例では、0ベースを想定しています。

これは、この質問の逆のようなものです: 多次元配列のインデックス


1
おそらく、いくつかのテストケースを追加します
Luis Mendo

1
座標を0からx-1ではなく、1からxまで実行できますか?したがって、ノード#0は(1,1,1)、ノード#23は(2,3,4)になります。
nimi

@nimiはい、1ベースのインデックス付けで問題ありません。
マークジョンソン

回答:


4

MATL、8バイト

PiX[vPi)

これは、ノードとディメンションに1ベースのインデックスを使用します。だから、最初のノードがある12など。「x」の寸法は1、「y」は2などです。

オンラインでお試しください!

説明

キーは、線形インデックスを多次元インデックスに変換する関数X[ind2subMatlabまたはOctaveに対応)を使用することです。ただし、チャレンジで定義されているのと逆の場合の次元の順序なので、関数を呼び出す前にPflip)が必要ですv

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バイト

(#)3つの引数を取り、整数を返します。asとして使用し[2,3,4]#8$1ます。

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

オンラインでお試しください!

使い方

  • l座標のリストn、ノード番号です。l#n最終的なインデックスをとる関数ですi
  • リスト[2,3,4]とノードの例を考えると8、最初にリストの末尾が取得され、が与えられ[3,4]ます。次いで、これは、scanから定義さr、IGHT divリストを与え、連続各要素によってノード番号をiding [0,2,8]
  • 次に、リスト[0,2,8]とオリジナルにulus演算子l=[2,3,4]zip渡され、が与えられます。withmod[0,2,0]
  • 最後に、!!リストのインデックス付け演算子が部分的に適用され、結果の関数に最終的なインデックスを与える準備が整います。

3

APL(Dyalog Classic)、5バイト

⎕⌷⎕⊤⎕

いいえ、フォントを見逃していません。そのように見えるはずです。

これは、STDINから入力を受け取るREPLプログラムです:ノード番号、次元、およびインデックス(この順序で)。後者は、の値に応じて、0ベースまたは1ベースにすることができます⎕IO

オンラインでお試しください!

使い方

多次元配列のインデックス付けは、基本的に混合ベース変換であるため、チャレンジの最初の部分で要求されることも行います。STDINから行が読み取られて評価されるたびに、

        
⎕:
      8
⎕:
      2 3 4
0 2 0

最後に、指定されたインデックスの要素を取得します。左端はSTDINから3番目と最後の入力を読み取り、

        (0 2 0)
⎕:
      1
2

混合ベース変換が再びストライキします!
アダム

3

Haskell、38 30 29 28バイト

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

これは、0から始まるインデックスと1から始まる座標を使用します。オンラインでお試しください!

->のようxに、入力の各次元をリスト[1..x]に変換します。 最初の要素が最初のリストから取得されるなど、可能なすべてのnタプルのリストを作成します。nタプルと次元にインデックスを付けるために2回。[2,3,4][[1,2],[1,2,3],[1,2,3,4]]mapM!!

編集:@ØrjanJohansenは8 9バイトを節約しました。ありがとう!


おお、賢い!しかしmapM id.map f=mapM f。そして(`take`[0..])短いです。
Ørjanヨハンセン

@ØrjanJohansen:8バイト、それは巨大です!どうもありがとう!1ベースの座標が許可されている場合は、OPの回答をまだ待っています。
nimi

また、l#n=(mapM(`take`[0..])l!!n!!)短いです。(ちなみに、あなたはを必要としませんでしたf=、関数は匿名にすることができます。ああ、あなたはそれを数えていませんね。)
ØrjanJohansen

@ØrjanJohansen:ありがとうございます。これf=はTIOからのコピーアンドペーストエラーでした。
nimi

2

Brachylog25 23バイト

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

オンラインでお試しください!

2番目の引数は1インデックス付きで、他の2は0インデックス付きです。

説明

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バイト

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

入力には1ベースのインデックスを使用し、出力には0ベースのインデックスを使用します。

なんでOr?これは、属性を持つ最も短い組み込み関数だからですFlat

例:

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

Out[1]= 2

1

APL(Dyalog)、6バイト

0ベースのインデックスを取得⎕IO←0するには、多くのシステムでデフォルトです。寸法の入力を求め、次に囲まれた(ノード、座標)のリスト。

⎕⊃↑,⍳⎕

オンラインでお試しください!

 寸法のプロンプト

 各項目があると、その形状のアレイを生成するその項目のndices

, ravel(インデックスのリストにする)

 深さの1レベルをランクの追加レベルに変換する

⎕⊃ (node、coordinate)の囲まれたリストを要求し、それを使用してそこから要素を選択します





0

R、52バイト

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

1インデックス付きの無名関数を返します。

例として。expand.gridリストを生成しますが、最初の引数が最も速く変化するため、逆の順序で入力する必要がありますz,y,x。次に[n,4-i]、単に4-i逆の順序で必要な場合ににインデックスを付け、1から減算して0:(x-1)、から実行されるようにします。

オンラインでお試しください!



0

JavaScript(ES6)、44バイト

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

非ゴルフ:

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

悲しいことreduceに2バイト長くなります:

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

私たちは同じ考えを思いついたようです\ o /
Leaky Nun

@LeakyNunええと、索引付けがどのように機能するかを考えると、それは実際に驚くことではありません。
ニール

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.