JavaScriptでアルファベットを前後反転する方法(a⇔zの対応文字を取得する関数)
はじめに
JavaScriptで、1文字のアルファベットだけを引数として受け取る関数を実装します。この関数は、渡された文字が「先頭(a)から数えて何番目」にあるのかを計算し、同じ位置を末尾(z)側から数えた文字を返します。
具体的には、「a」→「z」、「b」→「y」、「c」→「x」のように、アルファベットを前後で鏡合わせにした対応関係(古典暗号のアトバシュ暗号と同じ考え方)を作る処理です。
実装例
まずは、アルファベットを前半13文字と後半13文字に分割して対応付けるシンプルなアプローチを見てみましょう。
const alpha = 'g';
const findCounterPart = (alpha = '') => {
const alphabet = 'abcdefghijklmnopqrstuvwxyz';
const firstPart = alphabet.substring(0, 13);
// 後半13文字は逆順にしておく
const secondPart = alphabet.substring(13).split('').reverse();
let solution = '';
if (firstPart.indexOf(alpha) !== -1) {
// 前半に存在する場合 → 逆順にした後半の同じ位置の文字を返す
solution = secondPart[firstPart.indexOf(alpha)];
} else {
// 後半に存在する場合 → 前半の同じ位置の文字を返す
solution = firstPart[secondPart.indexOf(alpha)];
}
return solution;
};
console.log(findCounterPart(alpha));
コードのポイント
alphabet.substring(0, 13): 前半の13文字「a〜m」を取り出します。alphabet.substring(13): 後半の13文字「n〜z」を取り出します。.split('').reverse(): 後半を1文字ずつの配列に変換してから逆順に並べ替えます(「z, y, x, …」の順)。これにより、前半と後半のインデックスがそのまま対応します。indexOf(): 引数の文字が前半・後半のどちらに含まれるかを判定し、対応する位置の文字を取得します。
出力結果
コンソールには次のように出力されます。
t
「g」は先頭から7番目の文字なので、末尾から7番目の「t」が返されます(g ⇔ t)。
別解:charCodeAt() を使ったシンプルな方法
文字コードを利用すれば、配列の作成や indexOf による探索なしに、より簡潔に実装できます。
const findCounterPartSimple = (alpha = '') => {
const lower = alpha.toLowerCase();
const start = 'a'.charCodeAt(0); // 97
const end = 'z'.charCodeAt(0); // 122
// 1文字の英小文字以外は空文字を返すガード
if (lower.length !== 1 || lower < 'a' || lower > 'z') {
return '';
}
return String.fromCharCode(end - (lower.charCodeAt(0) - start));
};
console.log(findCounterPartSimple('g')); // t
「先頭からの距離」を「末尾からの距離」に置き換えて計算しているため、ループも配列も不要です。大文字・小文字の扱いや入力チェックを加えることで、実用的なユーティリティ関数になります。
まとめ
- アルファベットを前半13文字と後半13文字(逆順)に分け、同じインデックス同士を対応させると、前後反転の変換が実現できる。
String.prototype.charCodeAt()とString.fromCharCode()を使えば、文字コードの計算だけで同じ結果を得られる。- この対応関係は古典暗号「アトバシュ暗号」と同じ仕組みであり、文字変換処理の練習題材として最適です。
-
JavaScriptで10進数のビットを反転して新しい10進数を求める方法
はじめに本記事では、JavaScriptを使って「10進数を2進数に変換し、すべてのビットを反転させ、その結果を再び10進数として返す」関数の実装方法を解説します。問題の定義私たちが作成すべきのは、以下の処理を行うJavaScript関数です。引数として10進数を受け取るその数値を2進数(文字列)に変換する各ビットを反転する(1なら0へ、0なら1へ)反転後の2進数を10進数に戻して返す実装コード以下が実際のコード例です。 { // 数値を2進数の文字列に変換 const binary = num.toString(2); let newBinary = ; // 各ビットを走
-
JavaScriptで空白と単語の順序を保持しながら各単語を反転する方法
はじめに本記事では、文字列を引数として受け取り、その中の各単語の文字順を反転させながら、空白の位置と元の単語の順序はそのまま保持するJavaScript関数の作成方法を解説します。課題の概要作成する関数は、文章を表す文字列 str を第1引数(唯一の引数)として受け取ります。この関数は、文中の各単語に含まれる文字の並びを逆順にします。ただし、空白の位置や単語が出現する順序自体は変えずに維持する必要があります。入出力例たとえば、次の文字列を入力した場合を考えてみましょう。const str = this is some sample string;この場合、期待される出力は以下の通りです。con