我已经开始使用Clojure进行Project Euler,这是学习Clojure的第一次尝试.我已经解决了第一个任务:
求出1000以下3或5的所有倍数的总和.
我以前用Python解决了它:
sum(i for i in xrange(1000) if i%3==0 or i%5==0)
Run Code Online (Sandbox Code Playgroud)
这是我的第一次Clojure尝试:
(reduce +
(filter
(fn [x]
(or
(= 0 (mod x 3))
(= 0 (mod x 5))))
(range 1000)))
Run Code Online (Sandbox Code Playgroud)
我真的很惊讶它有多详细,但我很确定这是因为我的风格和对Clojure成语的无知.
这个Clojure代码的惯用版本会是什么样的?
我正试图解决你可能遇到的以下现实问题:
你和一些朋友共进晚餐,你们都同意平均分摊账单.除了账单终于到来之外,你发现不是每个人都有足够的现金(如果有的话,便宜的混蛋).
所以,你们中的一些人比其他人付出更多......之后你们回家并试着决定"谁欠谁的数额?".
这个,我正在尝试以算法和公平的方式解决:)
一开始看起来这么容易,但是我已经陷入了四舍五入的困境,我觉得这完全是一个失败者;)
关于如何解决这个问题的任何想法?
编辑:一些python代码,以显示我的困惑
>>> amounts_paid = [100, 25, 30]
>>> total = sum(amounts_paid)
>>> correct_amount = total / float(len(amounts_paid))
>>> correct_amount
51.666666666666664
>>> diffs = [amnt-correct_amount for amnt in amounts_paid]
>>> diffs
[48.333333333333336, -26.666666666666664, -21.666666666666664]
>>> sum(diffs)
7.1054273576010019e-015
Run Code Online (Sandbox Code Playgroud)
理论上,差异的总和应为零,对吧?
另一个例子它工作:)
>>> amounts_paid = [100, 50, 150]
>>> total = sum(amounts_paid)
>>> correct_amount = total / float(len(amounts_paid))
>>> correct_amount
100.0
>>> diffs = [amnt-correct_amount for amnt in amounts_paid]
>>> diffs
[0.0, -50.0, 50.0]
>>> sum(diffs)
0.0
Run Code Online (Sandbox Code Playgroud)