我刚刚开始学习J,而且我不知道该怎么做
假设我想要打印2个符号的棋盘格,例如
baba
abab
baba
为此,我假设你可以生成一个数组
baba
baba
baba
并反转第二行。
生成数组很简单:3 4 $ 'ba'
。但扭转第二排是我奋斗的地方。
我可以得到|. 1 { 3 4 $ 'ba'
的第二行的反向,但这只给了我第二行,而不是整个数组。我不知道如何使用J语法我实际上可以保留顶行和底行,只将|.
应用到中间行。
更一般地说,您如何仅在每隔一行应用|.
?
答案 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)
}
用更改的行替换第二行:
( 4 $ 'ab') (1 }) m =: 3 4 $ 'ba'
或一般情况下,使用模式a =: 4 $ 'ab'
替换索引i =: +:i.5
:
a i } 10 4 $ 'ba'
;.
你可以用`来绑定它们来循环地应用动词。对于每隔一行(等级"1
),您要么不做任何事情]
或反向|.
:
(]"1)`(|."1) ;.1 m
您可以将模式显示为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