了解从 J 中的列表添加

Understanding adding from list in J

我正在阅读一本关于 J 的书并找到了练习的答案,但我无法理解它们为什么有效。

这里是问题:

Peter and Paul’s golf scores are given turn about in the form of a list "y.", for example 3 4 4 4 5 6 3 3 7 2 etc. Write an expression which gives the difference between the total of Peter’s scores and the total of Paul’s scores. Write a further expression which obtains the total scores for both Peter and Paul over 18 holes.

第一个问题的答案是:

-/y

我理解这是在列表中的每一项之间插入n-1个减法符号,有效地得到他们在每个洞上的分数差,最后给你总和。

第二个问题的答案是:

(36[=11=] 1)+//.y

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

  1. 您正在获取列表 "y"
  2. 正在将一个动词的 n-1 个副本插入该列表
  3. 然后“+/”告诉您您将以特定方式执行此操作...
  4. 括号中的二元数告诉你...???这就是我迷路的地方。

很明显,它告诉解释器交替对原子求和,产生两个总和。但我不明白如何/为什么。

非常感谢你们提供的任何启发。 :)

使用/.:

x v/. yy 的所有元素应用动词 v x:

分组
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

在您的情况下,分组是 (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

对于这个特定的问题,我更愿意做的是适当地塑造 $ y 并对相应的轴求和。例如:

18 2 $ y     NB. or even better _2 ,\y
0  1
2  3
4  5
...
+/ 18 2 $ y
306 324