JavaScriptで顧客IDからナンバープレートを求める方法
問題
ある市Nの自動車登録システムでは、車に対して以下の2種類の番号が割り当てられます。
顧客ID(Customer ID) − 0以上17558423以下の自然数。車の購入者に対して順番に付与され、最初の購入者はID「0」、2人目はID「1」、3人目はID「2」というように続きます。
ナンバープレート(Number Plate) − 車に割り当てられる番号で、「シリーズ(a〜zのラテン小文字3文字)」と「シリアル番号(0〜9の数字3桁)」で構成されます。
例:「aaa001」。各ナンバープレートは特定の顧客IDと関連付けられています。たとえば、ナンバープレート「aaa001」は顧客ID「0」に、「aaa002」は顧客ID「1」に対応し、以降も同様に続きます。
ここでの課題は、顧客ID(customerID)を受け取り、そのIDに対応するナンバープレートを計算して文字列として返すJavaScript関数を作成することです。
サンプルコード
以下がその実装例です。
const id = 545664;
const findNumberPlate = (id = 0) => {
const letters = 'abcdefghijklmnopqrstuvwxyz';
// シリアル番号部分(1〜999)を算出
let num = String(id % 999 + 1);
// 3桁になるよう先頭に0を補填
while(num.length !== 3){
num = '0' + num;
}
// アルファベット部分のインデックスを算出
const l = Math.floor(id / 999);
return letters[l % 26] + letters[(Math.floor(l / 26)) % 26] + letters[(Math.floor(l / (26 * 26))) % 26] + num;
};
console.log(findNumberPlate(id));
出力結果
コンソールには以下のように出力されます。
ava211
コードの解説
この関数のロジックを順を追って見ていきましょう。
- シリアル番号の算出:
id % 999 + 1により、1〜999の範囲の数字部分を求めます。IDが999の倍数ごとにシリアル番号が循環する仕組みです。 - ゼロ埋め処理: 算出した数字が3桁に満たない場合、
whileループで先頭に「0」を追加し、必ず3桁の形式に整えます。 - アルファベット部分の算出:
Math.floor(id / 999)で得られた値をもとに、26進法のような考え方で3文字の英字を決定します。1文字目はl % 26、2文字目はMath.floor(l / 26) % 26、3文字目はMath.floor(l / (26 * 26)) % 26としてインデックスを求めます。 - 結果の連結: 英字3文字と数字3桁を結合し、最終的なナンバープレートの文字列として返します。
この実装により、任意の顧客IDから対応するナンバープレートを効率的に導き出すことができます。
-
JavaScriptで数値が三角数かどうかを判定する方法
三角数(Triangular Number)とは? 三角数とは、点を正三角形の形に敷き詰めたときに現れる数のことです。n番目の三角数は「1からnまでの自然数の合計」として表され、次の公式で求められます。 Tn = n(n+1) / 2 具体的な三角数は 1, 3, 6, 10, 15, 21, 28 … と続きます。例えば 10 は、各辺に4個の点を配置した正三角形を構成できるため、三角数です。 問題 数値を引数として受け取り、その数値が三角数であれば true を、そうでなければ false を返すJavaScript関数を実装します。 判定の考え方 n(n+1)/2 = num となる正
-
JavaScriptで生年月日からライフパスナンバーを求める方法
ライフパスナンバーとはライフパスナンバーとは、数秘術においてその人の人生のテーマや資質を表すとされる数字です。生年月日の各桁の数字をすべて足し合わせ、一桁になるまで計算を繰り返すことで求められます。課題ここでは、「yyyy-mm-dd」形式の日付文字列を受け取り、その生年月日に対応するライフパスナンバーを返すJavaScript関数を作成します。たとえば、日付が「1999-06-10」の場合、計算は次のようになります。year(年) : 1 + 9 + 9 + 9 = 28 → 2 + 8 = 10 → 1 + 0 = 1 month(月) : 0 + 6 = 6 day(日) : 1 + 0