JavaScriptで文字列の各文字をASCIIコードに変換して数値を作り、7を1に置き換えた差を求める方法
問題
文字列を受け取るJavaScript関数を作成することを考えます。この関数は、文字列の各文字を対応するASCII文字コードに変換し、それらをすべて連結して1つの大きな数値を作成します。次に、その数値に含まれる「7」をすべて「1」に置き換えて別の数値を作り、最後に元の数値との差を返す必要があります。
解法のポイント
実は、巨大な数値を2つ作って実際に引き算を行う必要はありません。「7」を「1」に置き換えると、該当する桁ごとに必ず 7 − 1 = 6 だけ数値が減少するという性質があるためです。つまり、求める差は「7の出現回数 × 6」として簡単に計算できます。
コード例
以下が実装コードです。
const str = 'AVEHDKDDS';
const ASCIIDifference = (str = '') => {
return str
.split('') // 文字列を1文字ずつ分割
.map(c => c.charCodeAt(0)) // 各文字をASCIIコードに変換
.join('') // コードを連結して1つの数値文字列に
.split('') // 再び1桁ずつに分割
.map(Number) // 各桁を数値に変換
.filter(n => n === 7) // 「7」だけを抽出
.length * 6; // 差 = 7の個数 × 6
};
console.log(ASCIIDifference(str));
出力結果
12
処理の流れを詳しく見る
文字列 'AVEHDKDDS' の各文字をASCIIコードに変換すると、次のようになります。
- A → 65
- V → 86
- E → 69
- H → 72
- D → 68
- K → 75
- D → 68
- D → 68
- S → 83
これらを連結すると「658669726875686883」という18桁の数値になります。この中には「7」が2つ含まれています。
「7」を「1」に置き換えると、該当する桁ごとに6ずつ減少するため、差の合計は 2 × 6 = 12 となります。これが出力結果の「12」の正体です。
まとめ
この問題は一見、巨大な数値同士の減算が必要に思えますが、「7→1の置き換えによる差は常に6」という数学的な性質を利用すれば、単純なカウント処理だけで答えを導き出せます。split()、map()、filter() を組み合わせた宣言的な書き方により、簡潔で読みやすいコードになっている点もポイントです。
-
JavaScriptで文字列を大文字・小文字に変換する方法を徹底解説
JavaScriptでは、Stringオブジェクトのプロトタイプに用意されているtoUpperCase()メソッドとtoLowerCase()メソッドを使うことで、バニラJavaScript(ライブラリやフレームワークに依存しない素のJavaScript)だけで、文字列を大文字や小文字に簡単に変換できます。 toUpperCase():文字列を大文字に変換する toUpperCase()メソッドは、文字列内のすべての英字を大文字に変換した新しい文字列を返します。元の文字列は変更されない(イミュータブルである)点に注意してください。 コード例 let str = Hello World; let
-
JavaScriptでオブジェクトを作成し、プロパティにアクセスする方法を徹底解説
JavaScriptでは、オブジェクトリテラル(波括弧 {})を使うことで、キーと値のペアを持つオブジェクトを簡単に作成できます。作成したオブジェクトのプロパティには、ドット記法(obj.propertyName)やブラケット記法(obj[propertyName])でアクセスします。 以下は、JavaScriptでオブジェクトを作成し、そのプロパティやメソッドにアクセスする具体的なコード例です。 コード例 <!DOCTYPE html> <html lang=ja> <head> <meta charset=UTF-8 /> <meta