ナベアツ判定機

与えられた数値 n について、次の (A), (B) いずれかの条件を満たせば [n]!!! と出力する。

  • (A) 3 の倍数である
  • (B) 3 を含む桁が存在する

メモ

  • 0 も 3 の倍数として評価している。

  • 「(A) 3 の倍数である」は、入力値が 3 で割り切れれば 3 の倍数であると評価する。Fizz Buzz と一緒。

    /**
     * 入力値が 3 の倍数であるか評価する関数
     * @param {number} num - 評価する数値
     * @returns {boolean} - 3 の倍数であれば true, そうでなければ false
     */
    const isThreeMultiple = (num: number): boolean => num % 3 === 0;
  • 「(B) 3 を含む桁が存在する」は数値 (number 型) として扱う縛りで対応した。

    • もっと単純にやるなら文字列 (string 型) に変換して「"3" を含むか」を評価する方が簡単。だけどそれでは面白くないので……。

    • 処理はこんな感じ。特に「入力を 10 で割って余剰 (余り) を取り出すと最下位の桁 (一の位) のみが取得できる」のがポイント。これを繰返し処理して 1 桁ずつ 3 と一致するか否か評価している。

      /**
       * 入力値に 3 を含む桁が存在するか評価する関数
       * @param {number} num - 評価する数値
       * @returns {boolean} - 3 を含む桁があれば true, そうでなければ false
       */
      const hasThreeDigits = (num: number): boolean => {
        // 入力を絶対値へ変換する
        // e.g. -1234 ⇒ 1234
        let absNum = Math.abs(num);
       
        // 各桁を調べる
        while (absNum > 0) {
          // 最下位の桁を取得する
          // 入力を 10 で割って余剰を取り出すと取得できる
          // e.g. `1234 % 10 = 1230 ... 4` ⇒ `4` が最下位の桁となる
          const digit = absNum % 10;
       
          // 3 と比較して等しい桁が見つかったら true を返す
          if (digit === 3) {
            return true;
          }
       
          // 見つからなかったら最下位の桁を削除して次の桁へ移動する
          // 入力を 10 で割って小数部を切り捨てると削除できる
          // e.g. `1234 / 10 = 123.4` ⇒ `123` を次の計算で使用する
          absNum = Math.trunc(absNum / 10);
        }
       
        // 3 と等しい桁が見つからずにループを抜けたら false を返す
        return false;
      };

参考文献

v0.2.0
on 2024-05-18