Проблема с алгоритмом рифмования Scala - PullRequest
0 голосов
/ 17 февраля 2020

Я хочу создать метод, который принимает два списка строк, представляющих звуки (фонемы и гласные) двух слов в качестве параметров. Функция этого метода состоит в том, чтобы определить, являются ли слова рифмованными на основе двух звуков.

Определение рифмы: слова рифмуются, если последний гласный (включительно) и после совпадают. Слова будут рифмоваться, даже если последние гласные звуки имеют разное ударение. Только уровни гласности будут иметь уровни напряжения (числа)

Пока что мой подход состоит в том, чтобы перевернуть список так, чтобы звуки были в обратном порядке, а затем добавить все от начала строки до Первый гласный (включительно). Затем сравните два списка, чтобы увидеть, равны ли они. Пожалуйста, используйте базовый код c, я только на начальном уровне scala. Только что закончил выполнение программы обучения.

Пример 1: два слова GEE и NEE рифмуются, потому что звук GEE («JH», «IY1») становится («IY1», «JH») и звук NEE («N») , «IY1) становится (« IY1 »,« N »), так как они имеют одинаковую гласную, все остальное после не должно рассматриваться больше.

Пример 2: два слова GEE и JEEP не будут рифмоваться, поскольку звук GEE («JH», «IY1») становится («IY1», «JH») и звук JEEP («JH», «IY1», «P») становится («P», «IY1», «JH»), поскольку первый звук в GEE - это гласный звук, который сравнивается с «P» и «IY1» в JEEP.

Пример 3: два слова HALF и GRAPH будут рифмоваться, потому что HALF звук («HH», «AE1», «F») становится («F», «AE1», «HH») и звук GRAPH («G», «R», «AE2» ”,” F ”) становятся (“ F ”,“ AE2 ”,“ R ”,“ G ”) в этом случае, хотя первый гласный имеет различное ударение (числа), мы игнорируем это напряжение, поскольку гласные одинаковы.


def isRhymeSounds(soundList1: List[String], soundList2: List[String]): Boolean={
    val revSound1 = soundList1.reverse
    val revSound2 = soundList2.reverse
    var revSoundList1:List[String] = List()
    var revSoundList2:List[String] = List()
    for(sound1 <- revSound1) {
      if(sound1.length >= 3) {
        val editVowel1 = sound1.substring(0,2)
        revSoundList1 = revSoundList1 :+ editVowel1
      }
      else {
        revSoundList1 = revSoundList1 :+ sound1
      }
    }
    for(sound2 <- revSound2) {
      if(sound2.length >= 3) {
        val editVowel2 = sound2.substring(0, 2)
        revSoundList2 = revSoundList2 :+ editVowel2
      }
      else {
        revSoundList2 = revSoundList2 :+ sound2
      }
    }
    if(revSoundList1 == revSoundList2){
      true
    }
    else{
      false
    }
  }

1 Ответ

1 голос
/ 17 февраля 2020

Я не думаю, что обращение вспять необходимо.

def isRhyme(sndA :List[String], sndB :List[String]) :Boolean = {
  val vowel = "[AEIOUY]+".r
  sndA.foldLeft(""){case (res, s) => vowel.findPrefixOf(s).getOrElse(res+s)} ==
    sndB.foldLeft(""){case (res, s) => vowel.findPrefixOf(s).getOrElse(res+s)}
}

объяснение

  • "[AEIOUY]+".r - Это регулярное выражение (это часть .r ) это означает «a String одного или нескольких из этих символов». Другими словами, любая комбинация гласных заглавных букв.
  • findPrefixOf() - возвращает первую часть тестовой строки, которая соответствует регулярному выражению. Так что vowel.findPrefixOf("AY2") возвращает Some("AY"), потому что первые две буквы соответствуют регулярному выражению. И vowel.findPrefixOf("OFF") возвращает Some("O"), потому что только первая буква соответствует регулярному выражению. Но vowel.findPrefixOf("BAY") возвращает None, потому что строка не начинается ни с одного из указанных символов.
  • getOrElse() - Это разворачивает Option. Так что Some("AY").getOrElse("X") возвращает "AY", а Some("O").getOrElse("X") возвращает "O", но None.getOrElse("X") возвращает "X", потому что внутри значения None ничего нет, поэтому мы go возвращаемое по умолчанию значение OrElse.
  • foldLeft()() - Это берет набор элементов и, начиная с «левого», он «складывает» их друг на друга, пока не будет получен окончательный результат.

Итак, рассмотрим как будет обрабатываться List("HH", "AE1", "F", "JH", "IY1", "P").

res    s     result
===    ===   ======
""     HH    ""+HH   //s doesn't match the RE so default res+s
HH     AE1   AE      //s does match the RE, use only the matching part
AE     F     AE+F    //res+s
AEF    JH    AEF+JH  //res+s
AEFJH  IY1   IY      //only the matching part
IY     P     IY+P    //res+s

final result: "IYP"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...