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

JavaScriptで指定範囲内の「逆さま数字(Upside Down Numbers)」を数える方法

逆さま数字(Upside Down Numbers)とは?

180度回転させても元の数字と同じように見える数字のことを「逆さま数字」と呼びます。

例えば、「9116」や「69」などが該当します。

これは次の桁だけが回転しても有効だからです。

  • 0 → 0
  • 1 → 1
  • 6 → 9
  • 8 → 8
  • 9 → 6

一方、2・3・4・5・7は回転すると別の記号や無効な形になってしまうため、これらが含まれる数字は逆さま数字にはなりません。

問題

2つの数値からなる範囲の配列を受け取るJavaScript関数を作成する必要があります。この関数は、指定された範囲内に存在するすべての逆さま数字の個数を返さなければなりません。

コード例

以下がそのコードです −

const range = [5, 125];
const flipNum = (number) => {
    const upsideDownDigits = [0, 1, -99, -99, -99, -99, 9, -99, 8, 6];
    let reverseNumArr = String(number)
        .split('')
        .map(val => Number(val))
        .reverse();
    let flipDigitsNumArr = reverseNumArr.map(val => upsideDownDigits[val]);
    if (flipDigitsNumArr.includes(-99)) {
        return false;
    }
    let flipDigitsNum = Number(
        flipDigitsNumArr.reduce((accum, curr) => accum + String(curr))
    );
    return flipDigitsNum === number;
};
const countUpsideDown = ([lowNum, highNum]) => {
    let uDNums = 0;
    for (let counter = lowNum; counter <= highNum; counter++) {
        uDNums += flipNum(counter) === true;
    }
    return uDNums;
};
console.log(countUpsideDown(range));

出力

7

コードの解説

このコードの仕組みを簡単に説明します。

flipNum関数の処理の流れ

配列upsideDownDigitsは、各桁を回転後の数字へマッピングする対応表です。インデックスが元の桁に対応しており、6は9に、9は6に変換されます。回転できない数字(2〜5、7)には無効を示す-99が設定されています。

まず対象の数値を文字列化して1桁ずつ分解し、順序を反転させます。180度回転では左右が入れ替わるため、この操作が必要です。その後、各桁を対応表に従って回転後の数字へ変換します。

変換結果に-99が含まれていれば、その数値は回転できない桁を含むため、即座にfalseを返します。

最後に、変換後の数値が元の数値と一致するかどうかを比較し、一致すればその数値は逆さま数字であると判断できます。

countUpsideDown関数について

countUpsideDown関数は、引数として受け取った範囲の下限から上限まで各数値を順番に調べ、flipNumtrueを返した件数をカウントします。

この例では範囲[5, 125]の中に、6、9、66、68、88、96、111の合計7個の逆さま数字が存在することが確認できます。

  1. JavaScriptでアルファベットの1始まりのインデックスを取得する方法

    問題JavaScriptで関数を作成する必要があります。この関数は、小文字の英字アルファベット1文字を受け取り、その文字がアルファベットの中で何番目に位置するかを「1始まり」のインデックスとして返します。例えば、a なら 1、j なら 10 を返すといったイメージです。無効な入力が渡された場合は -1 を返してエラーを通知すると親切です。実装の考え方最もシンプルな方法は、先頭に半角スペースを付けたアルファベット文字列「 abcdefghijklmnopqrstuvwxyz」を基準(レジェンド)として用意することです。こうすることで、スペースが0番目となり、a は1番目、j は10番目というよう

  2. 【JavaScript】配列内で最も頻出する単語を上位N件抽出する方法

    問題概要英小文字のみで構成された文字列の配列 arr を第一引数として受け取り、数値 num(num は配列の長さより小さい値)を第二引数として受け取る JavaScript 関数を作成します。この関数は、配列 arr 内で最も頻出する要素を上位 num 件返す必要があります。結果は出現回数が多い順に並べます。また、出現回数が同じ単語が複数ある場合は、辞書順(アルファベット順)で先に来る単語を優先して並べます。入力例const arr = [the, day, is, sunny, the, the, the, sunny, is, is]; const num = 4;出力例const ou