JavaScriptでうるう年・平年のn日目にあたる日付を求める方法
年の日数(何日目か)と、その年がうるう年かどうかを表す真偽値を渡すと、該当する日付を返すJavaScript関数の実装方法を解説します。うるう年かどうかで2月の日数が変わるため、この違いを正しく処理することがポイントになります。
問題の概要
次の要件を満たすJavaScript関数を作成します。
- 第1引数: 数値(年の何日目かを表す)
- 第2引数: 真偽値(うるう年の場合は
true)
この情報をもとに、その年のn日目にあたる日付(月と日)を返します。うるう年の場合は2月が29日になるため、平年とは計算結果が異なる点に注意が必要です。
実装コード
以下が実際のコード例です。
const day = 60;
const isLeap = true;
const findDate = (day = 1, isLeap = false) => {
// うるう年の最大日数366を超える場合は無効
if (day > 366) {
return undefined;
}
const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
const days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
// うるう年なら2月を29日に変更
if (isLeap) {
days[1]++;
}
let i = -1, count = 0;
while (count < day) {
i++;
count += days[i];
}
const upto = days.slice(0, i).reduce((acc, val) => acc + val);
const month = months[i];
const d = count - upto;
return `${month}, ${d}`;
};
console.log(findDate(day, isLeap));
コードの解説
この関数の処理の流れは以下のとおりです。
- 入力チェック: うるう年の最大日数である366日を超える値が渡された場合は
undefinedを返して処理を終了します。 - 月ごとの日数を定義: 各月の日数を配列で保持します。うるう年の場合は2月(インデックス1)の値を1増やして29日にします。
- 該当月の特定: 日数を順に加算しながらループし、指定された日数がどの月に含まれるかを特定します。
- 日付の計算: 該当月より前の月の日数の合計を差し引くことで、その月の何日かに対応する値を求めます。
実行結果
上記のコードをコンソールで実行すると、次の出力が得られます。
Feb, 29
うるう年の60日目は、1月(31日)を過ぎて2月の29日目にあたるため、Feb, 29 が返されます。平年の場合は2月が28日までしかないため、同じ60日目は Mar, 1 となります。
補足: Dateオブジェクトを使った別のアプローチ
標準の Date オブジェクトを利用すれば、よりシンプルに実現することもできます。
const findDateWithDate = (day, isLeap) => {
const year = isLeap ? 2020 : 2021; // うるう年かどうかで年を切り替え
const date = new Date(year, 0, day);
return date.toLocaleDateString('en-US', { month: 'short', day: 'numeric' });
};
console.log(findDateWithDate(60, true)); // Feb 29
Date コンストラクタは日数のオーバーフローを自動的に処理してくれるため、月ごとの日数を自分で管理する必要がなく、コードが簡潔になります。用途に応じて使い分けるとよいでしょう。
-
【JavaScript】パドヴァン数列のn番目の要素を求める方法
パドヴァン数列とはパドヴァン数列(Padovan Sequence)とは、次の初期値で定義される整数列 P(n) のことです。P(0) = P(1) = P(2) = 1そして、以下の漸化式に従って各項が決まります。P(n) = P(n-2) + P(n-3)この漸化式から導かれる最初のいくつかの値は次のとおりです。1, 1, 1, 2, 2, 3, 4, 5, 7, 9, 12, 16, 21, 28, 37, 49, 65, 86, 114, 151, 200, 265, …フィボナッチ数列が直前の2項の和で定義されるのに対し、パドヴァン数列は「2つ前」と「3つ前」の項を足す点が特徴的です
-
JavaScriptで配列要素をそのインデックスでべき乗した値に変換する方法
問題 数値の配列を受け取るJavaScript関数を作成する必要があります。この関数は、入力配列の各要素を、その要素の位置を示す0始まりのインデックスでべき乗し、新しい配列へと変換します。そして最終的に、この新しい配列を返します。 例えば、インデックス0にある要素は0乗(常に1)、インデックス3にある要素は3乗、というように各要素が処理されます。 実装のポイント ループで配列を走査しながら、各要素とそのインデックスを同時に取得する Math.pow() を使って「要素 ^ インデックス」を計算する 計算結果を結果配列の同じ位置に格納する なお、モダンなJavaScriptでは Math