Решение простой проблемы Hackerrank: сравните тройни


Даны два одинаковых по размеру массивов целых чисел A и B, вычислить количество раз A[i] > B[i] и сколько раз A[i] < B[i] для каждого индекса i.

Новичок в Scala, я собрал следующее решение:

import scala.io.Source

object Solution {

    def main(args: Array[String]) {
        val lines = Source.stdin.getLines
        val alice = lines.next.split(" ").map(_.toInt)
        val bob = lines.next.split(" ").map(_.toInt)

        val competitions = alice zip bob
        val scoreA = competitions.count(c => c._1 > c._2)
        val scoreB = competitions.count(c => c._1 < c._2)

        printf("%d %d", scoreA, scoreB)
    }
}

Я обычно решить эти проблемы с помощью Python, так что я просто искал в интернете для моей обычной конструкции программирования. У меня есть несколько вопросов.

  • Есть более общий способ печати списка целых чисел через пробел? В настоящее время я использую printf ограничивается ровно два.
  • Есть ли какие подводные камни я не знаю?
  • Идеи более лаконичные решения без ущерба для читабельности?

Любые другие идеи будут с благодарностью!



Комментарии
1 ответ

Вы не должны пройти competitions массив дважды. Результаты могут быть собраны в результате кортеж после одного обхода.

val results = competitions.foldLeft((0,0)){
case ((aw,bw),(a,b)) =>
if (a>b) (aw+1,bw) //a won
else if (b>a) (aw,bw+1) //b won
else (aw,bw) //tie
}

Кортеж элементов может осуществляться через индексацию, results._1 и results._2, но это может быть более удобным, чтобы распаковать его по шаблону.

val (scoreA, scoreB) = results

Итак, собираем все вместе, и удаление competitions шаг (просто потому, что вы можете).

val (aWins
,bWins) = alice.zip(bob)
.foldLeft((0,0)){
case ((aw,bw),(a,b)) =>
if (a>b) (aw+1,bw)
else if (b>a) (aw,bw+1)
else (aw,bw)
}

Отправляя результаты в stdout, как правило, осуществляется через println()либо шпагатом соединение...

println(aWins + " " + bWins)

...или с помощью интерполяции строк.

println(s"$aWins $bWins")

3
ответ дан 9 апреля 2018 в 04:04 Источник Поделиться