我试图在J中重现生命游戏功能的APL代码。在APL"中搜索"生命游戏后,可以找到解释此代码的YouTube视频。目前我有一个矩阵R
,它是:
0 0 0 0 0 0 0
0 0 0 1 1 0 0
0 0 1 1 0 0 0
0 0 0 1 0 0 0
0 0 0 0 0 0 0
我写了J代码,它生成了邻接列表(相邻正方形中的活细胞数),如下所示:
+/ ((#:i.4),-(#:1+i.2),(1 _1),.(_1 1)) |. R
并产生:
0 0 1 2 2 1 0
0 1 3 4 3 1 0
0 1 4 5 3 0 0
0 1 3 2 1 0 0
0 0 1 1 0 0 0
我对此代码的主要问题是它不优雅,因为生成需要((#:i.4),-(#:1+i.2),(1 _1),.(_1 1))
:
0 0
0 1
1 0
1 1
0 _1
_1 0
_1 1
1 _1
这实际上只是矢量1 0 _1
与其自身之间的外部产品或笛卡尔积。我找不到一种简单的方法来制作这种笛卡尔积,所以我的最终问题是如何更优雅地生成所需的矢量?
答案 0 :(得分:5)
笛卡尔积是单一动词catalog
: {
{ ;~(1 0 _1)
┌────┬────┬─────┐
│1 1 │1 0 │1 _1 │
├────┼────┼─────┤
│0 1 │0 0 │0 _1 │
├────┼────┼─────┤
│_1 1│_1 0│_1 _1│
└────┴────┴─────┘
Ravel(,
)和unbox(>
)获得9,2列表:
>,{ ;~(1 0 _1)
1 1
1 0
1 _1
0 1
0 0
0 _1
_1 1
_1 0
_1 _1
答案 1 :(得分:3)
,"0/ ~ 1 0 _1
会为您提供您要求的笛卡尔积(但您可能希望将其重塑为9乘2)。