合并此J代码

时间:2011-10-16 21:11:39

标签: list j

我正在学习J并从基础开始;将3和5的倍数加到100以下。我用这段代码得到了它:

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

但似乎应该有一种更简单的方法。有没有办法让这个代码更干净?感谢。

1 个答案:

答案 0 :(得分: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

您可以使用~.(Nub)从列表中删除任何重复项,而不是从原始总和中减去15的倍数之和,以避免重复计数是3和5的倍数。在求和之前,3的倍数和5的倍数。

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

有关此问题的更多Jish方法,请参阅this stackoverflow question的答案。