発端になったのはこちら
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で使えるようにしてもらいたいなー。