将元音资本化

时间:2017-03-25 15:41:07

标签: javascript arrays

我一直在做一个挑战,我必须在Javascript中创建一个函数,它会将字母位置改为1,元音必须大写,例如" f"去""," z"到" A"和" m"去了" O"。我做了很多这些步骤,但我正在努力利用元音。这是我的代码:



# 1. Open the two input file in readmode, the result file in write-mode
with open(file1) as f1, open(file2) as f2, open(file3, 'w') as f3:
     # 2. Get each line of the two first line in a single op
     for line_f1, line_f2 in zip(f1, f2):
         # 3. Write the result in the third file
         f3.write(int(line_f1) + int(line_f2))




5 个答案:

答案 0 :(得分:3)

你并不孤单。许多人在面对这样的问题时,首先要编写涉及字符代码,if语句等的复杂逻辑。通常有一种更简单的方法:写下“源”和“目标”字母并编写两行代码来转换输入它们之间。如果结果不符合您的预期,只需编辑目标字母。

src = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
dst = 'bcdEfghIjklmnOpqrstUvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZA'

str = 'whatever!'
out = ''

for (c of str)
  out += dst[src.indexOf(c)] || c
  
console.log(out)
  

答案 1 :(得分:1)

您可以运行string.replace并检查元音如下;

function LetterChanges(str) {
  var newString = "";

  for (var i = 0; i < str.length; i++) {
    if (str.charCodeAt(i) >= 97 && str.charCodeAt(i) <= 121) {
      newString += String.fromCharCode(str.charCodeAt(i) + 1);
    }
    // z to a
    else if (str.charCodeAt(i) === 122) {
      newString += String.fromCharCode(str.charCodeAt(i) - 57);
    } //spaces
    else if (str.charCodeAt(i) === 32) {
      newString += String.fromCharCode(32);
    } else {
      newString += String.fromCharCode(str.charCodeAt(i));
    }
  }


  return newString.replace(/[aeiou]/gi, function(a){return a.charAt().toUpperCase()});
}

console.log(LetterChanges("fanzd times!"));

答案 2 :(得分:1)

字符范围/代码与字典映射

处理字符范围非常混乱,97 <= str.charCodeAt(i) <= 121在没有查找ascii字符代码引用的情况下几乎没有意义。一个更清晰的解决方案是构建一个字典,将字母映射到您想要的结果,例如{a: 'b', b: 'c', c: 'd', d: 'E', ...},它可以非常有效和干净地构建 - 这更容易调试,并且是一个更易读/可理解的解决方案。 / p>

提议的解决方案

作为我对另一个问题(Replace letters in string with a dictionary array set in Javascript)的一个答案的修改版本,如果您使用Node.js,一个JS预编译器或者不要使用,那么您可以做类似的事情。 ;关心旧浏览器,可以使用ES6:

class LetterChanges {
    constructor() {
        const alphabet = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'];

        this.encryptionKey = {};

        // build encryptionKey = {a: 'b', b: 'c', c: 'd', d: 'E', ...}
        for (let i=0; i<alphabet.length; i+=1) {
            const j = (i + 1) % alphabet.length;

            this.encryptionKey[alphabet[i]] = alphabet[j].replace(/[aeiou]/, match => match.toUpperCase());
        }
    }

    /**
     * Encrypt some plaintext
     * @param plaintext
     */
    encrypt(plaintext) {
        return plaintext.split('').map(letter => this.encryptionKey[letter] || letter).join('');
    }
}

const cipher = new LetterChanges();
const plaintext = 'fanzd times!';
const encoded = cipher.encrypt(plaintext);

console.log(plaintext, encoded);  // "fanzd times!", "gbOAE Ujnft!"

答案 3 :(得分:0)

据我所知,没有一种聪明的算法方法可以看出一个字母是否是一个元音。因此,对于检查,您将需要使用普通的旧indexOf ['a', 'e', 'i', 'o', 'u'].indexOf(c) !== -1

我会把它放在循环中的其他变换之后,作为位置i的newString的一个单独条件,如果它是元音则执行变换。

答案 4 :(得分:0)

特殊情况&#34; z&#34;转到&#34; A&#34;,您已经通过从小写移动到大写来正确对待它。您可以通过专门搜索前面字符的ASCII值并将它们更改为大写元音的正确ASCII代码,以相同的方式处理其他元音。当然,你需要在一般情况之前做出这种区分&#34; a - z&#34;为了使代码有效; - )

底线:if-else级联不需要互斥条件 - 第一场比赛获胜,而其他队员因为&#34;其他&#34;而跳过。

此外,你的案例是&#34; 32&#34;并且&#34;所有其余的&#34;是相同的,所以你可以将它们结合起来。如果您不更改字符,则可以使用str[i] - 无需转换。