0

私の最初の J プログラムをソルバーオイラー問題 #1 (3 または 5 の倍数である 1000 未満のすべての自然数の合計を見つける) に書いたところ、次の解決策が得られました。

+/(+./0=3 5|/n)#n=.i.1000

ただし、変数を使用せずにそれを行う賢い方法があると確信しています。3 5フォークを使って書き直そうとしましたが、 () の間の式をandに適用される動詞として置き換える方法がわかりませんi.1000。誰でも私を助けることができますか?

4

1 に答える 1

3

両方の値をパラメータ化して二項動詞に一般化するには、各パラメータを必要な場所に渡す必要があります。3 5このフォークから始めることで、実際に必要な唯一のポイントに集中できます。

   3 5 ([ |/ i.@]) 1000

プログラム全体では、2 つの場所に整数リストが必要です。名前 ( n) により、そのリストを両方の場所で簡単に使用できるようになりました。プログラム全体をすばやく配置するために、これを書いているときに、最初にリストを 2 回計算しました。

   3 5 ([: +/ i.@] # [:+./ 0= [ |/ i.@]) 1000

これは、プログラム全体を二項動詞として表現することに成功しますが、i.2 回出現することには欠点があります。正しいフォークにすることで、一度だけ発生するように抽出できます。そのフォークの中心は、新しい内動詞です。

   3 5 ([: +/ [ (] # [:+./ 0= [ |/ ]) i.@]) 1000
NB.              ___________________             new "inner" verb, parenthesized

この内部動詞は引数として the を受け取る必要が3 5あるため、最も外側の動詞の左引数をこの内部動詞の左引数として渡します。これは[、内側の動詞の Left ( ) が、最も外側の引数を参照したときの以前のバージョンと同じ値を持つことを意味します。この新しい動詞内で、Right ( ]) は整数のリストを指し、i.@]前に現れた 2 つの場所で発生します。

追記:コメントで示したように、[ |/ ]単純化すると|/

于 2013-02-28T20:22:56.723 に答える