矮小

井の中の蛙

2次元bool配列のテストケースを分かりやすくデバッグする

フィールドが与えられるのでその上でうんたんみたいな問題をこの前解きました.CODE THANKS FESTIVALで.まあAOJとかでもよくありますが.

で,大体の場合は「黒いマスだけを使って〜」とかそういう問題(当日はそうだった)なので,例えばD言語(というかC言語系統)ではbool[][]で管理すると思うんですが,D言語でそのままwritelnすると[true, true, false]みたいなものが直接吐き出されて見辛いなと思ってました.

が,コンテスト中にたまたま「配列の中身をmapで置き換えたものを出力してしまえばいいのでは?」ということに気付いてしまいました.のでやってみたら普通に出来た.

import std.stdio;
import std.algorithm;

void main() {
    bool[][] f = new bool[][](7, 9);
    for (int i = 2; i <= 4; i++) {
        for (int j = 3; j <= 6; j++) {
            f[i][j] = true;
        }
    }

    foreach (row; f) {
        row.map!("a ? '#' : '.'").writeln;
    }
}
➜  ~  rdmd /tmp/hoge.d
.........
.........
...####..
...####..
...####..
.........
.........

mapのテンプレート引数の三項演算子でifもelseもcharにすることによってrowがchar[]になるので自動的に文字列形式で出力されるという話.ちなみにcharは(たぶん)UTF-8の2バイト以下の文字なら何でもいい(適当)ので,"a ? 'あ' : 'ん'"とか"a ? '✔' : '✘'"とかいろいろやって遊べます.