🌟

gccを使ってコンパイル時FizzBuzz

に公開
3

はじめに

こういうやつです。

$ 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

ログインするとコメントできます