が流行っているらしいのですいつの話だ。
D で書きました。残念ながらコンパイルが通りませんが結果オーライ。改行とかできないのでぜんぜん三角形になりません。
i@u ~/test/d> dmd pascal.d pascal.d(55): static assert (0) is false, "[ 1 ] [ 1 1 ] [ 1 2 1 ] [ 1 3 3 1 ] [ 1 4 6 4 1 ] [ 1 5 10 10 5 1 ] [ 1 6 15 20 15 6 1 ] "
MPL とか無くても割となんとかなるなーという感でした。以下コード。
template itoa_(int n) {
template digit(long n) { const char [] digit = "0123456789"[n..n+1]; }
static if (n<0) const char [] s = "-" ~ itoa_!(-n).s;
else static if (n<10L) const char [] s = digit!(n);
else const char [] s = itoa_!(n/10L).s ~ digit!(n%10L);
}
template itoa(long n) {
const char [] itoa = itoa_!(n).s;
}
class list {}
template head(T) { const int head = T.sizeof/typeof(T[0]).sizeof; }
template tail(T) { alias typeof(T[0]) tail; }
template ltoa_(T) {
const char[] ltoa_ = ltoa_!(tail!(T)) ~ itoa!(head!(T)) ~ " ";
}
template ltoa_(T : list) {
const char[] ltoa_ = "";
}
template ltoa(T) {
const char[] ltoa = "[ " ~ ltoa_!(T) ~ "]";
}
template pascal_line2(int h, V) {
alias pascal_line!(V)[h+head!(V)] pascal_line2;
}
template pascal_line2(int h, V : list) {
alias pascal_line!(V)[h] pascal_line2;
}
template pascal_line(T) {
alias pascal_line2!(head!(T), tail!(T)) pascal_line;
}
template pascal_line(T : list) {
alias list pascal_line;
}
template pascal_(T, int n) {
alias pascal_line!(T)[1] l;
const char[] r = ltoa!(l) ~ " " ~ pascal_!(l, n-1).r;
}
template pascal_(T, int n : 0) {
const char[] r = "";
}
template pascal(int n) {
const char[] r = pascal_!(list, n).r;
static assert(false, r);
}
pascal!(7) p;参考文献。
itoa: http://www.digitalmars.com/d/archives/digitalmars/D/29734.html
list: http://www.kmonos.net/wlog/35.php#_0043040201
あ、ちなみに static-array は 7次元が限度だそうです。シンボルは以下のような感じになってました
00000000 D _D6pascal46__T7pascal_TG1G6G15G20G15G6G1C6pascal4listVi0Z1rAa
デマングルすると、
00000000 D char[] pascal.__T5ltoa!(typedef class pascal.list[1][6][15][20][15][6][1]).ltoa!()
ちゃんと答えが入ってますな。