这可能最终变得非常简单,但我要求更多帮助我学习更好的Scala成语(Python的人通过交易来学习一些scala技巧。)
我正在做一些黑客等级问题,输入要求的方法是从stdin读取行。该规范引用如下:
第一行包含测试用例T.T测试用例的数量 跟随。每个案例包含两个整数N和M.
因此,传递给脚本的输入看起来像这样:
4
2 2
3 2
2 3
4 4
我想知道这样做的正确,惯用方法是什么。我想到了一些:
io.Source.stdin.readLines.zipWithIndex
,然后在foreach中,如果索引大于0,则在空格上拆分并映射到(_.toInt)
readLines
函数获取输入,然后根据索引进行模式匹配。toInt
,弹出第一个元素(问题大小),然后以模2形式为我的问题函数生成参数元组。我想知道更有经验的scala程序员会考虑解析这些args的最佳方法,其中2个元素行将是函数的args,第一个单个数字行只是要解决的问题的数量。 / p>
答案 0 :(得分:3)
也许你正在寻找这样的东西?
def f(x: Int, y: Int) = { f"do something with $x and $y" }
io.Source.stdin.readLines
.map(_.trim.split("\\s+").map(_.toInt)) // split and convert to ints
.collect { case Array(a, b) => f(a, b) } // pass to f if there are two arguments
.foreach(println) // print the result of each function call
答案 1 :(得分:0)
另一种阅读黑客排名问题输入的方法是使用scala.io.Stdin
import scala.io.StdIn
import scala.collection.mutable.ArrayBuffer
object Solution {
def main(args: Array[String]) = {
val q = StdIn.readInt
var lines = ArrayBuffer[Array[Int]]()
(1 to q).foreach(_ => lines += StdIn.readLine.split(" ").map(_.toInt))
for (a <- lines){
val n = a(0)
val m = a(1)
val ans = n * m
println(ans)
}
}
}
我今天在Hacker Rank平台上测试了它,输出是:
4
6
6
16