按照 J 中的指定模式生成数据
Generate data following specified pattern in J
我正在尝试使用 J,为了让事情顺利进行,我决定编写一个函数:
- 获取整数N;
- 吐出一个遵循这种模式的 table:
(N = 4
的示例)
1
0 1
0 0 1
0 0 0 1
即在每一行中,零的数量从 0
增加到 N - 1
。
但是,作为新手,我被卡住了。我当前针对 N = 4
案例的费力(且不正确)解决方案如下所示:
(4 # ,: 0 1) #~/"1 1 (1 ,.~/ i.4)
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
它的问题是双重的:
- 它不够通用而且看起来有点丑(括号和
"
用法);
- 尾随零 - 据我所知,J 中的所有数组都是同类的,因此在我的例子中,每一行都应该装箱。
像那样:
┌───────┐
│1 │
├───────┤
│0 1 │
├───────┤
│0 0 1 │
├───────┤
│0 0 0 1│
└───────┘
或者我应该使用字符串(例如 '0 0 1'
),它将用空格而不是零填充。
那么,我想问的是:
- 请为此任务提供一个惯用的 J 解决方案并附上解释;
- 批评我的尝试并指出如何完成它。
提前致谢!
就像 J 中的许多挑战一样,有时最好将注意力集中在结果上并找到不同的方法来实现目标。在这种情况下,您最初的方法是创建一个单位矩阵。我会用
=/~@:i. 4
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
您已经正确地确定了尾随 0 的问题以及 J 将用 0 填充以避免数组参差不齐的事实。装箱避免了这种填充,因为每一行都是独立的。
所以先创建你的列表。我会用超车来获得额外的 0's
4{.1
1 0 0 0
下一行使用 1:
to return 1 作为动词,并用方框框出从 1 到 4
(>:@:i. <@:{."0 1:) 4
+-+---+-----+-------+
|1|1 0|1 0 0|1 0 0 0|
+-+---+-----+-------+
由于我们希望将其反转然后制成字符串,因此我们将 ":@:|.@:
添加到流程中。
(>:@:i. <@:":@:|.@:{."0 1:) 4
+-+---+-----+-------+
|1|0 1|0 0 1|0 0 0 1|
+-+---+-----+-------+
然后我们开箱
>@:(>:@:i. <@:":@:|.@:{."0 1:) 4
1
0 1
0 0 1
0 0 0 1
我不确定这是每个人解决问题的方法,但它确实有效。
不使用装箱而使用并列 j 的替代解决方案。 (复杂)和
的事实
1j4 # 1
1 0 0 0 0
(1 j. 4) # 1
1 0 0 0 0
(1 #~ 1 j. ]) 4
1 0 0 0 0
因此,我为 i. 4
中的每个整数创建一个列表,然后将它们反转并使它们成为字符串。因为它们现在是字符串,额外的填充是用空格完成的。
(1 ":@:|.@:#~ 1 j. ])"0@:i. 4
1
0 1
0 0 1
0 0 0 1
一步一步来,希望解释得更好一些。
i.4
0 1 2 3
然后一次应用于 (1 ":@:|.@:#~ 1 j. ])
个原子,因此使用 "0
分解括号内发生的事情。我先取右边的三个动词,形成一个叉子。
( 1 j. ])"0@:i.4
1 1j1 1j2 1j3
现在,有效地给了我
1 ":@:|.@:#~ 1 1j1 1j2 1j3
叉子中间的叉子成为作用于两个名词的动词 arguments.The ~
交换参数。所以它等同于
1 1j1 1j2 1j3 ":@:|.@:# 1
由于 @:
的工作方式与
相同
": |. 1 1j1 1j2 1j3 # 1
我没有显示这些组件的结果,因为在分叉上使用 "0
改变了参数被发送到中间齿并在以后组装的方式。我希望这里有足够的东西,只要有人挥手解释就足够了
从默认到显式的跳跃可能很大,因此显式地写同一个动词可能是一个更好的练习,看看它是否更有意义。
lowerTriangle =: 3 : 0
rightArg=. i. y
complexCopy=. 1 j. rightArg
1 (":@:|.@:#~)"0 complexCopy
)
lowerTriangle 4
1
0 1
0 0 1
0 0 0 1
lowerTriangle 5
1
0 1
0 0 1
0 0 0 1
0 0 0 0 1
看看当你 'get the ball rolling' 时会发生什么?我想关于 J 的事情是无论你从哪里开始,球都会沿着一个非常陡峭的斜坡下降。令人兴奋,是吗?
我正在尝试使用 J,为了让事情顺利进行,我决定编写一个函数:
- 获取整数N;
- 吐出一个遵循这种模式的 table:
(N = 4
的示例)
1
0 1
0 0 1
0 0 0 1
即在每一行中,零的数量从 0
增加到 N - 1
。
但是,作为新手,我被卡住了。我当前针对 N = 4
案例的费力(且不正确)解决方案如下所示:
(4 # ,: 0 1) #~/"1 1 (1 ,.~/ i.4)
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
它的问题是双重的:
- 它不够通用而且看起来有点丑(括号和
"
用法); - 尾随零 - 据我所知,J 中的所有数组都是同类的,因此在我的例子中,每一行都应该装箱。
像那样:
┌───────┐
│1 │
├───────┤
│0 1 │
├───────┤
│0 0 1 │
├───────┤
│0 0 0 1│
└───────┘
或者我应该使用字符串(例如 '0 0 1'
),它将用空格而不是零填充。
那么,我想问的是:
- 请为此任务提供一个惯用的 J 解决方案并附上解释;
- 批评我的尝试并指出如何完成它。
提前致谢!
就像 J 中的许多挑战一样,有时最好将注意力集中在结果上并找到不同的方法来实现目标。在这种情况下,您最初的方法是创建一个单位矩阵。我会用
=/~@:i. 4
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
您已经正确地确定了尾随 0 的问题以及 J 将用 0 填充以避免数组参差不齐的事实。装箱避免了这种填充,因为每一行都是独立的。
所以先创建你的列表。我会用超车来获得额外的 0's
4{.1
1 0 0 0
下一行使用 1:
to return 1 作为动词,并用方框框出从 1 到 4
(>:@:i. <@:{."0 1:) 4
+-+---+-----+-------+
|1|1 0|1 0 0|1 0 0 0|
+-+---+-----+-------+
由于我们希望将其反转然后制成字符串,因此我们将 ":@:|.@:
添加到流程中。
(>:@:i. <@:":@:|.@:{."0 1:) 4
+-+---+-----+-------+
|1|0 1|0 0 1|0 0 0 1|
+-+---+-----+-------+
然后我们开箱
>@:(>:@:i. <@:":@:|.@:{."0 1:) 4
1
0 1
0 0 1
0 0 0 1
我不确定这是每个人解决问题的方法,但它确实有效。
不使用装箱而使用并列 j 的替代解决方案。 (复杂)和
的事实 1j4 # 1
1 0 0 0 0
(1 j. 4) # 1
1 0 0 0 0
(1 #~ 1 j. ]) 4
1 0 0 0 0
因此,我为 i. 4
中的每个整数创建一个列表,然后将它们反转并使它们成为字符串。因为它们现在是字符串,额外的填充是用空格完成的。
(1 ":@:|.@:#~ 1 j. ])"0@:i. 4
1
0 1
0 0 1
0 0 0 1
一步一步来,希望解释得更好一些。
i.4
0 1 2 3
然后一次应用于 (1 ":@:|.@:#~ 1 j. ])
个原子,因此使用 "0
分解括号内发生的事情。我先取右边的三个动词,形成一个叉子。
( 1 j. ])"0@:i.4
1 1j1 1j2 1j3
现在,有效地给了我
1 ":@:|.@:#~ 1 1j1 1j2 1j3
叉子中间的叉子成为作用于两个名词的动词 arguments.The ~
交换参数。所以它等同于
1 1j1 1j2 1j3 ":@:|.@:# 1
由于 @:
的工作方式与
": |. 1 1j1 1j2 1j3 # 1
我没有显示这些组件的结果,因为在分叉上使用 "0
改变了参数被发送到中间齿并在以后组装的方式。我希望这里有足够的东西,只要有人挥手解释就足够了
从默认到显式的跳跃可能很大,因此显式地写同一个动词可能是一个更好的练习,看看它是否更有意义。
lowerTriangle =: 3 : 0
rightArg=. i. y
complexCopy=. 1 j. rightArg
1 (":@:|.@:#~)"0 complexCopy
)
lowerTriangle 4
1
0 1
0 0 1
0 0 0 1
lowerTriangle 5
1
0 1
0 0 1
0 0 0 1
0 0 0 0 1
看看当你 'get the ball rolling' 时会发生什么?我想关于 J 的事情是无论你从哪里开始,球都会沿着一个非常陡峭的斜坡下降。令人兴奋,是吗?