我正在学习J并从一些基本的东西开始;加上3和5的倍数低于100.我得到它与这个代码:巩固这个J代码
(+/((((i.100)|~ 3) = 0) # (i.100)),((((i.100)|~ 5) = 0) # (i.100)))-(((i.100|~15)=0) # (i.100))
但它似乎应该有一个更简单的方法。有什么办法让代码更清洁吗?谢谢。
我正在学习J并从一些基本的东西开始;加上3和5的倍数低于100.我得到它与这个代码:巩固这个J代码
(+/((((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办法对这个问题看答案this stackoverflow question。
可能重复[如何在J中重构此?](http://stackoverflow.com/questions/1555807/how-to-refactor-this-in-j) – MPelletier