评估多维坐标系的索引


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
我们可以让坐标从1到x,而不是0到x-1吗?因此,节点#0将是(1,1,1),节点#23(2,3,4)。
nimi

@nimi是的,基于1的索引很好。
马克·约翰逊

Answers:


4

MATL,8字节

PiX[vPi)

这将基于1的索引用于节点和维度。所以第一个节点是12等等;而“ x”维度为1,“ y” 维度为2等。

在线尝试!

说明

关键是要使用功能X[(对应ind2sub于Matlab或Octave),它将线性索引转换为多维索引。然而,如果如在挑战中定义,因此相反的维度的顺序Pflip)被调用函数之前需要,和连接(后再次v)其OUPUTS。

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个字节

(#)接受三个参数并返回一个整数,用作[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从权重开始rdiv依次按每个元素确定节点编号,并给出list [0,2,8]
  • 然后列表[0,2,8]和原来l=[2,3,4]zipPED withmod汗国操作,给人[0,2,0]
  • 最后,!!列表索引运算符被部分应用,结果函数准备好被赋予最终索引。

3

APL(Dyalog Classic),5个字节

⎕⌷⎕⊤⎕

不,您没有缺少字体。这就是它的外观。

这是一个REPL程序,它接收来自STDIN的输入:节点号,尺寸和索引(按此顺序)。后者可以基于0或1,具体取决于的值⎕IO

在线尝试!

怎么运行的

多维数组索引本质上是混合基础转换,因此挑战的第一部分要求这样做。每次出现都从STDIN读取并评估一行,因此

        
⎕:
      8
⎕:
      2 3 4
0 2 0

最后,以指定索引处的元素。最左边的是从STDIN读取第三个和最后一个输入

        (0 2 0)
⎕:
      1
2

混合基础转换再次生效!
亚当

3

Haskell,38 30 29 28字节

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

它使用从0开始的索引,并从1开始进行坐标调整

x输入的每个维度转换为列表[1..x],例如[2,3,4]-> [[1,2],[1,2,3],[1,2,3,4]]mapM列出所有可能的n元组的列表,其中第一个元素取自第一个列表,依此类推。两次!!以索引n元组和维。

编辑:@ØrjanJohansen保存了8 9个字节。谢谢!


哦,聪明!但是mapM id.map f=mapM f。并且(`take`[0..])更短。
与Orjan约翰森

@ØrjanJohansen:8个字节,非常大!非常感谢!如果允许基于1的坐标,则仍在等待OP的答案。
nimi

而且,l#n=(mapM(`take`[0..])l!!n!!)更短。(顺便说一句,您不需要f=,函数可以是匿名的。哦,我想您没有算
在内

@ØrjanJohansen:再次感谢。这f=是来自TIO的复制和粘贴错误。
nimi

2

Brachylog25 23字节

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

在线尝试!

第二个参数为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

, 散布(编入索引列表)

 将一个深度级别转换为另一个等级

⎕⊃ 提示输入(节点,坐标)的封闭列表,并使用该列表从中选择一个元素


1

果冻7 6字节

Œp⁴ị⁵ị

在线尝试!

这对输入和输出使用1索引。

怎么运行的

Œ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个字节

@.n]@*FUMQEE

在线尝试!

怎么运行的

@.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个字节

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是要长两个字节:

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

看来我们提出了相同的想法 \ o /
Leaky Nun

@LeakyNun好吧,考虑到索引的工作原理,这并不奇怪。
尼尔

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.