ソフトウェアエンジニアの日常の雑記

日々思ったことをまとめます

JavaでFibBuzzを解いてみる

発端になったのはこちら

FizzBuzz は時代遅れらしいので FibBuzz はどうでしょうFizzBuzzの代わりにFibBuzzがくる・・・ということなので、乗り遅れないうちに解いておこうかと思う。

FibBuzz(ちょっと変更)
FibBuzz: 1から100まで列挙していき、フィボナッチ数列ならFibで、5で割り切れるならBuzz, フィボナッチ数と5両方で割り切れる場合はFibBuzzを出力する事.
フィボナッチ数と5どちらも割り切れない場合はそのまま出力して良い.

できたのは下記。

import java.util.ArrayList;
import java.util.List;

public class Fib {
    private static List<Integer> fibList = new ArrayList<Integer>();
    private static final int num = 100;
    static {
        int value = 0, fib1 = 0, fib2 = 1;
        for (int i = 0; i < num; i++) {
            value = fib1 + fib2;
            fib2 = fib1;
            fib1 = value;
            if (value > num) { // 上限を超えたらbreak;
                break;
            }
            if (value < 0) { // マイナスになったらbreak;
                break;
            }
            fibList.add(Integer.valueOf(value));
        }
    }
    
    public static void main(String[] args) {
        for (int i = 1; i <= num; i++) {
            System.out.println(Checkfib(i) ? i % 5 == 0 ? "FidBuzz" : "Fid" 
                                           : i % 5 == 0 ? "Buzz" : Integer.valueOf(i));
        }
    }
    
    static boolean Checkfib(int num) {
        return fibList.contains(Integer.valueOf(num));
    }
}

こんな感じでできた。うーん。三項演算子のネストが読みにくいがif文を書き連ねても面白くないので採用(プロジェクトコードじゃないしね、いつもなら普通に書きます)。基本型(int,long)だとそんなにたくさんないので、Fibになる数値があんまりないかな。BigInteger版をつくろうかと思ったが、四則演算使えないから面倒になってやめてしまった。Java8かJava9のProject Coinで基本型のラッパー型とBigIntegerとBigDecimalで使えるようにしてもらいたいなー。