D言語でコンパイル時に「ソフトウェアエンジニアならば1時間以内に解けなければいけない5つの問題」の5問目を解いてみた
元ネタ 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 的な細工すれば早くなるかも