- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我遇到了 Mark Dominus' blog post描述解决 "SEND+MORE=MONEY" puzzle在 Python 中使用函数式编程技术(特别是 Monads)。
此处总结了死链接情况下的难题:
S E N D | Find each character's *unique* numerical value, such that
+ M O R E | the addition on the left is valid. There are no leading zeros.
-----------
= M O N E Y
我一直在寻找机会学习一些纯函数式编程,特别是 Elixir,这似乎是一个非常合适的项目。
我可以在 Elixir 中实现 Mark Dominus 的 Python 代码的外观相似版本:
defmodule Smm do
def make_set(ls), do: Enum.into(ls, HashSet.new)
def to_number([]), do: :error
def to_number(ls), do: Enum.join(ls) |> Integer.parse |> elem(0)
def remove(hs, ls), do: Set.difference(hs, Enum.into(ls, HashSet.new))
def let(x, func), do: func.(x)
def guard(predicate, func) when predicate, do: func.()
def guard(predicate, func), do: []
end
digits = Smm.make_set(0..9)
Enum.map( Smm.remove(digits, [0]), fn s ->
Enum.map( Smm.remove(digits, [s]), fn e ->
Enum.map( Smm.remove(digits, [s,e]), fn n ->
Enum.map( Smm.remove(digits, [s,e,n]), fn d ->
Smm.let(Smm.to_number([s,e,n,d]), fn w_send ->
Enum.map( Smm.remove(digits, [0,s,e,n,d]), fn m ->
Enum.map( Smm.remove(digits, [s,e,n,d,m]), fn o ->
Enum.map( Smm.remove(digits, [s,e,n,d,m,o]), fn r ->
Smm.let(Smm.to_number([m,o,r,e]), fn w_more ->
Enum.map( Smm.remove(digits, [s,e,n,d,m,o,r]), fn y ->
Smm.let(Smm.to_number([m,o,n,e,y]), fn w_money ->
Smm.guard(w_send + w_more == w_money, fn ->
[w_send, w_more, w_money] |> Enum.map( &(IO.puts(&1)) )
end)end)end)end)end)end)end)end)end)end)end)end) # (╯°□°)╯︵ ┻━┻
但有些事情告诉我必须有一种方法来解决疯狂嵌套的匿名函数和随后的表格翻转;这就是纯函数式语言存在的原因,对吧?
看看 Mark Dominus 的 previous blog post in which he solves the puzzle with Haskell ,我看到他正在使用含糖版本的 Haskell 的“绑定(bind)”运算符 >>=
来消除翻 table 的冲动......但我没有 learned me a Haskell ,所以我对这篇博文中提供的代码没有很强的把握。
我相当确定我在 Elixir 实现中缺少的是使用管道运算符 |>
,这对我来说实际上是这门语言的一大吸引力(对 Unix 非常熟悉管道,我自己)。我曾尝试在管道中工作并结合多种风格的 Enum.{map,reduce}
,但我总是回到原点。
有人可以提供任何建议吗?理想情况下,我正在为 Elixir 中的这个难题寻找更惯用的函数式编程解决方案。
最佳答案
您可以在这里查看:What is the "|>" symbol's purpose in Elixir? |>
运算符的概述。但基本思想是 a |> f(b, c)
与 f(a, b, c)
相同。当你做类似 a |> f(b) |> g(c)
的事情时,这非常有用,根据上面的规则,它与 g(f(a, b) 相同, c)
,但读起来更漂亮。
话虽如此,|>
运算符(称为管道)不是单子(monad)绑定(bind) (>>=
),并且不允许您“展平”深层嵌套循环就像 >>=
一样。对于在 Elixir 中看起来更好的任务替代方法,您可以:
停止使用这种循环方法,例如使用递归函数预先生成数字到字母的分配,如下所示:
defmodule Smm do
# some more things
def assignments(0, _), do: [[]]
def assignments(n, digits \\ Enum.into(0..9, HashSet.new)) do
digits
|> Stream.flat_map(fn (d) ->
for rest <- assignments(n - 1, Set.delete(digits, d)) do
[d | rest]
end
end)
end
end
for [s, e, n, d, m, o, r, y] <- Smm.assignments(8) do
w_send = Smm.to_number([s, e, n, d])
w_more = Smm.to_number([m, o, r, e])
w_money = Smm.to_number([m, o, n, e, y])
if s > 0 && m > 0 && (w_send + w_more == w_money) do
IO.inspect([w_send, w_more, w_money])
end
end
关于python - 在 Elixir 中寻求 "send+more=money"的惯用、优雅的解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31823272/
我将 Money/Money 与 Symfony 和 doctrine 一起使用,但我不确定应该如何执行映射。目前我使用以下内容,导致此错误消息; 错误: Money\Money could not
我指的是 moneyphp/money我计划在我们处理货币的项目之一中使用它。文档很棒,只是它没有涉及如何在数据库中持久化。它谈到将货币对象编码为 JSON,但存储字符串使得很难像比较金额或货币那样简
所以,我是 C# 和对象编程的新手,我遇到了一个小问题。 在基类中我有这个(它基本上将字符串转换为 double[]: namespace PersonalSpendings { class
我正在使用 RubyMoney/money-rails gem,我对它非常满意。 现在我需要为 money 列添加更多精度,所以我定义了一种新货币 :subunit => "S
为什么是assertNotEquals(new Money(4.0), new Money(4.0));相等吗? 此测试失败。 我真的不明白为什么这个断言不成功。 是因为assertNotEquals
如何使用 php 将这个数字 247936 转换为这个 $2,479.36? 我尝试了几种选择,例如: setlocale(LC_MONETARY, 'en_US'); echo money_form
我有一个具有数据类型 joda.money 属性的类。如何将此属性映射到 mysql 中。 我的类(class)是: @Table(name="products") public class Prod
我有一个具有数据类型 joda.money 属性的类。如何将此属性映射到 mysql。 我的类(class)是: @Table(name="products") public class Produc
我坚持使用加/减方法来定义一个名为 Money 的类,该类的对象代表美元的金额。该类应该有 2 个 int 类型的实例变量,分别表示美元和美分的金额。包括一个具有 2 个 int 类型参数(表示美元和
我有一个问题,已尝试通过 Google 搜索但尚未找到答案。我想做的是使用存储过程在 MySQL 中的两个帐户之间转账。例如,如果我使用调用转移 (20,'Test',3,5)。然后我会从 accou
我想使用应用内结算来实现虚拟货币:例如,用户可以购买 50、100 和 250 个硬币的集合。 我想知道如何管理每个用户拥有的硬币数量。我必须自己管理还是 Android 是否为此提供了一些东西?如果
以下是“pc”表,其中包含有关 pc 的详细信息。 user=> SELECT * FROM pc; code | model | speed | ram | hd | cd | p
我正在通过 codeacademy 学习 Python,并且陷入了这个 lesson : 我的代码是: def hotel_cost(nights): return 140 * nights
我有一个小型财务应用程序,前端是 PHP,后端是 MySQL。我有古老的偏见,我在 MySQL 中将货币值存储为整数美分。我的 HTML 表单允许输入美元值,例如“156.64”,我使用 PHP 将其
我正在尝试获取特定日期欧元和美元之间的汇率。问题是我总是得到日期的交换敢:LocalDate{year=2016, month=1, dayOfMonth=8} 如果我在查询中指定日期并不重要。 这是
如何创建一个仅以货币格式格式化输入的 edittext 条目?当用户输入 5 时,我希望输入看起来像“$0.05”,然后当他们输入 3 时,输入现在应该像“$0.53”,最后他们输入 6,输入应该像“
说明如下: money保存货币值数据类型,范围为-922337203685477.5808到+922337203685477.5808最大长度为8字节。 smallmoney保存货币值数据类型,
我已经将 django-money 模块安装到一个项目中。当尝试在模板中呈现时,将呈现货币文件: $100.00 有什么方法可以只渲染没有符号的十进制值吗?如: 100.00 最佳答案 money
pom.xml 中添加的依赖: javax.money money-api 1.0.3 相关代码: MonetaryAmount mon = Monetary.getDef
我有这个用于接受金钱的文本框的自定义验证: //custom validator for money fields $.validator.addMethod("money", function (v
我是一名优秀的程序员,十分优秀!