2010年02月02日
ActionScript3 で素数列挙を short coding (2)
ActionScript3 で素数列挙を short coding にいくつか反応があって嬉しい。わたしが書いた 210文字のコードは最終的に184文字にまで縮まった。
大変興味深いので、変遷の過程を紹介する。
たたき台 (210文字)
昨日の最後に紹介したのがこのコード。実際にはインデントと改行はないが、読みやすくするためにインデントしたもので紹介していく。
package{ import flash.display.*; public class C extends Sprite{ public function C(){ for(var g=graphics,a=[],c=1,d;c++<1E3;) if(!a[c]){ for(d=c;d<1E3;) a[d+=c]=1; g.beginFill(0); g.drawRect((c%10)*5,int(c/10)*5,5,5) } } } }
反則編 (172文字)
sph62 さんによるコード。
完成後の画像を Loader でロードしている。さすがに反則技なのでノーカウントだけど、発想が素敵なので敬意をもって紹介する。
with編 (189文字)
psyark さんによる with を活用したコード。
インデントするとこうなる。
package{ import flash.display.*; public class C extends Sprite{ function C(){ with(graphics) for(beginFill(0),a=[],c=1;c++<1E3;) if(!a[c]) for(drawRect(c%10<<3,c/10<<3,8,8),d=c;d<1E3;) a[d+=c]=1 } }
使ってるテクニック
with(graphics)
を使うことでgraphics.
が不要になったwith
の中ではvar
を使った変数宣言はいらない (ただし、代入せずに参照すると、実行時エラーとなる)for
やif
のあとを複数行としないことで、{}
を節約(c%10)*5
の変わりにシフト演算子を利用してc%10<<3
とする
すばらしすぎる!!
デフォルト引数を活用 (185行)
o8que さんによる小技連発により、さらに4文字短くなった。
インデントするとこうなる。
package{ import flash.display.*; public class C extends Sprite{ function C(c=1){ with(graphics) for(beginFill(0),a=[];c++<1E3;) if(!a[d=c]) for(drawRect(c%10*4,c/10<<2,4,4);d<1E3;) a[d+=c]=1 } } }
使ってるテクニック
- コンストラクタのデフォルト引数で変数宣言してしまう (カンマ演算子が不要になるので1文字の節約)
a[c]
とd=c
を統合してa[d=c]
と書くc%10<<3
はc%10*4
と書くと1文字節約
苦心で1文字減らす (184文字)
皆様のアイデアに感心しつつ、わたしもがんばってみた。試行錯誤の結果、1文字だけ減らせた。
インデントするとこうなる。
package{ import flash.display.*; public class C extends Sprite{ function C(){ with(graphics) for(beginFill(c=1),a=[];c++<1E3;) if(!a[d=c]) for(drawRect(c%10*4,c/10<<2,4,4);d<1E3;) a[d+=c]=1 } } }
使ったテクニック
c=1
とbeginFill(0)
が冗長に見えたので、beginFill(c=1)
としてみた。#000000 と #000001 は区別つかないよね。
まとめ
みなさんの更なる挑戦をお待ちしています!!! 何かに気づけばもっと短くなる気がしている…。