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

时间:2017-12-02 16:28:50

标签: j

我正在和J一起打我的脚,为了让球滚动,决定写一个函数:

  • 获得整数N;
  • 吐出一个遵循这种模式的表:

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

它的问题是双重的:

  • 它不够通用,看起来有点丑陋(parens和"用法);
  • 尾随零 - 据我所知,J中的所有数组都是同类的,所以在我的情况下,每一行都应该装箱。

就像那样:

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

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

所以,我在这里问的是:

  • 请为此任务提供惯用的J解决方案并附上解释;
  • 批评我的尝试并指出它是如何完成的。

提前致谢!

1 个答案:

答案 0 :(得分:2)

与J中的许多挑战一样,有时候最好将注意力集中在结果上并找到不同的方法来实现目标。在这种情况下,您的初始方法是创建一个单位矩阵。我会用

   =/~@:i. 4
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1

您已正确识别尾随0的问题以及J将使用0填充以避免参差不齐的数组。拳击避免这种填充,因为每行是自包含的。

首先创建列表。我会使用超越来获得额外的0

   4{.1
1 0 0 0

下一行使用1:将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

fork的中间叉成为动词作用于两个名词参数。~交换参数。所以它等同于

1 1j1 1j2 1j3 ":@:|.@:# 1

由于@:的工作方式与

相同
": |. 1 1j1 1j2 1j3 # 1

我还没有显示这些组件的结果,因为在fork上使用"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

看看当你滚球时会发生什么?&#39;?我想关于J的事情是,无论你从哪里开始,球都会沿着一个非常陡峭的斜坡下降。令人兴奋,是吗?