🌟
gccを使ってコンパイル時FizzBuzz
はじめに
こういうやつです。
$ gcc fizzbuzz.c
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
~ 略 ~
Buzz
Fizz
97
98
Fizz
Buzz
$
コマンドラインで-DN=nを指定すると上限値を100から変えられます。
$ gcc -DN=1234 fizzbuzz.c
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
~ 略 ~
FizzBuzz
1231
1232
Fizz
1234
$
とりあえず9999999まで指定できるはずですが確認してません。
実際のコード
ちょっと長いので折り畳んでます
fizzbuzz.c
#if __INCLUDE_LEVEL__ == 0
#include <stdio.h>
#ifndef N
#define N 100
#endif
#define A 0
#define B 0
#define C 0
#define D 0
#define E 0
#define F 0
#define G 0
#define X (10 * (10 * (10 * (10 * (10 * (10 * G + F) + E) + D) + C) + B) + A)
#define N2S(n) #n
#define X2S(n) N2S(n)
#define put(s) do {puts(s); __asm __volatile(".print \"" s "\"");} while (0)
int main(void)
{
#endif
#if N & (1 << __INCLUDE_LEVEL__)
#if A == 0
#undef A
#define A 1
#elif A == 1
#undef A
#define A 2
#elif A == 2
#undef A
#define A 3
#elif A == 3
#undef A
#define A 4
#elif A == 4
#undef A
#define A 5
#elif A == 5
#undef A
#define A 6
#elif A == 6
#undef A
#define A 7
#elif A == 7
#undef A
#define A 8
#elif A == 8
#undef A
#define A 9
#elif A == 9
#undef A
#define A 0
#if B == 0
#undef B
#define B 1
#elif B == 1
#undef B
#define B 2
#elif B == 2
#undef B
#define B 3
#elif B == 3
#undef B
#define B 4
#elif B == 4
#undef B
#define B 5
#elif B == 5
#undef B
#define B 6
#elif B == 6
#undef B
#define B 7
#elif B == 7
#undef B
#define B 8
#elif B == 8
#undef B
#define B 9
#elif B == 9
#undef B
#define B 0
#if C == 0
#undef C
#define C 1
#elif C == 1
#undef C
#define C 2
#elif C == 2
#undef C
#define C 3
#elif C == 3
#undef C
#define C 4
#elif C == 4
#undef C
#define C 5
#elif C == 5
#undef C
#define C 6
#elif C == 6
#undef C
#define C 7
#elif C == 7
#undef C
#define C 8
#elif C == 8
#undef C
#define C 9
#elif C == 9
#undef C
#define C 0
#if D == 0
#undef D
#define D 1
#elif D == 1
#undef D
#define D 2
#elif D == 2
#undef D
#define D 3
#elif D == 3
#undef D
#define D 4
#elif D == 4
#undef D
#define D 5
#elif D == 5
#undef D
#define D 6
#elif D == 6
#undef D
#define D 7
#elif D == 7
#undef D
#define D 8
#elif D == 8
#undef D
#define D 9
#elif D == 9
#undef D
#define D 0
#if E == 0
#undef E
#define E 1
#elif E == 1
#undef E
#define E 2
#elif E == 2
#undef E
#define E 3
#elif E == 3
#undef E
#define E 4
#elif E == 4
#undef E
#define E 5
#elif E == 5
#undef E
#define E 6
#elif E == 6
#undef E
#define E 7
#elif E == 7
#undef E
#define E 8
#elif E == 8
#undef E
#define E 9
#elif E == 9
#undef E
#define E 0
#if F == 0
#undef F
#define F 1
#elif F == 1
#undef F
#define F 2
#elif F == 2
#undef F
#define F 3
#elif F == 3
#undef F
#define F 4
#elif F == 4
#undef F
#define F 5
#elif F == 5
#undef F
#define F 6
#elif F == 6
#undef F
#define F 7
#elif F == 7
#undef F
#define F 8
#elif F == 8
#undef F
#define F 9
#elif F == 9
#undef F
#define F 0
#if G == 0
#undef G
#define G 1
#elif G == 1
#undef G
#define G 2
#elif G == 2
#undef G
#define G 3
#elif G == 3
#undef G
#define G 4
#elif G == 4
#undef G
#define G 5
#elif G == 5
#undef G
#define G 6
#elif G == 6
#undef G
#define G 7
#elif G == 7
#undef G
#define G 8
#elif G == 8
#undef G
#define G 9
#elif G == 9
#undef G
#define G 10
#endif
#endif
#endif
#endif
#endif
#endif
#endif
put(
#if X % 3 != 0 && X % 5 != 0
#if X >= 1000000
X2S(G)
#endif
#if X >= 100000
X2S(F)
#endif
#if X >= 10000
X2S(E)
#endif
#if X >= 1000
X2S(D)
#endif
#if X >= 100
X2S(C)
#endif
#if X >= 10
X2S(B)
#endif
X2S(A)
#else
#if X % 3 == 0
"Fizz"
#endif
#if X % 5 == 0
"Buzz"
#endif
#endif
);
#endif
#if N >= 2 * (1 << __INCLUDE_LEVEL__)
#include __FILE__
#include __FILE__
#endif
#if __INCLUDE_LEVEL__ == 0
}
#endif
コンパイル時出力というよりアセンブル時出力といった方が正確ですね。
おわりに
おわりです。
Discussion
私の記事に対する荒らしコメントを直ちに削除してください
私の記事に対する荒らしコメントを直ちに削除してください
私の記事に対する荒らしコメントを直ちに削除してください