Найдите самое короткое слово в цепочке слов - PullRequest
2 голосов
/ 21 июня 2019

Я снова участвую в Code-Wars Challenges, и у меня есть вопрос по этому поводу:

Задание: "Учитывая строку слов, вернуть длину самого короткого слова (ей).

Строка никогда не будет пустой, и вам не нужно учитывать разные типы данных. "

Я просмотрел ответы, доступные на SO, и мне удалось самостоятельно создать программу на основе иностранных идей.

Проблема в том, что он по-прежнему не выдает желаемый результат.

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

Итак, я прилагаю код и тесты.

Надеюсь, любой из вас сможет найти ответ на вопрос.

Приветствия

object Shortest{
  def findShort(str:String):Int ={

    var smallestLength = 99
    var currentLength = 0

    for(word <- str.split("")) {
      currentLength = 0

      for(letter <- word){
        currentLength +=1
      }

      if(currentLength < smallestLength)
        smallestLength = currentLength         
    }
    smallestLength            
  } 
}

Вот тесты:

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

ShortestTest findShort (биткойн захватывает весь мир, может кто знает, может быть) должен вернуть 3

Тест не пройден 1 не было равно 3 Трассировки стека Завершено за 45 мс findShort (оказывается, что случайные тесты проще, чем выписывать базовые) должны возвращать 3 Тест не пройден

1 не было равно 3 Трассировки стека Завершено в 1 мс findShort (давайте поговорим о javascript лучшем языке) должен вернуть 3 Тест не пройден 1 не было равно 3 Трассировки стека Завершено в 1 мс findShort (я хочу путешествовать по миру, пишущий код один день) должен вернуть 1 findShort (позволяет всем идти в отпуск где-то очень холодно) должен вернуться 2 Тест не пройден

1 не было равно 2 Трассировки стека Завершено в 1 мс findShort (Steem Dogecoin 21inc Dash MadeSafeCoin) должен вернуть 4 Тест не пройден

1 не было равно 4 Трассировки стека Завершено в 1 мс findShort (Bitcoin Lisk) должен вернуть 4 Тест не пройден 1 не было равно 4 Трассировки стека Завершено в 1 мс findShort (ProofOfStake Ripple) должен вернуть 6 Тест не пройден

1 не было равно 6 Трассировки стека findShort (ProofOfWork Dogecoin BTC Classic Dash Ripple ProofOfWork) должен вернуться 3 Тест не пройден

1 не было равно 3 Трассировки стека Завершено в 1 мс findShort (LiteCoin Bitcoin LiteCoin Волны Биткойн Волны Биткойн Волна Волна Волна Биткойн Волшебство) Тест не пройден

1 не было равно 4 Трассировки стека Завершено за 2 мс findShort (биткойн-волны MadeSafeCoin DarkCoin ProofOfStake Classic BTC) должен вернуться 3 Тест не пройден

1 не было равно 3 Трассировки стека Завершено в 1 мс findShort (ProofOfStake Waves Ethereum Ethereum Ripple LiteCoin Steem Classic LiteCoin Ripple ProofOfStake Steem Monero Dogecoin Factom) должен вернуться 5 Тест не пройден

1 Ответ

4 голосов
/ 21 июня 2019

На самом деле ваше решение в порядке, все, что вам нужно изменить, это str.split("") на str.split(" ") (обратите внимание на пробел).

Вот способ сделать это, опираясь на встроенный метод:

def findShort(wordsString: String): Int = {
  val wordsArray = wordsString.split(" ")
  wordsArray.minBy(_.length).length
}

println(findShort("LiteCoin Bitcoin LiteCoin Bitcoin Waves Waves Bitcoin Dash Ripple Ripple Ethereum Classic Factom LiteCoin Factom Waves Factom"))
// Display 4
println(findShort("Bitcoin Waves MadeSafeCoin DarkCoin ProofOfStake Classic BTC"))
// Display 3

А вот версия, в которой используется foldLeft, если вы не хотите полагаться на встроенный метод:

def length(word: String): Int =
  word.foldLeft(0){case (acc, _) => acc + 1}

def findShort(str:String):Int = {

   str.split(" ").foldLeft(99){ case (smallestLength, word) =>
      val currentLength = length(word)
      if(currentLength < smallestLength)
         currentLength
       else smallestLength
   }
}
...