2011-10-16 35 views
0

我正在学习J并从一些基本的东西开始;加上3和5的倍数低于100.我得到它与这个代码:巩固这个J代码

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

但它似乎应该有一个更简单的方法。有什么办法让代码更清洁吗?谢谢。

+0

可能重复[如何在J中重构此?](http://stackoverflow.com/questions/1555807/how-to-refactor-this-in-j) – MPelletier

回答

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办法对这个问题看答案this stackoverflow question

+0

啊是的,谢谢..我有一对夫妇从我的记事本复制时发生转录错误。我会解决它们。但是谢谢 – Deho

+0

当然,你也可以通过'(n * i。>。100%n)'得到低于100的n的倍数。所以:'+ /〜。(3 * i。>。100%3),(5 * i。>。100%5)' – Eelvex