2014-06 << 2014-07 >> 2014-08

2014-07-28 (月)

会社休んでICFPとか.

*ICFPC 2014

ICFPC終わりました.

72時間,寝てる時間と食べてる時間以外はずっとLambda-Manについて考えていた.

やり残したことはたくさんあるし,結果は分からないけど,楽しかったのでよかった.

終了後,いつも通り肉を食べに行く.

眠い...

*ICFPC まとめ?

コンテストの内容はどこかに説明があるだろうし省略.

http://icfpcontest.org/

今年はsafiiとkmuroi含めた3人で.eldeshにも何度か電話かけたのだけど,応答がなかった.

scoregraph.png

時間経過ごとのスコアのグラフ.72時間のうちの60時間分くらい.最初の12時間は問題読んだりコンパイラを書いたりしていた.

Lambda-Manのスコアなので,上がっている所はLambda-Man側が強くなったところで,下がっているのはGhostが強くなったところ.最後の12時間位でGhostが強くなったのであまりスコア上がらなくなった.

終了5分前の時点でのやつをサブミット.・・・したのだけど,最後の修正をソースだけコミットしてて,コンパイル結果をコミットしてなかった.気になってたバグの原因に終了10分前に気づいて急いで直したのだけど,うっかりしていました.そんなに影響は無いはずだけど悲しい.

たぶんLISPコンパイラを作るのが正常なのだろうとは思ったけど,LISPとかあんまり書けないし,独自言語作ってその上で開発することにした.

作ったオレオレ言語で書かれたコード(の断片).

// (current, next1, ... next_n)
//  g = (probably[1..1024],(x,y),d)
function estimate_ghosts_position(ghosts, map, pos, n) {
    _alloc gh, ghlist(0), gpos, prob(1024), d(n);

    // current
    gh = ghosts;
    gpos = 0;
    while (atom(gh) == 0) {
        gpos = ( (prob, cdr(car(gh))) , gpos );
        gh = cdr(gh);
    }
    ghlist = (gpos, ghlist);

    while(n) {
        gh = 0;
        prob /= 2;
        gpos = all_ghost_next(map, car(ghlist));
        while(atom(gpos) == 0) {
            if (distance(pos, car(cdr(car(gpos)))) < d) {
                gh = (car(gpos), gh);
            }
            gpos = cdr(gpos);
        }
        ghlist = (gh, ghlist);
        n -= 1;
        if (list_length(gh) > 50) {
            n = 0;
        }
    }
    return list_reverse(ghlist);
}

ローカル変数は関数の先頭でまとめて宣言しないと,効率の悪いコードが生成されるせいで,なんか昔のC言語っぽさもある.随所に出てくる,carとかcdrが元のアーキテクチャの匂いがしますね.

class Memo(a) {
    function get() {
        return a;
    }
    function set(s) {
        a = s;
        return;
    }
}

最初,クロージャを作ってたのだけど,関数を複数まとめられたら便利だろうと思ってこんなふうにしたら,「それ僕の知ってるクロージャと違う」と言われたので「function」って書いてた場所を「class」にしたら,なんか普通っぽい言語に.

2014-06 << 2014-07 >> 2014-08