FizzBuzz を swf で Golf

takesako さんという方が FizzBuzz を swf で golf されていた。159 bytes らしい。面白い。
でもまだまだ余裕があるように感じたので 30 分ほどいじったら、150 bytes になった。以下 swf とソース。
http://dame.dyndns.org/misc/fizzbuzz-swf-golf/fizz150.swf
http://dame.dyndns.org/misc/fizzbuzz-swf-golf/fizz150.txt


やったことは、アルゴリズムの変更 *1 と、試行錯誤による最適化 *2 だけ。確か swf は圧縮が施されている (アルゴリズムとか詳しいことは忘れた) ので、バイトコード自体の数を小さくしてもよい結果になるとは限らないのがポイント、というか苦痛。究極的には圧縮アルゴリズムがどう動くかを考えながらやらないといけないですね。


んで、この話には続きがあって、なんとなく「swf なんていい加減なんだから、終わりの数バイトくらい削っても動くんじゃねーの?」という気分で、試しに 1 バイト削ってみた。……動くじゃん。まじか!とりあえず 146 bytes まで削れた。
http://dame.dyndns.org/misc/fizzbuzz-swf-golf/fizz146.swf
うちの環境 (Windows XPFlash Player 9,0,28,0) では動いたけど、正しい swf フォーマットになっていない可能性が非常に高いので、参考記録ということで。

*1:「15 で割って分岐して、3 で割って分岐して、5 で割って分岐する」というコードだったのを、「最初に 3 で割って分岐して、then と else の両方で 5 で割って分岐する」という感じにしてみた。

*2:push Y, X; getVariable という列を push X; getVariable; push Y; swap にしてみるとか。