Project Euler #001 in J

"Project Euler exists to encourage, challenge, and develop the skills and enjoyment of anyone with an interest in the fascinating world of mathematics."

Jの練習のためにとりあえず1問目を解いてみた.「1000未満の3または5の倍数の和を求めよ.」

1 1 _1 +/@(*(*-:@(*>:)@<.@(999&%))) 3 5 15
233168

解説:999/3, 999/5, 999/15 を求め,それらに和の公式 n(n+1)/2 を適用し,結果にそれぞれ3, 5, 15を掛け,±1を掛けて符号を調節してから和を取っている.Jにはいわゆる関数として単項および二項演算子しかないので,もうちょっと複雑になると引数を配列に括って添え字アクセスしないといけなくなりそう.
こんなことをしていたら久々に休日にあったTopCoder SRMに参加し損ねてしまった... orz
愚直な別解:1000未満の各数に対し倍数であるかどうかのテストを行い,最後に条件を満たす数の和を求める.正確には,第i要素が,iが3または5の倍数なら1,さもなくば0であるような配列を生成し,それを1000までの数の配列に掛け,和を取った.

+/(*+./@(=<.)@( 3 5 &(%~/))) i.1000
233168

Point-free styleは単一の引数を複数回使うような関数の定義で困る... Jではhookやforkにおいて同一の引数を2回使う縮退した場合がサポートされてるけど,限界がある.二項演算子で第1引数と第2引数を使う場所が,構文木の深さで並べたとき交互になるような場合はどうすればいいんだ? JではS, K, Iの各コンビネータと(手動の)Curry化が実現できるので原理的に「可能」であることは確かだが...
追記: Hook構文はSコンビネータぽいけどCurry化できないからやっぱ駄目じゃね?