私は J を学んでいて、基本的なことから始めています。100 未満の 3 と 5 の倍数を追加します。次のコードで取得しました。
(+/((((i.100)|~ 3) = 0) # (i.100)),((((i.100)|~ 5) = 0) # (i.100)))-(((i.100|~15)=0) # (i.100))
しかし、もっと簡単な方法があるはずです。このコードをきれいにする方法はありますか? ありがとう。
現在のコードでは長さのエラーが発生することに注意してください。ただし、機能させるために質問を編集することを提案しました。今のところ、以下の作業コードも含めます。
(+/((((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への回答を参照してください。