0

私は J を学んでいて、基本的なことから始めています。100 未満の 3 と 5 の倍数を追加します。次のコードで取得しました。

(+/((((i.100)|~ 3) = 0) # (i.100)),((((i.100)|~ 5) = 0) # (i.100)))-(((i.100|~15)=0) # (i.100))

しかし、もっと簡単な方法があるはずです。このコードをきれいにする方法はありますか? ありがとう。

4

1 に答える 1

1

現在のコードでは長さのエラーが発生することに注意してください。ただし、機能させるために質問を編集することを提案しました。今のところ、以下の作業コードも含めます。

(+/((((i.100)|~ 3) = 0) # (i.100)),((((i.100)|~ 5) = 0) # (i.100))) - (+/(((i.100)|~15)=0) # (i.100))

操作の順序を変更するだけで、同じアルゴリズムをより簡単に (とにかく括弧を少なくして) 書くことができます (J は「文」を右から左に評価します)。

   (+/ ((0 = 3|i.100) # i.100) , ((0 = 5|i.100) # i.100)) - +/(0 = 15|i.100)#i.100
2318

元の合計から 15 の倍数の合計を減算して 3 と 5 の両方の倍数である数を二重にカウントするのではなく、~.(Nub) を使用して、3 の倍数と 5 の倍数のリストから重複を削除することができます。それらを合計します。

   +/ ~. ((0 = 3|i.100) # i.100) , (0 = 5|i.100) # i.100
2318

この問題に対するより Jish なアプローチについては、この stackoverflow questionへの回答を参照してください。

于 2011-10-17T10:22:22.520 に答える