2

我是 Scala 和函数式编程的新手。

我正在解决你必须阅读数字,然后是整数的问题。之后,您应该计算所有整数中所有数字的总和。

这是我的代码

def sumDigits(line: String) = 
    line.foldLeft(0)(_ + _.toInt - '0'.toInt)

  def main(args: Array[String]) {
    val numberOfLines = Console.readInt
    val lines = for (i <- 1 to numberOfLines) yield Console.readLine   
    println(lines.foldLeft(0)( _ + sumDigits(_)))
  }

有没有更优雅或更高效的方法?

4

4 回答 4

6

sumDigits()可以通过以下方式更轻松地实现sum

def sumDigits(line: String) = line.map(_.asDigit).sum

第二个foldLeft()也可以替换为sum

lines.map(sumDigits).sum

这将我们带到了最终版本(注意没有main,而是用 extend App):

object Main extends App {

    def sumDigits(line: String) = line.map(_.asDigit).sum

    val lines = for (_ <- 1 to Console.readInt) yield Console.readLine   
    println(lines.map(sumDigits).sum)

}

或者如果你真的想在一行中尽可能地挤压,内联sumDigits(不推荐):

lines.map(_.map(_.asDigit).sum).sum
于 2013-01-25T23:13:09.200 回答
4

我喜欢紧凑的代码,所以我可能会(如果我真的想简洁的话)

object Reads extends App {
  import Console._
  println( Seq.fill(readInt){readLine.map(_ - '0').sum}.sum )
}

它设置内联的行数并随时进行处理。但是,没有错误检查。您可以.filter(_.isDigit)在 the 之后添加一个权利,readLine以至少丢弃非数字。您也可以def p[A](a: A) = { println(a); a }将读取内容包装起来,p以便查看输入的内容(默认情况下,在某些平台上,至少屏幕没有回声)。

于 2013-01-25T23:38:07.430 回答
1

单线答案:

 Iterator.continually(Console.readLine).take(Console.readInt).toList.flatten.map(_.asDigit).sum
于 2013-01-25T23:36:34.633 回答
0

line首先,您必须对现有的十进制整数子字符串进行某种解析:

val numbers = "5 1 4 9 16 25"
val ints = numbers.split("\\s+").toList.map(_.toInt)

然后你想把第一个作为计数,其余的保持解码和求和:

val count :: numbers = ints

然后使用内置的 sum 方法:

val sum = numbers.sum

总共在 REPL 中:

scala> val numbers = "5 1 4 9 16 25"
numbers: String = 5 1 4 9 16 25

scala> val ints = numbers.split("\\s+").toList.map(_.toInt)
ints: List[Int] = List(5, 1, 4, 9, 16, 25)

scala> val count :: numbers = ints
count: Int = 5
numbers: List[Int] = List(1, 4, 9, 16, 25)

scala> val sum = numbers.sum
sum: Int = 55

如果你想对前导数做一些事情,你可以验证它是否正确:

scala> assert(count == numbers.length)

由于断言通过,因此不会产生任何输出。

于 2013-01-25T23:18:33.327 回答