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 を使った変数宣言はいらない (ただし、代入せずに参照すると、実行時エラーとなる)
  • forif のあとを複数行としないことで、{} を節約
  • (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<<3c%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=1beginFill(0) が冗長に見えたので、beginFill(c=1) としてみた。#000000 と #000001 は区別つかないよね。

まとめ

みなさんの更なる挑戦をお待ちしています!!! 何かに気づけばもっと短くなる気がしている…。