在Scala 2.8中,有一个对象scala.collection.package.scala:
def breakOut[From, T, To](implicit b : CanBuildFrom[Nothing, T, To]) =
new CanBuildFrom[From, T, To] {
def apply(from: From) = b.apply() ; def apply() = b.apply()
}
Run Code Online (Sandbox Code Playgroud)
我被告知这会导致:
> import scala.collection.breakOut
> val map : Map[Int,String] = List("London", "Paris").map(x => (x.length, x))(breakOut)
map: Map[Int,String] = Map(6 -> London, 5 -> Paris)
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?为什么breakOut被称为我的论据List?
河内之塔是一个难题,如果你不熟悉它,它的工作原理如下:
游戏区域包括3个杆和x个盘,每个盘下一个比前一个更大.可以将这些磁盘放在杆上,这些规则如下:
最后-游戏领域STARTS是这样的:
游戏的目标是将原始"堆叠"的磁盘移动到另一根杆上,即 - 将所有磁盘放在另一根杆上,因此(再次)最大的是在底部,最小的在顶部
您的目标是使用您选择的编程语言编写程序,接受输入(如下所述)并输出解决位置所需的步骤.
一如既往,尽量让它尽可能短.
输入
输入示例:
4-3,7-6-5,2-1
Run Code Online (Sandbox Code Playgroud)
输入是一个字符串,由3个部分组成,以逗号分隔.这些部件是3根杆上每个杆上的磁盘列表.它们也是分开的,这次是连字符( - ),每个子部分都是一个数字,数字越大,磁盘越大.
所以 - 对于上面的输入,这将是一个直观的表示:
. . .
| =====|===== |
===|=== ======|====== =|=
====|==== =======|======= ==|==
ROD 1 ROD 2 ROD 3
Run Code Online (Sandbox Code Playgroud)
产量
正如您在上面的表示中所看到的那样 - 输入的最左侧部分是第一个杆,中间是第二个杆,最后一个是第3个杆.
程序的输出应如下所示:
12,23,31,12,23,13
Run Code Online (Sandbox Code Playgroud)
一个数字列表,用逗号分隔,用于定义应该取出磁盘的磁带,以及磁盘应放在的磁带上.只有3个杆,因此只有6种可能的组合(因为盘必须移动到另一个杆,而不是相同的杆):
12
13
21
23
31
32
Run Code Online (Sandbox Code Playgroud)
输入不必描述处于"原始"状态的字段 - 它可以是中间求解的.
您的程序无法生成空输出.如果输入IS处于原始状态,只需将磁盘放入不同的杆.
输入可以有一个空杆,如下所示:
2-1,3,
,,1
4-3,,2-1
Run Code Online (Sandbox Code Playgroud)
如果输入的格式不是这样,则程序可能会产生未定义的行为.因此,如果输入无效(例如较小的磁盘,丢失的磁盘,无法解决),它就可以. …