【问题标题】:FCC Intermediate Algorithm Scripting: Pig LatinFCC 中间算法脚本:Pig Latin
【发布时间】:2018-09-17 18:03:43
【问题描述】:

这个测试的目标是取一个英语单词的第一个辅音(或辅音组),将它移到单词的末尾并添加一个“ay”后缀。如果单词以元音开头,您只需在末尾添加“way”即可。

我的主要问题是遍历字符串,直到它到达元音并将第一个辅音字母放在字符串的末尾。

我在遍历字符串直到它到达一个元音时遇到了麻烦。你如何迭代一个字符串直到它在第一个元音处停止?您如何在到达元音之前获得所有第一个辅音字母?我使用 for 循环迭代字符串,如果第一个字母是辅音,我使用“if”语句。

function translatePigLatin(str) {
  var vowel = /[aeiou]/g;
  var cons = /[^aeiou]/g;
  console.log(cons.test(str[2]))
  var consonants = [];
  var index = str.charAt(0);

  console.log(str.slice(1, str.length))
  for(var i = 0; i < str.length; i++){
    console.log(str[i])
    if(cons.test(str[i])){
      consonants.push(str.charAt(i));
      console.log(consonants)
      var slice = str.slice(consonants.length, str.length);
    }
  }
  return consonants + 'ay';
}

translatePigLatin("手套");

【问题讨论】:

  • 您希望它仅适用于单词还是整个句子?

标签: javascript string


【解决方案1】:

我会专注于查找第一个元音的索引。然后您可以测试该索引是否为 0 或其他值。如果为零,只需在该索引上添加 way 否则切片:

function translatePigLatin(str) {
  const vowels = ['a', 'e', 'i', 'o', 'u'];
  let ind = [...str.toLowerCase()].findIndex(s => vowels.includes(s))
  return ind 
         ? str.slice(ind) + str.slice(0, ind) + 'ay' // doesn't start with vowel
         : str + 'way'
}

console.log(translatePigLatin('glove'))
console.log(translatePigLatin('apple'))
console.log(translatePigLatin('Mark'))
console.log(translatePigLatin('Javascript'))

对于像rhythm 这样没有元音的单词的边缘情况,我不确定猪拉丁语规则是什么。

【讨论】:

  • 上面的代码不适用于没有元音的单词等边缘大小写。
  • @Michael - 这是一个公平的观点。 crwth 这样的词的正确行为是什么?
【解决方案2】:

我认为您应该将问题分解为一些基本情况,就像我在下面的代码中所做的那样:

  1. 检查第一个字母是否为元音;如果为真,只需在单词末尾添加 'way' 并打破循环

  2. 如果当前字母是辅音(也就是说第一个条件不成立),我们就继续迭代

  3. 如果当前字母是元音,我们将单词分成两个单独的部分,然后反过来添加它们,不要忘记添加“ay”后缀。

在下面的代码中,我还在元音数组中添加了大写版本。通过一些修改,可以跳过分隔符。 Pig Latin 规则是我在 Wikipedia 上找到的规则(尽管我没有找到任何仅包含辅音的单词规则,所以我将它们放在第一种情况下)。 干杯!

function has(a, e) {
    return a.indexOf(e) > -1;
}

function translateWord(str) {
    let vows = ['a', 'e', 'i', 'o', 'u'];
    vows = vows.concat(vows.map(v => v.toUpperCase()));

    let lastVowelIndex = 0;
    let conv = '';
    
    for (let i = 0; i < str.length; ++i) {
        let currentChar = str[i];
        
        /* If the first character is a voewl, we just
         * add the 'way' suffix to the initial word.
         * I applied the same rule for words without
         * consonants.
         */
        if ((i === 0 && has(vows, currentChar))
            || (i === str.length - 1)) {
            conv = str + 'way';
            break;
        }
        
        /* If the current character is a consonant, we
         * just continue until we reach a vowel.
         */
        if (!has(vows, currentChar))
            continue;
        
        /* At this point, we reached a vowel, so we do the
         * appropriate transformations.
         */
        let firstPart =  str.slice(0, i);
        let secondPart = str.slice(i);
        
        conv = secondPart + firstPart + 'ay';
        break;
    }
    
    return conv;
}

function translateToPigLatin(str) {
    let words = str.split(' ');
    let converted = words.map(w => translateWord(w));
    
    return converted.join(' ');
}

let s = translateToPigLatin("I have no rythm");
console.log(s);

【讨论】:

    【解决方案3】:

    为什么不使用正则表达式?

    function translatePigLatin(str) {
    let res = '';
    
    let regex = /[aeiou]/;
    
    if (!regex.test(str)) {
      res = str + 'ay';
    } else if (regex.test(str[0])) {
      res = str + 'way';
    } else {
      let x  = str.indexOf(regex.exec(str)[0]);
      res = str.substr(x) + str.substr(0, x) + 'ay'
    }
    return res;
    

    }

    【讨论】:

      猜你喜欢
      • 2014-01-05
      • 2015-11-10
      • 1970-01-01
      • 1970-01-01
      • 2015-01-04
      • 1970-01-01
      • 2018-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多