2

这可能最终会变得非常简单,但我要求更多来帮助我学习更好的 Scala 习语(Python 人希望学习一些 scala 技巧。)

我正在做一些黑客等级问题,输入方法需要从标准输入读取行。该规范引用如下:

第一行包含测试用例 T 的数量。接下来是 T 测试用例。每个 case 包含两个整数 N 和 M。

所以在传递给脚本的输入中看起来像这样:

4
2 2
3 2
2 3
4 4

我想知道这样做的正确,惯用的方法是什么。我想到了几个:

  • 使用io.Source.stdin.readLines.zipWithIndex,然后在 foreach 中,如果索引大于 0,则在空白处拆分并映射到(_.toInt)
  • 使用相同的readLines函数获取输入,然后对索引进行模式匹配。
  • 在空格和换行符上拆分以制作单个数字列表, map toInt,弹出第一个元素(问题大小),然后模 2 为我的问题函数制作参数元组。

我想知道更有经验的 scala 程序员会考虑解析这些 args 的最佳方法,其中 2 个元素行将是函数的 args,而第一个单个数字行只是要解决的问题的数量。

4

2 回答 2

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
于 2013-11-03T17:41:45.783 回答
0

另一种读取 Hacker Rank 问题输入的方法是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
于 2017-06-13T16:26:11.970 回答