修改数组的一行

时间:2015-07-10 11:19:54

标签: j

我刚刚开始学习J,而且我不知道该怎么做

假设我想要打印2个符号的棋盘格,例如

baba
abab
baba

为此,我假设你可以生成一个数组

baba
baba
baba

并反转第二行。

生成数组很简单:3 4 $ 'ba'。但扭转第二排是我奋斗的地方。

我可以得到|. 1 { 3 4 $ 'ba'的第二行的反向,但这只给了我第二行,而不是整个数组。我不知道如何使用J语法我实际上可以保留顶行和底行,只将|.应用到中间行。

更一般地说,您如何仅在每隔一行应用|.

5 个答案:

答案 0 :(得分:4)

你问的是什么

要将|.应用于一行,请尝试以下操作:

   x =: 3 4 $ 'ba'
   (|. 1{x) 1} x
baba
abab
baba

要反转所有其他行,我不知道是否有比这更简单的东西:

   ,/ 1 (]`(|."1))\ i. 5 4
 0  1  2  3
 7  6  5  4
 8  9 10 11
15 14 13 12
16 17 18 19

这使用了\ (Infix)的{​​{3}}:

  

x m\ y将动名词m中的连续动词应用于y的词缀,并根据需要循环延伸m

这里,x是1,所以我们的“中缀”只是1×4矩阵;我们循环通过一个动名词(] ` (|."1)),在不做任何事情(])和反转子矩阵的单行(|."1)之间交替。然后,我们将得到的5×1×4阵列压缩为带有,/的5×4矩阵。

你想要的是

实现“棋盘格”的一种更简单的方法如下:首先,在两个范围上使用+/来创建“添加表”,如下所示:

   (i.3) +/ (i.4)
0 1 2 3
1 2 3 4
2 3 4 5

然后取所有这些值mod 2,得到一个0和1的棋盘图案:

   2 | (i.3) +/ (i.4)
0 1 0 1
1 0 1 0
0 1 0 1

然后使用{选择字符串进行索引:

   (2 | (i.3) +/ (i.4)) { 'ba'
baba
abab
baba

答案 1 :(得分:4)

方式1:修改}

用更改的行替换第二行:

( 4 $ 'ab') (1 }) m =: 3 4 $ 'ba'

或一般情况下,使用模式a =: 4 $ 'ab'替换索引i =: +:i.5

a i } 10 4 $ 'ba'

方式2:使用动名词循环并剪切;.

你可以用`来绑定它们来循环地应用动词。对于每隔一行(等级"1),您要么不做任何事情]或反向|.

(]"1)`(|."1) ;.1 m

方式3:使用不同的模式

您可以将模式显示为4 $ 'ba',后跟其反转:

3 $ (,:|.) 4 $ 'ba'

顺便提及,

具有偶数模式的奇数维(3)(' ba')可以让您更简单|: 4 3 $ 'ba'

答案 2 :(得分:4)

嗯,你已经有了很多答案,但是没有一个是我脑子里的第一件事,所以我会加上这个:

0 1 0 |."(0 1) 3 4$'ba'

这利用了将中间行旋转1看起来与翻转它相同的事实。根据棋盘中的行数,您可以根据需要计算0和1的列表来概括这一点。

答案 3 :(得分:3)

我尝试的方法不需要反转数组的线,但通过以J友好的方式重构情况。

我会在数组中添加一列,以便我有一个奇数列(5)和偶数个元素('ba'),然后去除每行中的最后一项。

   4 5$'ba'
babab
ababa
babab
ababa
   }:"1 (4 5$'ba')
baba
abab
baba
abab

答案 4 :(得分:2)

这是另一种以“J友好方式”重新构建这个特定问题的方法,正如鲍勃所说的那样。它不会“修改一行”,而是以不同的方式实现所需的结果。

   |: 4 3 $ 'ba'  NB. transpose a 4x3 matrix
baba
abab
baba