コードサイズを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
こんなところにあった。
次はランレングス圧縮をやる