按照 J 中的指定模式生成数据

Generate data following specified pattern in J

我正在尝试使用 J,为了让事情顺利进行,我决定编写一个函数:

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

它的问题是双重的:

像那样:

┌───────┐
│1      │
├───────┤
│0 1    │
├───────┤
│0 0 1  │
├───────┤
│0 0 0 1│
└───────┘

或者我应该使用字符串(例如 '0 0 1'),它将用空格而不是零填充。

那么,我想问的是:

提前致谢!

就像 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 的事情是无论你从哪里开始,球都会沿着一个非常陡峭的斜坡下降。令人兴奋,是吗?