我刚刚开始学习 J,有些事情我不知道该怎么做
例如,假设我想打印一个包含 2 个符号的棋盘格
baba
abab
baba
Run Code Online (Sandbox Code Playgroud)
为此,我假设您可以生成一个数组
baba
baba
baba
Run Code Online (Sandbox Code Playgroud)
并反转第二行。
生成所述阵列易于:3 4 $ 'ba'。但是倒车第二排是我挣扎的地方。
我可以得到第二行的相反结果,|. 1 { 3 4 $ 'ba'但这只会给我第二行,而不是整个数组。我不知道如何使用 J 语法我实际上可以保留顶行和底行并且仅适用|.于中间行。
更一般地说,您将如何|.仅应用每隔一行?
要应用于|.一行,请尝试以下操作:
x =: 3 4 $ 'ba'
(|. 1{x) 1} x
baba
abab
baba
Run Code Online (Sandbox Code Playgroud)
要反转每隔一行,我不知道是否有比这更简单的东西:
,/ 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
Run Code Online (Sandbox Code Playgroud)
这使用了dyad 的一个相对晦涩的特征\ (Infix):
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
Run Code Online (Sandbox Code Playgroud)
然后将所有这些值取模 2,以获得 0 和 1 的棋盘模式:
2 | (i.3) +/ (i.4)
0 1 0 1
1 0 1 0
0 1 0 1
Run Code Online (Sandbox Code Playgroud)
然后从选择的字符串中索引{:
(2 | (i.3) +/ (i.4)) { 'ba'
baba
abab
baba
Run Code Online (Sandbox Code Playgroud)