JavaScriptで文字列内のアルファベットを10文字分シフトする方法
問題
英語のアルファベットで構成された文字列を引数として受け取り、すべてのアルファベットを10文字分だけ前に進めるJavaScript関数を作成する必要があります。ただし、進めた結果が「z」を超えた場合は、「a」に戻って再度カウントを続けます。
これはいわゆる「シーザー暗号」の一種であり、文字コード(ASCIIコード)と剰余演算(% 演算子)を組み合わせることで、簡潔かつ効率的に実装できます。
コード例
以下がその実装コードです。
const str = 'sample string';
const moveStrBy = (num = 10) => {
return str => {
// 文字1つを指定した基準コードから num 文字分シフトする関数
const calcStr = (ch, code) => String
.fromCharCode(code + (ch.charCodeAt(0) - code + num) % 26);
const ACode = 'A'.charCodeAt(0); // 大文字'A'の文字コード
const aCode = 'a'.charCodeAt(0); // 小文字'a'の文字コード
// アルファベットのみを対象に置換処理を行う
return str.replace(/[a-z]/gi, ch => (
ch.toLowerCase() == ch
? calcStr(ch, aCode)
: calcStr(ch, ACode)
));
};
};
const moveByTen = moveStrBy();
console.log(moveByTen(str));コードの解説
このコードのポイントは以下の通りです。
- calcStr関数: 各文字の文字コードから基準となるコード(大文字なら「A」、小文字なら「a」)との差分を計算し、そこにシフト量を加えた上で26で割った余りを求めます。これにより、「z」を超えた場合でも自動的に「a」へと折り返されます。
- 正規表現 /[a-z]/gi: アルファベット以外の文字(スペースや記号など)はそのまま残し、英字だけを変換対象とします。「g」フラグで全ての該当文字を、「i」フラグで大文字・小文字の両方をマッチさせています。
- 大文字・小文字の判定:
ch.toLowerCase() == chの比較によって、元の文字が小文字かどうかを判別し、それぞれ対応する基準コードを使ってシフトすることで、大文字・小文字の区別を保持しています。
出力結果
ckwzvo cdbsxq
ご覧のとおり、「sample string」の各文字が10文字分シフトされ、「ckwzvo cdbsxq」という文字列が出力されました。たとえば「s」は10文字進んで「c」、「a」は「k」になっています。スペースなどの非アルファベット文字は元の位置にそのまま保持されている点にも注目してください。
-
JavaScriptで文字列の母音と子音をシフトする関数を実装する方法
問題 英語のアルファベットで構成された文字列を受け取り、新しい文字列を生成するJavaScript関数を作成する必要があります。具体的なルールは次のとおりです。 すべての子音は、アルファベット上で9文字分先へ進めます。「z」を超えた場合は「a」に戻って続けます(ラップアラウンド処理)。 すべての母音は5文字分移動させます。本記事のコードでは「(現在のインデックス + 21) % 26」で計算しており、これはアルファベット上で5文字分後ろへ戻ることと同じ結果になります。 コード例 以下がその実装例です。 legend.includes(char); // 英字の判定 let re
-
JavaScriptで数値配列の移動平均をリアルタイムに計算する方法
問題 数値の配列を受け取り、各位置における「それまでの要素の累積平均(移動平均)」を格納した新しい配列を構築するJavaScript関数を作成する必要があります。たとえば、次のようになります。 [1, 2, 3, 4, 5] → [1, 1.5, 2, 2.5, 3] 最初の要素は最初の要素単体の平均、2番目の要素は先頭2つの要素の平均、3番目は先頭3つの要素の平均、というように順番に計算していきます。 コード例 以下が実際の実装コードです。 const arr = [1, 2, 3, 4, 5]; const movingAverage = (arr = []) => {