用 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
这有几个问题:
}
的 x 参数是 'fizzbuzz'
,而不是框列表,因为 }
出现在左侧的 ;
之前。你是说
('fizz';'buzz';'fizzbuzz') (i d)};/d
}
的 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
- 如果您删除 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|
+-+-+----+-+----+----+-+-+----+----+--+----+--+--+--------+--+--+----+--+----+
在 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
这有几个问题:
}
的 x 参数是'fizzbuzz'
,而不是框列表,因为}
出现在左侧的;
之前。你是说
('fizz';'buzz';'fizzbuzz') (i d)};/d
}
的 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
- 如果您删除 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|
+-+-+----+-+----+----+-+-+----+----+--+----+--+--+--------+--+--+----+--+----+