今さらfizzbuzz(剰余なし)〜おまけJavaFX版〜

3連休。
暇なので、他の切り口での剰余演算なしfizzbuzz解法を考えてみる。

fb n | elem n [15,30..100] = "FizzBuzz"
     | elem n [3,6..100] = "Fizz"
     | elem n [5,10..100] = "Buzz"
     | otherwise = show n
main = mapM_ (putStrLn.fb) [1..100]

冴えないお。効率超悪いし、ナベアツほど面白みもない。

長い余談…JavaFXの場合

Haskellのような等差数列の表現(ex> [3,6..100])って、
確かJavaFX Scriptでも出来るってことをうっすらと覚えてたので、
暇ついでにNetBeansJavaFXをいじってみる。

ところが…

var fizz = [3,6..100];

上はコンパイルエラーになる。よくよく調べてみると、言語仕様がかなり変更されてて、

var fizz = [3..100 step 3];

にしないとダメらしい。
なんでこんなこと変えるの?Haskell嫌い?
まぁ、stepに変数を指定したくなったのだろうけど。

JavaFXのウリであるGUIクラスもずいぶん変わっちゃってるみたい。
いろんなとこで紹介されてる"HelloWorld"でさえエラーになる。

なんだかなぁ。気を取り直してfizzbuzzってみる。

import java.lang.System;
import javafx.lang.Sequences;

var fizz = [3..100 step 3];
var buzz = [5..100 step 5];
var fizzbuzz = [15..100 step 15];

for (i in [1..100]) {
    var str = i.toString();
    str = if (Sequences.indexOf(fizz,i) != -1) then "Fizz" else str;
    str = if (Sequences.indexOf(buzz,i) != -1) then "Buzz" else str;
    str = if (Sequences.indexOf(fizzbuzz,i) != -1) then "FizzBuzz" else str;
    System.out.println(str);
}

んー。言語変えてみてもダメな設計がよくなるわけでもなし。


それにしてもほんとJavaFXはどーなんだろ。
別に三項演算子が好きってわけでもないけど、
上のやつも「str = expr ? "Fizz" : str」って書くとエラー。
実はJavaFXでは、if-then-elseが三項演算子で、さらにif-else文の分岐式とは別モノと云う…。


しばらくJavaFXには近寄らないことにする。