我一直在做一个挑战,我必须在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))

答案 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]
- 无需转换。