【问题标题】:Find 4-neighbors using J使用 J 查找 4 个邻居
【发布时间】:2021-11-10 14:11:39
【问题描述】:

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

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

] M=. 4 4$0 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 

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

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

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

【问题讨论】:

  • 如果你想为了简短而牺牲可读性,你可以使用+/(2,\5$0,i:1)|.M或类似的东西。

标签: matrix j


【解决方案1】:

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

   ] M0=. 4 4$0 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,\5$0,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$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
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
 

【讨论】:

  • 太棒了。我还不明白这一切,但我期待着解决它。我还有一个额外的步骤来处理边缘的环绕,这似乎也消除了对它的需要。非常感谢你和@Eelvex。
猜你喜欢
  • 2020-01-29
  • 2013-03-31
  • 2015-09-28
  • 1970-01-01
  • 2014-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-05
相关资源
最近更新 更多