所以我正在尝试制作一个基本的hitori解算器,但我不知道我应该从哪里开始。我还是Scala的新手。
我的第一个问题是我想要一些一些整数(1,2,3,4,2) 并使程序输出如下:(1,2,3,4,B)
请注意副本已成为字符B.
我从哪里开始?这就是我已经做过的事情,但没有做我真正需要的事情。
val s = lines.split(" ").toSet;
var jetSet = s
for(i<-jetSet){
print(i);
}
答案 0 :(得分:1)
一种方法是折叠数字,从左到右,构建Set[Int]
,进行唯一性测试,以及输出列表。
val arr = Array(1,2,3,4,2)
arr.foldLeft((Set[Int](),List[String]())){case ((s,l),n) =>
if (s(n)) (s,"B" :: l)
else (s + n, n.toString :: l)
}._2.reverse // res0: List[String] = List(1, 2, 3, 4, B)
从这里,您可以使用mkString()
根据需要格式化输出。
答案 1 :(得分:0)
我建议的是将程序分解为多个步骤并尝试解决这些问题。
作为第一步,您可以将列表转换为数字的元组和它们到目前为止出现的次数......
(1,2,3,4,2)变为((1,1),(2,1),(3,1),(4,1),(2,2)
下一步很容易在此列表上进行映射,如果计数为1则返回数字,如果数字更大,则返回字母。
第一步有点棘手,因为当您浏览列表时,您需要跟踪到目前为止每封信中看到的数量。
当您想要处理序列并保持一些变化状态时,您应该使用折叠。如果你不熟悉折叠,它有以下签名:
def foldLeft[B](z: B)(op: (B, A) => B): B
请注意,z的类型(初始值)必须与折叠(B)的返回值类型相匹配。
所以一种方法是将类型B作为元组(outputList,seensofarCounts)
outputList将通过获取下一个数字并更新到目前为止您已看到的每个数字的数量的地图在每个步骤中累积。 &#34; seensofarCounts&#34;将是数字和当前计数的地图。
所以你从foldLeft得到的是(((1,1),(2,1),(3,1),(4,1),(2,2),Map(1)的元组 - &gt; 1,2,2 ETC ......))
现在,您可以如上所述映射元组的第一个元素。
一旦它正常工作,你可以避免最后一步,在你完成整理过程中将数字更新为字母。
通常这种将事情分解为步骤的技巧使得理由变得简单,然后当它工作时你可能会看到一些步骤相互坍塌。
希望这有帮助。