ナベアツ判定機
与えられた数値 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; };
-
参考文献
-
関連項目
世界のナベアツ
「3の倍数と3のつく数のときだけアホになる」という、Fizz Buzzと同様の考えのギャグを行っている。
-
力試しにナベアツのような判定をするプログラムを作ろうとしたところ、問題が発生しました。 - 人力検索はてな
ようはそれぞれの位をとりだして3かどうか判断すればよい。
v0.2.0
on 2024-05-18