J:具有特定价值的坐标

Rom*_*man 5 arrays j multidimensional-array

假设我们有阵列

0 1 2 3 4 5 8 7 8 9
Run Code Online (Sandbox Code Playgroud)

有两个索引值为8:

(i.10) ([#~8={) 0 1 2 3 4 5 8 7 8 9
6 8
Run Code Online (Sandbox Code Playgroud)

有没有更短的方法来获得这个结果?可能是一些内置动词.

但更重要的是.更高的尺寸呢?假设我们有矩阵5x4

1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8
Run Code Online (Sandbox Code Playgroud)

我想知道什么是值为6的坐标.
我想得到这样的结果(有三个坐标):

4 1
3 2
2 3
Run Code Online (Sandbox Code Playgroud)

这是非常基本的任务,我认为它应该存在一些简单的解决方案.

三维相同?

谢谢

Tik*_*anz 5

使用稀疏数组功能($.)提供了一种非常快速且精简的解决方案,该解决方案也适用于多个维度.

   ]a=: 5 ]\ 1 + i. 8
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8
   6 = a
0 0 0 0 0
0 0 0 0 1
0 0 0 1 0
0 0 1 0 0
   4 $. $. 6 = a
1 4
2 3
3 2
Run Code Online (Sandbox Code Playgroud)

默认:

   getCoords=: 4 $. $.
   getCoords 6 = a ,: a
0 1 4
0 2 3
0 3 2
1 1 4
1 2 3
1 3 2
Run Code Online (Sandbox Code Playgroud)


Eel*_*vex 3

动词索引I.几乎可以完成这项工作。

当你有一个简单的列表时,I.的使用就很简单:

I. 8 = 0 1 2 3 4 5 8 7 8 9
6 8 
Run Code Online (Sandbox Code Playgroud)

对于高阶矩阵,您可以将其与antibase#:配对以获取 base 中的坐标$ matrix。例如:

]a =: 4 5 $ 1 2 3 4 5 2 3 4 5 6 3 4 5 6 7 4 5 6 7 8
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8

I. 6 = ,a
9 13 17

($a) #: 9 13 17
1 4
2 3
3 2
Run Code Online (Sandbox Code Playgroud)

类似地,对于任意数量的维度:展平 ( ,)、比较 ( =)、获取索引 ( I.) 和转换坐标 ( ($a)&#:):

]coords =: ($a) #: I. 5 = , a =: ? 5 6 7 $ 10
0 0 2
0 2 1
0 2 3
...
(<"1 coords) { a
5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
Run Code Online (Sandbox Code Playgroud)

顺便说一句,您可以编写I. x = yasx (I.@:=) y以获取额外的性能。这是特殊的代码

索引,其中 xfy