JavaScriptでパンデジタル数(Pandigital Number)を判定する方法
本記事では、数字を表す文字列を引数として受け取り、その数がパンデジタル数であるかどうかを判定するJavaScript関数を実装します。パンデジタル数であれば true を、そうでなければ false を返します。
パンデジタル数とは?
パンデジタル数とは、0から9までのすべての数字(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)が少なくとも1回ずつ含まれている数のことです。そのため、パンデジタル数は必ず10桁以上になります。
例えば、「53657687691428890」はすべての数字を含んでいるためパンデジタル数ですが、「47458892414」は一部の数字が欠けているため該当しません。
実装の考え方
判定には次のようなアプローチが有効です。
- 0〜9の各数字を要素として持つリスト(レジェンド)を用意する。
- 入力された文字列を先頭から順に走査し、該当する数字がまだリストに残っていれば削除していく。
- 最終的にリストが空になれば、すべての数字が登場したことになるため、その数はパンデジタル数である。
サンプルコード
const numStr1 = '47458892414';
const numStr2 = '53657687691428890';
const isPandigital = numStr => {
let legend = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];
for(let i = 0; i < numStr.length; i++){
if(!legend.includes(numStr[i])){
continue;
};
legend.splice(legend.indexOf(numStr[i]), 1);
};
return !legend.length;
};
console.log(isPandigital(numStr1));
console.log(isPandigital(numStr2));
コードの解説
legend配列は、未確認の数字を管理するためのリストです。初期状態では0〜9がすべて格納されています。- 文字列を1文字ずつ調べ、
legendに存在しない数字(すでに見つけた数字や数字以外の文字)であればcontinueでスキップします。 - 存在する場合は
splice()を使って配列からその数字を取り除きます。 - ループ完了後、
legend.lengthが0であれば全数字が出現したことを意味するので、否定演算子!を付けてtrueを返します。
実行結果
コンソールには以下のように出力されます。
false true
「47458892414」には0、3、6などが含まれていないため false となり、「53657687691428890」は0〜9のすべての数字を含むため true となっています。
補足:Setを使ったよりシンプルな実装
上記のコードでも問題ありませんが、Set オブジェクトを利用するとより簡潔に記述できます。
const isPandigital = numStr => {
const digits = new Set(numStr);
for(let i = 0; i <= 9; i++){
if(!digits.has(String(i))) return false;
}
return true;
};
この方法では重複を自動的に排除できるため、文字列が長い場合にも効率的に動作します。状況に応じて使い分けることで、可読性とパフォーマンスの両方を向上させることができます。
-
JavaScriptで指定範囲内の「逆さま数字(Upside Down Numbers)」を数える方法
逆さま数字(Upside Down Numbers)とは?180度回転させても元の数字と同じように見える数字のことを「逆さま数字」と呼びます。例えば、「9116」や「69」などが該当します。これは次の桁だけが回転しても有効だからです。0 → 01 → 16 → 98 → 89 → 6一方、2・3・4・5・7は回転すると別の記号や無効な形になってしまうため、これらが含まれる数字は逆さま数字にはなりません。問題2つの数値からなる範囲の配列を受け取るJavaScript関数を作成する必要があります。この関数は、指定された範囲内に存在するすべての逆さま数字の個数を返さなければなりません。コード例以下が
-
JavaScriptで指定した範囲内にある「ある数で割り切れる数」の個数を求める方法
問題2つの整数からなる範囲(配列)を第1引数に、1つの数値を第2引数として受け取るJavaScript関数を作成する必要があります。この関数は、指定された範囲内に存在する「入力された数値で割り切れる数」をすべて見つけ、その合計個数を返します。サンプルコード以下がその実装例です。const range = [6, 57]; const num = 3; const findDivisibleCount = (num = 1, [l, h]) => { let count = 0; for(let i = l; i <= h; i++