Как найти слово с наибольшим количеством очков в строке? - PullRequest
1 голос
/ 24 июня 2019

Я снова выполняю некоторые задачи CodeWars.

У меня есть проблема с этим:

"Учитывая строку слов, вам нужно найти слово с наибольшим количеством очков.

Каждая буква слова набирает очки в соответствии с его положением в алфавите: a = 1, b = 2, c = 3 и т. Д.

Вам необходимо вернуть слово с наибольшим количеством очков в виде строки.

Если два слова имеют одинаковые значения, вернуть слово, которое появляется раньше в исходной строке.

Все буквы будут строчными и все входные данные будут действительными. "

Я уже искал решения для SO и использовал идею одного человека (хотя я немного ее изменил).

Это все еще не работает.

Есть идеи?

object Scoring {

def high(s: String): String = {

        var max = 0
                var whichWord = 0     
                var x = 0
                var y = new Array[Int](100)


                for(word <- s.split(" ")){
                    for(letter <- word) letter match{
                    case 'a' => y(x)+=1
                    case 'b' => y(x)+=2
                    case 'c' => y(x)+=3
                    case 'd' => y(x)+=4
                    case 'e' => y(x)+=5
                    case 'f' => y(x)+=6
                    case 'g' => y(x)+=7
                    case 'h' => y(x)+=8
                    case 'i' => y(x)+=9
                    case 'j' => y(x)+=10
                    case 'k' => y(x)+=11
                    case 'l' => y(x)+=12
                    case 'm' => y(x)+=13
                    case 'n' => y(x)+=14
                    case 'o' => y(x)+=15
                    case 'p' => y(x)+=16
                    case 'q' => y(x)+=17
                    case 'r' => y(x)+=18
                    case 's' => y(x)+=19
                    case 't' => y(x)+=20
                    case 'u' => y(x)+=21
                    case 'v' => y(x)+=22
                    case 'w' => y(x)+=23
                    case 'x' => y(x)+=24
                    case 'y' => y(x)+=25
                    case 'z' => y(x)+=26

                    }
                    x +=1
                }

        for(x <- 0 until y.length){

            if(y(x) > max)
            { 
                max = y(x)
                        whichWord = x
            }
        }

        s.substring(whichWord-1, whichWord)
}
}

Вот тесты:

Результаты теста:

  RandomTestSpec
     high("ykvhorsqve kfkq jhjibercdptf efevxax ccr vnsmumqby jwhxvamegupfcj lierziuopbcsutm") should return "lierziuopbcsutm"
    Test Failed

    "[s]" was not equal to "[lierziuopbcsutm]"

 Stack Trace

    Completed in 34ms
     high("skwwwm") should return "skwwwm"

Test Failed

String index out of range: -1
 Stack Trace
Completed in 1ms
 high("a") should return "a"
Test Failed

String index out of range: -1
 Stack Trace
Completed in 1ms
 high("gykoialocufuc wcdwuxksqk bvapztcnqwx") should return "bvapztcnqwx"
Test Failed

"[y]" was not equal to "[bvapztcnqwx]"
 Stack Trace
Completed in 1ms
 high("gdhfoonwtih xbvsiaqhsesl obrndpz nxt inkklyo lf oyoadxqhuys lbqr oxbqq bopalqknjxvpg") should return "oyoadxqhuys"
Test Failed

"o[]" was not equal to "o[yoadxqhuys]"
 Stack Trace
Completed in 1ms
 high("bbzlmqhsypato pfufsi ryu oboklfa iigha h m") should return "bbzlmqhsypato"
Test Failed

String index out of range: -1
 Stack Trace
Completed in 1ms
 high("dbtfwvhk kadarmvldjhkx dgxffryldcxodtn hoffibiayxriqe gtqzeuywpgc nqlgvudy") should return "dgxffryldcxodtn"
Test Failed

"[b]" was not equal to "[dgxffryldcxodtn]"
 Stack Trace
Completed in 1ms
 high("vhyxdefryeznlkz fcaenzsnoxsn phdqu zjbbbybjmdn dbfhvxwnusz dqbqskfbwuomzsl ogsdioilk") should return "vhyxdefryeznlkz"
