使用 J 查找 4 个邻居

Find 4-neighbors using J

我正在尝试使用 J 编程语言在 0 和 1 的矩阵中找到所有 1 的 4 个邻居。我已经制定了一个方法,但我正在尝试找到一个更紧凑的方法。

为了说明,假设我有矩阵 M—

] M=. 4 4[=10=] 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
0 0 0 0 
0 0 1 0
0 0 0 0 
0 0 0 0

我想生成—

0 0 1 0
0 1 0 1
0 0 1 0
0 0 0 0 

我整理了一些接近的东西(我欠这个小gem:https://www.reddit.com/r/cellular_automata/comments/9kw21u/i_made_a_34byte_implementation_of_conways_game_of/)—

] +/+/(|:i:1*(2 2) 0 0 1)&|.M
0 0 1 0 
0 1 2 1
0 0 1 0 
0 0 0 0 

这很好,因为无论如何我都会对初始的 1 进行加权(而且实际数字对于我的应用程序来说并不是那么重要)。但我觉得这可能更紧凑,我刚刚碰壁了。表达式的紧凑性实际上对我的应用很重要。

在@Eelvex 评论解决方案的基础上,如果您愿意使动词二元化,它就会变得非常简单。左边的参数可以是旋转矩阵,然后结果由+./组成,这是逻辑或并且可以根据需要加权。

   ] M0=. 4 4[=10=] 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
0 0 0 0
0 0 1 0
0 0 0 0
0 0 0 0
   ] m =.2,[=10=],i:1
 0 _1
_1  0
 0  1
 1  0
    m +./@:|.  M0
0 0 1 0
0 1 0 1
0 0 1 0
0 0 0 0

边缘(环绕)仍然存在问题,但您的原始解决方案也会出现此问题,所以我希望您不要担心。

] M1=. 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
    m +./@:|.  M1
0 1 0 1
1 0 0 0
0 0 0 0
1 0 0 0

如果您确实想清理它,可以使用稍长的 m +./@:(|.!.0),它用 0 填充旋转。

   ] M2=. 4 4$ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 1
    m +./@:(|.!.0)  M2
0 0 0 0
0 0 0 0
0 0 0 1
0 0 1 0
    m +./@:(|.!.0)  M1
0 1 0 0
1 0 0 0
0 0 0 0
0 0 0 0