我正在使用Project Euler,我正在problem 8,我正在尝试一个简单的蛮力:将数字的每个连续5位数相乘,列出结果列表,然后找到更高。
这是我目前正在尝试用J编写的代码:
n =: 731671765313x
NB. 'n' will be the complete 1000-digits number
itl =: (".@;"0@":)
NB. 'itl' transform an integer in a list of his digit
N =: itl n
NB. just for short writing
takeFive =: 5 {. ] }.~ 1 -~ [
NB. this is a dyad, I get this code thanks to '13 : '5{.(x-1)}.y'
NB. that take a starting index and it's applied to a list
如何使用takeFive获取N的所有索引? 我试过了:
(i.#N) takeFive N
|length error: takeFive
| (i.#N) takeFive N
但它不起作用,我不知道为什么。 谢谢大家。
答案 0 :(得分:1)
1。 (i.#N) takeFive N
无效的原因是您实际上是在尝试运行5{. ((i.#N)-1) }. N
,但您必须使用x
作为列表但作为一个原子。您可以通过设置动词的相应left-right rank "
来完成此操作:
(i.#N) (takeFive"0 _) N
7 3 1 6 7
7 3 1 6 7
3 1 6 7 1
1 6 7 1 7
6 7 1 7 6
7 1 7 6 5
1 7 6 5 3
7 6 5 3 1
6 5 3 1 3
5 3 1 3 0
3 1 3 0 0
1 3 0 0 0
2. 另一种方法是将您的列表(&
)绑定(N
)到takeFive
,然后通过每个{运行binded-verb {1}}。要做到这一点,最好使用反向版本的takeFive:i.#N
:
takeFive~
或((N&(takeFive~))"0) i.#N
7 3 1 6 7
7 3 1 6 7
3 1 6 7 1
1 6 7 1 7
6 7 1 7 6
7 1 7 6 5
1 7 6 5 3
7 6 5 3 1
6 5 3 1 3
5 3 1 3 0
3 1 3 0 0
1 3 0 0 0
。
3。但我认为,infix dyad \
可能会为您提供更好的服务:
(N&(takeFive~)) each i.#N