了解从J中的列表添加

rea*_*ble 4 j

我正在写一本关于J的书并且有练习的答案,但我很难理解它们的工作原理.

这是一个问题:

彼得和保罗的高尔夫球得分以列表"y."的形式出现,例如3 4 4 4 5 6 3 3 7 2等.写一个表达式,给出彼得总得分与总得分之间的差异保罗的分数.写一个进一步的表达式,获得彼得和保罗18洞的总得分.

第一个问题的答案是:

-/y
Run Code Online (Sandbox Code Playgroud)

我知道这是在列表中的每个项目之间插入n-1个减法符号,有效地得到每个洞的得分差异,并在最后给出总和.

第二个问题的答案是:

(36$0 1)+//.y
Run Code Online (Sandbox Code Playgroud)

我不明白如何思考这个答案.从右到左,

  1. 你正在列出"y"
  2. 将动词的n-1个副本插入该列表
  3. 然后"+ /"告诉你,你将以特定的方式做到这一点......
  4. 括号内的二元句告诉你...... ??? 这是我迷路的地方.

显然,它告诉解释者交替地对原子求和,产生两个和.但我不知道如何/为什么.

我很感激你们能提供的任何启示.:)

Eel*_*vex 6

使用密钥/.:

键对所有元素x v/. y应用动词但 x 分组:vy

0 0 1 0 1 2 < /. 1 2 3 4 5 6
?????????????
?1 2 4?3 5?6?
?????????????

0 0 1 0 1 2 +/ /. 1 2 3 4 5 6
7 8 6
Run Code Online (Sandbox Code Playgroud)

在你的情况下,分组是(36 $ 0 1)和要应用的动词是+/(让我们说y =: i.36):

36 $ 0 1
0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
(36 $ 0 1) < /. y
???????????????????????????????????????????????????????????????????????????????????????????????????
?0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34?1 3 5 7 9 11 13 15 17 19 21  23 25 27 29 31 33 35?
???????????????????????????????????????????????????????????????????????????????????????????????????
(36 $ 0 1) +//. y
306 324
Run Code Online (Sandbox Code Playgroud)

对于这个特殊的问题,我更喜欢做的是$ y适当地塑造并且只是将相应的轴相加.例如:

18 2 $ y     NB. or even better _2 ,\y
0  1
2  3
4  5
...
+/ 18 2 $ y
306 324
Run Code Online (Sandbox Code Playgroud)