-
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
-
JavaScriptで1桁の移動(シャッフル)により作れる最小の数を求める方法
この記事では、JavaScriptを使って「数値の1桁を最大1回だけ移動して作れる最小の数」を求める問題の解き方を解説します。 問題の概要 正の整数nを引数として受け取るJavaScript関数を作成します。関数内では、次の操作を最大1回だけ実行できます。 数値の中から任意の桁(インデックス)を1つ選択する 選択した桁を一度取り除き、同じ位置または別の位置に挿入し直す この操作によって得られる最小の数を求め、その値を関数の戻り値として返します。 サンプルコード 以下が実際のコードです。 const num = 354166; const smallestShuffle = (num)
-
【JavaScript】整数の中からn番目の回文数を見つける方法
問題 数値 n を引数として受け取り、0から数えて n 番目にあたる回文数(回文となる整数)を返す JavaScript 関数を作成します。 たとえば、1番目の回文数は「0」、2番目は「1」、10番目は「9」です。「10」は逆から読むと「01」となり回文ではないため、11番目の回文数は「11」となります。 回文数とは 回文数とは、桁を逆から並べ替えても元の数と同じになる整数のことです。「7」「121」「1331」などがその例です。 解決策:コード例 以下が実際のコードです。 const num = 31; const findNthPalindrome = (num = 1) => {
-
JavaScriptで数値文字列を0と1のビット列にエンコードする方法
問題 10進数を表す文字列を受け取り、決められたルールに従って「0」と「1」だけで構成される文字列へエンコードするJavaScript関数を実装します。 エンコードのルール 入力文字列の各桁の数字 d に対して、次の手順で符号語を作ります。 d を2進数で表したときのビット数を k とする 「0」を k−1 個並べ、その後ろに「1」を1つ付けた文字列をプレフィックスとする 数字 d 自身を2進数の文字列として表す(最右ビットが最下位ビット) プレフィックスと2進表現を連結したものが d の符号語になる 最後に、すべての桁について得られた符号語を順番に連結したものが、全体のエンコード結果と
-
JavaScriptで有理数を「分子が1の分数」の和に分解するアルゴリズム
問題概要今回は、JavaScriptで有理数を「分子がすべて1である分数」の和に分解する関数を作成する課題です。入力には、有理数を表す文字列(例:2/3)を使用します。このような分解はエジプト分数と呼ばれ、古代エジプトで実際に使われていた記法に由来する有名な数学的テーマです。関数が満たすべき条件は以下の通りです。返り値は、各要素が「1/分母」の形式を持つ部分配列からなる配列であること部分配列が表す分数をすべて加算すると、入力された有理数と一致すること使用する分数の個数はできるだけ少なくすること解き方:貪欲法(グリーディーアルゴリズム)この種の問題に対する標準的なアプローチは貪欲法です。手順はシ
-
JavaScriptのreduce()メソッドで配列要素の積を求める方法
問題JavaScriptで、配列 arr を引数として受け取る関数を作成します。この関数は、配列内のすべての要素を掛け合わせた積を計算し、その結果を返す必要があります。解決策:reduce()メソッドを使う配列の全要素を集約して単一の値を得たい場合、Array.prototype.reduce() メソッドが最適です。reduce() は配列の各要素に対してコールバック関数を順に実行し、結果をアキュムレータ(累積値)に蓄えていきます。積を求める場合は、初期値として「1」を指定するのがポイントです。1は乗法における単位元のため、計算結果に影響を与えず、さらに空の配列が渡された場合でも正しく 1
-
JavaScriptで10進数を階乗進数(ファクトリアルベース)に変換する方法
階乗進数(ファクトリアルベース)とは?階乗進数(factorial number system)は、各桁の重みを「数の冪」ではなく「階乗」にとるユニークな記数法です。通常のN進法では桁の重みが一定ですが、階乗進数では桁ごとに取りうる値の範囲が異なるのが最大の特徴です。最下位の桁(0番目):常に 0(基数 0!)下から2番目の桁:0 または 1(基数 1!)下から3番目の桁:0・1・2 のいずれか(基数 2!)一般化すると、下から n 番目の桁は必ず 0 ~ n の値をとり、その重みは n! になります。問題:10進数と階乗進数を相互変換する今回実装するのは、次の2つの関数です。decimalT
-
JavaScriptで配列内の数値と文字列数値を区別して合計差を計算する方法
問題今回は、整数の数値型と文字列型が混在した配列を受け取るJavaScript関数を作成します。関数の仕様は以下の通りです。文字列として表現された整数をすべて合計する数値型の整数の合計から、その文字列整数の合計を引いた値を返すコード例以下がその実装コードです。const arr = [5, 2, '4', '7', '4', 2, 7, 9]; const integerDifference = (arr = []) => { let res = 0; &n
-
【JavaScript】各単語の最後の文字を基準に単語を並べ替える方法
問題文字列を受け取り、その中に含まれる各単語を最後の文字を基準にアルファベット順へ並べ替えた結果を返すJavaScript関数を作成する必要があります。ただし、末尾の文字が同じ単語が複数存在する場合は、元の文字列に出現した順序を維持したまま並べ替えるものとします。アプローチこの問題は次の手順で解決できます。split( ) メソッドで文字列を単語ごとの配列に分割するArray.prototype.sort() のコールバック関数で、各単語の末尾文字の文字コード(charCodeAt)を比較するjoin( ) で配列を文字列に戻し、結果として返すJavaScriptの sort() は仕様上安定
-
JavaScriptで年から世紀を求める方法|slice()を使わない実装例と解説
問題年を表す数値を受け取り、その年が何世その年が何世紀に該当するのかを判定するJavaScript関数を作成することを考えます。例えば、以下のような対応関係になります。1864年 → 19世紀2021年 → 21世紀実装例:ループ処理で世紀をカウントする以下のコードでは、「100年ごとに世紀が切り替わる」という性質を利用し、forループの中で100で割り切れる回数を数えることで世紀を求めています。const year = 1956;const findCentury = (year) => { let century = 0; &n
-
JavaScriptで文字列の一部を並べ替えて別の文字列を形成できるか判定する方法
問題2つの文字列 str1 と str2 を引数に受け取るJavaScript関数を作成する必要があります。str1 に含まれる文字の一部を使い、並べ替えることで str2 と一致する文字列を形成できる場合は true を、そうでない場合は false を返すようにします。たとえば、str1 が rkqodlw、str2 が world の場合、str1 内に必要な文字がすべて揃っているため、結果は true になります。解法の考え方この問題は以下の手順で解くことができます。まず、str1 の長さが str2 よりも短い場合は、どんなに並べ替えても str2 を形成できないため、即座に fal
-
JavaScriptで文字列内の母音を1始まりのインデックスに置き換える方法
問題 今回は、文字列を受け取り、その中に出現するすべての母音(a・e・i・o・u)を、文字列内での位置(1始まりのインデックス)に置き換えるJavaScript関数を作成します。 例えば、文字列の2番目の文字が母音だった場合、その文字は「2」に置き換えられます。 実装コード 以下が実際のコード例です − const str = cancotainsomevowels; const replaceVowels = (str = ) => { const vowels = aeiou; let res = ; for(let i = 0; i < str.le
-
JavaScriptで配列からn個の最小値を元の順序のまま取得する方法
問題数値の配列 arr と整数 n を引数として受け取るJavaScript関数を作成する必要があります。この関数は、配列 arr から n 個の最小値を取り出しますが、重要なのは「元の配列における相対的な順序を崩してはいけない」という点です。つまり、結果を昇順や降順に並べ替えるのではなく、元の配列で出現した順番どおりに返す必要があります。解決策のコード例以下はその実装例です。const arr = [6, 3, 4, 1, 2];const num = 3;const smallestInOrder = (arr = [], num) => { &nb
-
JavaScriptで文字列内の特定の文字を入れ替える方法(kとlの位置をスワップ)
問題「k」「l」「m」の3種類の文字のみで構成された文字列を受け取るJavaScript関数を作成する必要があります。この関数の役割は、文字列内の「k」と「l」の位置を入れ替えることです。ただし、「m」はすべて元の位置にそのまま残す必要があります。解決コードの例以下がその実装コードです。 { let res = ; for(let i = 0; i < str.length; i++){ if (str[i] === k) { res += l; } else if (str[i] === l) {
-
【JavaScript】変換操作を繰り返した後に最小となる合計値を求めるアルゴリズム
問題 正の整数からなる配列を受け取るJavaScript関数を作成します。配列の各要素には、次の操作を必要な回数だけ繰り返し適用できます。 if (arr[i] > arr[j]) then arr[i] = arr[i] - arr[j] これは「より大きい要素から、別の小さい要素の値を引く」という操作です。これ以上どの要素にも操作を適用できなくなった状態(すべての要素が等しくなった状態)になったとき、関数はその配列の合計値を返す必要があります。 解法のアプローチ この問題の鍵となるのは、引き算を繰り返すと最終的にすべての要素が配列全体の最大公約数(GCD)と等しくなるという数学的な
-
JavaScriptで2つの数値を加算する際に必要な繰り上がり(キャリー)の回数を求める方法
問題 2つの数値を受け取るJavaScriptの関数を記述する必要があります。 この関数は、まるで紙の上で筆算を行うように、その2つの数値を加算する際に発生する繰り上がり(キャリー)の回数を数えて返すものとします。 例えば、次の図のように 179 と 284 を足し合わせる場合、繰り上がりは2回発生します。したがって、この2つの数値を渡したとき、関数は 2 を返す必要があります。 解き方のポイント この問題は、各桁を下の位から順番に見ていき、「その桁の2つの数字と、前の桁からの繰り上がりの合計が10以上になったかどうか」を判定することで解けます。 剰余演算子(%)を使えば、数値の一番下の
-
JavaScriptで合計がターゲット値になるペアの2番目の数値を削除する方法
問題数値の配列とターゲットとなる合計値を受け取り、配列内で隣接する2つの数値の合計がターゲット値と一致する場合、そのペアの2番目の数値を配列からすべて削除するJavaScript関数を作成する必要があります。コード例以下がその実装例です −const arr = [1, 2, 3, 4, 5]; const target = 3; const removeSecond = (arr = [], target = 1) => { const res = [arr[0]]; for(i = 1; i < arr.length; i++){ if(arr[
-
JavaScriptで同じ数字から作れる「次に大きい数」を見つける方法
問題 数値 n を引数として受け取るJavaScript関数を作成することを考えます。この関数は、入力された数値とまったく同じ数字の組み合わせを使いながら、入力値よりわずかに大きい数のうち最小のものを返す必要があります。 例えば、入力が 112 の場合、出力は 121 となります。これは、112 の数字(1、1、2)を並べ替えて作れる数のうち、112 より大きい最小の数だからです。 解決策のコード例 以下がその実装コードです。 const num = 112; const findNextBigger = (num = 1) => { const sortedDigits =
-
JavaScriptで文字列内の2つの単語の先頭文字を入れ替える方法
問題 今回は、スペースで区切られた2つの単語からなる文字列を引数として受け取るJavaScript関数を作成します。 この関数の目的は、それぞれの単語の先頭文字(1文字目)を互いに入れ替えた新しい文字列を構築し、それを返すことです。 たとえば「hello world」という入力に対しては、先頭の「h」と「w」を交換して「wello horld」を出力する必要があります。 コード例 以下が実際のコードです。 const str = hello world; const interchangeChars = (str = ) => { const [first, second]
-
JavaScriptで数値の先頭の桁を交換した後の差の絶対値を求める方法
問題の概要今回は、ちょうど2つの数値を含む配列を受け取るJavaScript関数を作成します。この関数の目的は、2つの数値の先頭の桁(最初の数字)同士を入れ替えた後、その数値の差の絶対値を返すことです。例として、配列 [105, 413] を考えてみましょう。105 の先頭の「1」と、413 の先頭の「4」を入れ替えます。すると、新しい数値はそれぞれ 405 と 113 になります。したがって、求める差は以下のようになります。|405 − 113| = 292解決のアプローチこの問題は、以下の手順で解決できます。各数値を文字列に変換する(String() を使用)。両方の文字列の先頭の1文字を