C(gcc)、143 142 127 + 10 = 137 136 + 10 = 146(コンパイラフラグ)バイト
論理ORをビット演算子で置き換えることにより、-1バイト。
Logernのおかげで-5バイト。
2回出力された中央線を修正する+9バイト。
char*s="123456789abcdefghi";G{for(;j<18;++j)putchar(i>j|j>17-i?s[j]:32);puts("");}f(){int i=0,j=0;for(;i++<8;)G;g(i+1,j);for(;i-->1;)G;}
コンパイラフラグ:
-DG=g(i,j)
このマクロは、の発生を因数分解します。 g(i,j)関数宣言と呼び出しのます。
オンラインでお試しください!
Pietu1998の素晴らしい答えとは異なるアプローチは、よりわかりやすく(読みやすい)、より高いスコアです。
エントリポイントは関数f()です。関数g()は、連続する各行の印刷を処理します。
に名前fを変更することにより、完全なプログラムを作成できますmainでそれでもスコアは増加します。
プリティバージョン、マクロG展開:
char *s = "123456789abcdefghi";
int g(int i, int j) {
for(; j < 18; ++j)
putchar((i > j | j > 17 - i) ? s[j] : 32);
puts(""); // Break the line -- shorter than putchar(10) or printf("\n")
}
int f() {
int i = 0, j = 0; // j is constant, declared here to not have to declare and init it inside g()
for(; i++ < 8;) // Upper half of the tie
g(i, j);
g(i + 1, j); // Median line
for(; i-- > 1;) // Lower half; --i > 0 would also work for the condition
g(i, j);
}