元ネタ Perl6で「ソフトウェアエンジニアならば1時間以内に解けなければいけない5つの問題」の5問目を解いてみた

D言語にはコンパイル時 eval という mixin があるので使ってみた。コードをみれば分かるが、とくに mixin を使う必要はないけど使いたかったから...

import std.conv : to;
import std.stdio : write;

string[] calc(string b = "1", int n = 1)() pure
{
    static if (n == 9)
    {
        return (mixin(b) == 100) ? [b] : [];
    }
    else
    {
        enum m = n + 1;
        enum s = to!string(m);
        return
            calc!(b ~ "+" ~ s, m)() ~
            calc!(b ~ "-" ~ s, m)() ~
            calc!(b ~       s, m)();
    }
}

void main()
{
    write(calc());
}

http://melpon.org/wandbox/permlink/iIi2AfUHluM55heb

実際元ネタの perl 5 の方が速い (ダメ)。竹内関数みたいな形なのでコンパイル時引数に lazy 的な細工すれば早くなるかも