Test Failed

String index out of range: -1
 Stack Trace
 high("yqbzfuprmezbgee yxsewucg u") should return "yqbzfuprmezbgee"
Test Failed
String index out of range: -1
 Stack Trace
Completed in 1ms
 high("zifha") should return "zifha"
Test Failed

String index out of range: -1
 Stack Trace
 high("moroydyolj tcfpokvitzwzor rnzeacau") should return "tcfpokvitzwzor"
Test Failed

"[m]" was not equal to "[tcfpokvitzwzor]"
 Stack Trace
Completed in 1ms
 high("jhieih m") should return "jhieih"
Test Failed

String index out of range: -1
 Stack Trace
 high("yn ounbzw wk eldpjyikbfs nzm") should return "eldpjyikbfs"
Test Failed

"[ ]" was not equal to "[eldpjyikbfs]"
 Stack Trace
Completed in 1ms

Ответы [ 4 ]

3 голосов
/ 24 июня 2019

В Scala проще / (лучше) использовать функции, которые предусмотрены в коллекциях.

В вашем примере - здесь есть возможность:

Сначала добавить оценку, которую вы можетеиспользуйте это:

"hello".map(_.toInt).sum // 532

Возвращает сумму всех символов в виде значений Int (a = 97; ...; z = 122)

Чтобы найти максимальный вес, который вы можете использоватьfoldLeft, начиная с "".

scala> List("a", "ab","ba").foldLeft("")((a,b)=> higher(a,b))
res10: String = ab

Здесь полная функция higher:

def higher(a:String, b:String):String=
  if(a.map(_.toInt).sum >= b.map(_.toInt).sum) a else b

Есть много интересных возможностей сделать это с функциями сбора - не используйте изменяемое состояние !Это важная причина, по которой стоит перейти на Scala.

Обновление: После игры на https://www.codewars.com я обнаружил ошибку и более короткое решение:

s.split(" ").map(w => (w, w.map(_.toInt - 96).sum)).maxBy(_._2)._1
2 голосов
/ 24 июня 2019

Допустим, ваш ввод

val str = "ykvhorsqve kfkq jhjibercdptf efevxax ccr vnsmumqby jwhxvamegupfcj lierziuopbcsutm"

Вы можете вести карту со значениями для каждого символа как

val charMap = Map(
  'a' -> 1,
  'b' -> 2,
  'c' -> 3,
  'd' -> 4,
  'e' -> 5,
  'f' -> 6,
  'g' -> 7,
  'h' -> 8,
  'i' -> 9,
  'j' -> 10,
  'k' -> 11,
  'l' -> 12,
  'm' -> 13,
  'n' -> 14,
  'o' -> 15,
  'p' -> 16,
  'q' -> 17,
  'r' -> 18,
  's' -> 19,
  't' -> 20,
  'u' -> 21,
  'v' -> 22,
  'w' -> 23,
  'x' -> 24,
  'y' -> 25,
  'z' -> 26,
)

Затем вы можете добавить простую функцию, которая будет вычислять количествокаждое слово

def countOfWord(str : String): Int = str.map(charMap).sum

Затем, применяя следующую операцию к вашей входной строке str, вы получите желаемые результаты

str.split(" ").map(word => (word, countOfWord(word))).maxBy(_._2)._1

Это принесет вам желаемый результат

res0: String = lierziuopbcsutm
1 голос
/ 24 июня 2019

Как насчет этого?

object HighestWord extends App {
  val inputStr: String = "ykvhorsqve kfkq jhjibercdptf efevxax ccr vnsmumqby jwhxvamegupfcj lierziuopbcsutm"

  val answer = inputStr.split(" ").map {
    str: String =>
      val sum = str.map { chr: Char =>
        chr.toInt
      }.sum
      (str, sum)
  }.maxBy(_._2)._1

  println(answer)
}
1 голос
/ 24 июня 2019
val words = s.split(" ")
val scores = words.map(w => (w, w.map(_ - 'a' + 1).sum))
val max = scores.maxBy(_._2)._2
scores.find(_._2 == max).get._1
...