JavaScriptで文字列の母音と子音をシフトする関数を実装する方法
問題
英語のアルファベットで構成された文字列を受け取り、新しい文字列を生成するJavaScript関数を作成する必要があります。具体的なルールは次のとおりです。
- すべての子音は、アルファベット上で9文字分先へ進めます。「z」を超えた場合は「a」に戻って続けます(ラップアラウンド処理)。
- すべての母音は5文字分移動させます。本記事のコードでは「(現在のインデックス + 21) % 26」で計算しており、これはアルファベット上で5文字分後ろへ戻ることと同じ結果になります。
コード例
以下がその実装例です。
const str = 'sample string'; // 対象となる文字列
const moveWords = (str = '') => {
// 大文字・小文字の揺れを防ぐため小文字に統一
str = str.toLowerCase();
const legend = 'abcdefghijklmnopqrstuvwxyz'; // 基準となるアルファベット表
const isVowel = char => 'aeiou'.includes(char); // 母音の判定
const isAlpha = char => legend.includes(char); // 英字の判定
let res = ''; // 結果を格納する変数
for(let i = 0; i < str.length; i++){
const el = str[i];
// 英字以外(空白や記号など)は変換せずそのまま追加
if(!isAlpha(el)){
res += el;
continue;
};
let pos;
const ind = legend.indexOf(el);
if(isVowel(el)){
// 母音:+21(=5文字分後ろへシフト)
pos = (21 + ind) % 26;
}else{
// 子音:+9(9文字分先へシフト)
pos = (ind + 9) % 26;
};
res += legend[pos];
};
return res;
};
console.log(moveWords(str));
出力
コンソールには次のように表示されます。
bvvyuz bcadwp
コードのポイント解説
toLowerCase()で入力文字列をすべて小文字に統一することで、大文字・小文字の違いを意識せずに処理できます。- 変数
legendにはアルファベット順の26文字を格納し、各文字の位置計算の基準として利用しています。 isVowel()とisAlpha()の2つのヘルパー関数により、「その文字が母音か」「英字かどうか」を簡潔に判定できます。- 空白などの英字以外の文字は、変換を行わずに元のまま結果へ連結されます。
- シフト量の計算には
% 26(26での剰余演算)を使っています。これにより「z」を超えた文字列が自動的に「a」へ折り返されるため、if文による複雑な境界チェックが不要になります。
-
JavaScriptでファイルを読み書きする方法|Node.jsのfsモジュール徹底解説
結論から言うと、クライアントサイド(ブラウザ上)のJavaScriptでは、セキュリティ上の制約によりファイルの読み書きはできません。ファイル操作が可能なのはサーバーサイドであり、Node.jsのfsモジュールを使用することで実現できます。fsモジュールは、ファイルシステムに対して同期的・非同期的な読み書きを行うための豊富なAPIを提供しており、Node.jsにおけるファイル操作の標準的な手段です。fsモジュールの主な特徴非同期処理:コールバックやPromiseを使い、他の処理をブロックせずにファイル操作が可能同期処理:処理完了まで待機するfs.readFileSync()などのメソッドも提供
-
JavaScriptのconst宣言とは?再代入できない変数の基本と使い方を解説
JavaScriptのconst宣言は、値を再代入することも後から再宣言することもできない変数を作成するための構文です。constはES2015(ES6)で導入されました。 const宣言の主な特徴 一度値を代入すると、別の値に再代入することはできません。 同じ名前の変数を同じスコープ内で再宣言するとエラーになります。 宣言時に必ず初期値を代入する必要があります。 ブロックスコープ({}内でのみ有効)を持ちます。 それでは、JavaScriptにおけるconst宣言の実際のコードを見ていきましょう。 サンプルコード <!DOCTYPE html> <html>