コードサイズをmainに比例するようにした

昨日の続き。

昨日のはコードサイズがmainの自乗に比例していたので、1MBになった。
今回は定数倍ですむようにした。

定数倍にするには

let data p1 w W v =
  v(W(W(w(w(w(W(W(W(...(W(p1))...)))))))

let dat1 w W v =
  w (dat0 w W v)
in
let dat2 w W v =
  W (dat1 w W v)
in
let dat3 w W v =
  W (dat2 w W v)
in
let dat4 w W v =
  v (dat3 w W v)

のように、一文字あたり一関数でエンコードするよりないと思うのだが、これではまめっちのと同じなので、
ちょっと工夫して

let dat1 w W v rec =
  rec dat0 w
in
let dat2 w W v rec =
  rec dat1 W
in
let dat3 w W v rec =
  rec dat2 W
in
let dat4 w W v rec =
  rec dat3 v

こうすると、一文字当たり約16文字でエンコードできるようになった。

この結果 30KB まで縮んだ。

「W」と「v」を生成するコードがいい加減なので、かなりバイト数を食ってる。
どっかにいい方法落ちてないかなと思って探してたら
http://d.hatena.ne.jp/youz/20080911/1221150265
こんなところにあった。

次はランレングス圧縮をやる