0

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

(+/((((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

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

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

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

于 2011-10-17T10:22:22.520 回答