用 J 中的每次替换修改多个索引

Amend with multiple indices per substitution in J

在 J 中,当您遇到以下情况时,您如何惯用地修改数组:

substitution0    multipleIndices0
...
substitutionN    multipleIndicesN

(不要混淆:

substitution0    multipartIndex0
...
substitutionN    multipartIndexN

)

例如,我对经典 fizzbuzz 问题的尝试如下所示:

   i=.3 :'<@I.(,*./)(=<.)3 5%~"(0 1)y'
   d=.1+i.20
   'fizz';'buzz';'fizzbuzz' (i d)};/d
|length error
|   'fizz';'buzz';'fizzbuzz'    (i d)};/d

我创建了动词 m},其中 m 是 i d,它是 3 个包含不同大小的一维索引列表的框,而我认为 } 期望 m 是包含单个列表的框,每个列表代表一个索引,其维度至少与正确参数的等级一样少。

这个一般是怎么解决的?

'fizz';'buzz';'fizzbuzz' (i d)};/d

这有几个问题:

  1. } 的 x 参数是 'fizzbuzz',而不是框列表,因为 } 出现在左侧的 ; 之前。你是说
('fizz';'buzz';'fizzbuzz') (i d)};/d
  1. } 的 m 参数中的框内数字未按您预期的方式解释:
   _ _ (1 1;2 2) } i.3 3
0 1 2
3 _ 5
6 7 _
   _ _ (1 1;2 2) } ,i.3 3  NB. your length error
|length error
|   _ _    (1 1;2 2)},i.3 3

  1. 如果您删除 m 参数,您会得到正确类型的索引,但 x 列表中的成员仍然不足:
   _ _ (;1 3;5 7) } i.9
|length error
|   _ _    (;1 3;5 7)}i.9
   _ _ _ _ (;1 3;5 7) } i.9
0 _ 2 _ 4 _ 6 _ 8

这些工作:

   NB. raze m and extend x (fixed)
   i=.3 :'<@I.(,*./)(=<.)3 5%~"(0 1)y'
   d=.1+i.20
   ((;# each i d)#'fizz';'buzz';'fizzbuzz') (;i d)};/d
+-+-+----+-+----+----+-+-+--------+----+--+----+--+--+----+--+--+--------+--+----+
|1|2|fizz|4|fizz|buzz|7|8|fizzbuzz|buzz|11|fizz|13|14|buzz|16|17|fizzbuzz|19|fizz|
+-+-+----+-+----+----+-+-+--------+----+--+----+--+--+----+--+--+--------+--+----+


   NB. repeatedly mutate d
   i=.3 :'<@I.(,*./)(=<.)3 5%~"(0 1)y'
   d=.;/1+i.20
   ('fizz';'buzz';'fizzbuzz'),.(i ;d)
+--------+--------------+
|fizz    |2 5 8 11 14 17|
+--------+--------------+
|buzz    |4 9 14 19     |
+--------+--------------+
|fizzbuzz|14            |
+--------+--------------+
   0$(3 : 'd =: ({.y) (1{::y) }d')"1 ('fizz';'buzz';'fizzbuzz'),.(i ;d)
   d
+-+-+----+-+----+----+-+-+----+----+--+----+--+--+--------+--+--+----+--+----+
|1|2|fizz|4|buzz|fizz|7|8|fizz|buzz|11|fizz|13|14|fizzbuzz|16|17|fizz|19|buzz|
+-+-+----+-+----+----+-+-+----+----+--+----+--+--+--------+--+--+----+--+----+