Gre*_*ley 19 j tacit-programming
我目前正在学习迷人的J编程语言,但有一点我无法弄清楚如何过滤列表.
假设我有任意列表3 2 2 7 7 2 9,我想删除2s,但保持其他一切不变,即我的结果将是3 7 7 9.我怎么做到这一点?
Yas*_*aev 31
2 (~: # ]) 3 2 2 7 7 2 9
3 7 7 9
Run Code Online (Sandbox Code Playgroud)
我有你的答案,但在你熟悉一些细节之前.开始了.
J中有两种类型的动词:monad和dyads.前者只接受一个参数,后者接受两个参数.
例如,将唯一参数传递给名为tally的monadic动词,计算列表中元素的数量:#
# 3 2 2 7 7 2 9
7
Run Code Online (Sandbox Code Playgroud)
#接受两个参数(左和右)的动词称为副本,它是二元的,用于从左侧列表中的相应元素指定的次数复制右侧列表中的元素(可能只有一个元素)在列表中也):
0 0 0 3 0 0 0 # 3 2 2 7 7 2 9
7 7 7
Run Code Online (Sandbox Code Playgroud)
在J中有一个fork概念,它是一系列3个动词,适用于他们的论证,可以是二元或一元的.
这是我在第一个片段中使用的一种分支图:
x (F G H) y
G
/ \
F H
/ \ / \
x y x y
Run Code Online (Sandbox Code Playgroud)
它描述了动词应用于其参数的顺序.因此这些应用发生:
2 ~: 3 2 2 7 7 2 9
1 0 0 1 1 0 1
Run Code Online (Sandbox Code Playgroud)
的~:(不等于)是二进在该示例中并且导致当参数不等于其是真布尔值的列表2.这是F根据图表的应用程序.
下一个应用是H:
2 ] 3 2 2 7 7 2 9
3 2 2 7 7 2 9
Run Code Online (Sandbox Code Playgroud)
](identity)可以是monad或dyad,但它总是返回传递给动词的正确参数(有一个相反的动词,[它返回..是的,左边的参数!:)
到现在为止还挺好.F并H在申请后相应地返回这些值:
1 0 0 1 1 0 1
3 2 2 7 7 2 9
Run Code Online (Sandbox Code Playgroud)
要执行的唯一步骤是G动词应用程序.
正如我前面提到的,动词#是二元的(接受两个参数),允许我们从右参数中复制项目的次数与左参数中相应位置中指定的次数相同.因此:
1 0 0 1 1 0 1 # 3 2 2 7 7 2 9
3 7 7 9
Run Code Online (Sandbox Code Playgroud)
我们刚刚从2s 过滤了列表.
这两个文件中描述了稍微不同的叉子,钩子和其他原始物(包括上面提到的):
信息的其他有用的来源是Jsoftware网站与他们的维基和互联网络的几个邮件列表存档.
小智 6
只是为了确定它是清楚的,直接的方式 - 回答原始问题 - 是这样的:
3 2 2 7 7 2 9 -. 2
Run Code Online (Sandbox Code Playgroud)
这回来了
3 7 7 9
Run Code Online (Sandbox Code Playgroud)
更精细的方法 - 生成布尔值并使用它来压缩向量 - 更加简洁.
要在非常长的帖子中回答另一个问题,要返回第一个元素及其发生的次数,只需:
({. , {. +/ .= ]) 1 4 1 4 2 1 3 5
1 3
Run Code Online (Sandbox Code Playgroud)
这是一个使用"{."的分支.得到第一项,"{.+ /.=]"加起来第一项等于每个元素的次数,","作为连接这两部分的中间动词.
小智 5
还:
2 ( -. ~ ]) 3 2 2 7 7 2 9
3 7 7 9
Run Code Online (Sandbox Code Playgroud)