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

2番目は次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)

}

または、本当に1行でできるだけ多く絞りたい場合は、インライン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)するために、 の後に右を挿入できます。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まず、既存の 10 進整数部分文字列を分解するために何らかの解析を行う必要があります。

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 に答える