私の最初の J プログラムをソルバーオイラー問題 #1 (3 または 5 の倍数である 1000 未満のすべての自然数の合計を見つける) に書いたところ、次の解決策が得られました。
+/(+./0=3 5|/n)#n=.i.1000
ただし、変数を使用せずにそれを行う賢い方法があると確信しています。3 5
フォークを使って書き直そうとしましたが、 () の間の式をandに適用される動詞として置き換える方法がわかりませんi.1000
。誰でも私を助けることができますか?
私の最初の J プログラムをソルバーオイラー問題 #1 (3 または 5 の倍数である 1000 未満のすべての自然数の合計を見つける) に書いたところ、次の解決策が得られました。
+/(+./0=3 5|/n)#n=.i.1000
ただし、変数を使用せずにそれを行う賢い方法があると確信しています。3 5
フォークを使って書き直そうとしましたが、 () の間の式をandに適用される動詞として置き換える方法がわかりませんi.1000
。誰でも私を助けることができますか?
両方の値をパラメータ化して二項動詞に一般化するには、各パラメータを必要な場所に渡す必要があります。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 つの場所で発生します。
追記:コメントで示したように、[ |/ ]
単純化すると|/