JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

JavaScriptで配列内の紛らわしい数(Confusing Number)を見つける方法

紛らわしい数(Confusing Numbers)とは?

配列内のある数値が「紛らわしい数」とみなされるのは、その数値を上下左右に180度回転した結果が、同じ配列内に存在する別の数値になる場合です。たとえば、6を180度回転すると9になり、逆に9を回転すると6になります。

ただし注意が必要なのは、180度回転しても有効な数字として成立するのは 0、1、6、8、9 の5種類だけという点です。2、3、4、5、7 を含む数値は、回転しても正しい数として扱うことができません。

今回求められているのは、自然数 num を第1引数(唯一の引数)として受け取るJavaScript関数を作成することです。この関数はまず、num 以下のすべての自然数(num 自身を含む)からなる配列を構築します。

たとえば num = 5 の場合、生成される配列は次のようになります。

[1, 2, 3, 4, 5]

続いて、この配列の中に紛らわしい数がいくつ含まれているかを数え、最終的にその個数を返します。

具体例

入力が次の場合を考えてみましょう。

const num = 10;

このときの出力は次の通りです。

const output = 5;

その理由はこうです。まず配列は [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] となり、この中で紛らわしい数に該当するのは次の5つだからです。

1, 6, 8, 9, 10
  • 1 … 回転しても 1 のまま
  • 6 … 回転すると 9 になる
  • 8 … 回転しても 8 のまま
  • 9 … 回転すると 6 になる
  • 10 … 回転すると 01(= 1)になる

サンプルコード

実際の実装コードは以下の通りです。

const num = 10;
const countConfusing = (num = 1) => {
   let count = 0;
   const valid = '01689';
   const rotateMap = {'0': '0', '1': '1', '6': '9', '8': '8', '9': '6'};
   const prepareRotation = num => {
      let res = '';
      const numArr = String(num).split('');
      if(numArr.some(el => !valid.includes(el))){
         return false;
      };
      numArr.map(el => {
         res = rotateMap[el] + res;
      });
      return +res;
   };
   for(let i = 1; i <= num; i++){
      const rotated = prepareRotation(i);
      if(rotated && rotated > 0 && rotated <= num){
         count++;
      };
   };
   return count;
};
console.log(countConfusing(num));

処理のポイント

このコードの仕組みを整理すると、次の3ステップになります。

  1. 無効な数字の除外:回転が有効な「01689」以外の数字を含む数値は false を返し、カウント対象から除外します。
  2. 桁の反転と置き換え:rotateMap を使って各桁を回転後の数字に変換します。重要なのは、180度回転では桁の並び自体も反転するため、結果を逆順に組み立てる点です(例:16 → 91)。
  3. 範囲内の判定とカウント:1から num までの各数値について回転結果を計算し、有効な数かつ num 以内であればカウントを増やします。

実行結果

上記のコードを実行すると、コンソールには次のように出力されます。

5
  1. 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 となる正

  2. 【JavaScript入門】配列内で最初の非連続な数値を見つける方法

    はじめに本記事では、JavaScriptを使って「数値の配列の中から、直前の要素と連続していない最初の数値」を見つける方法を解説します。アルゴリズムの練習やコーディング面接の対策としても役立つ基本的な問題です。 問題の定義数値の配列を受け取るJavaScript関数を作成する必要があります。この関数は、直前の要素に対して +1 となっていない(連続していない)最初の要素を返さなければなりません。 言い換えると、隣り合う要素同士の差が1以外になる箇所が現れたとき、その箇所の後ろ側の要素を返すという処理です。なお、そのような要素が必ず配列内に1つ以上存在するものとします。 サンプルコード以下は、実