本を読む

読書やコンピュータなどに関するメモ

seqコマンドを勝手にFizzBuzz化

 いまさらながらFizzBuzz問題ネタ。

 seqコマンド自身を、再コンパイルなしにFizzBuzz化してみるという、アスペクト指向(嘘)な方法を試した。Linux限定かもしれない。

 まず、こんな感じでfizzbuzzize.cを書く。

// fizzbuzzize.c
#include <stdio.h>
#include <math.h>
#include <stdarg.h>

int printf(const char* format, ...)
{
    va_list ap;
    char buf[8];
    double data;

    va_start(ap, format);
    data = va_arg(ap, double);

    fputs((fmod(data, 15) == 0) ?  "FizzBuzz" :
          (fmod(data, 3) == 0)  ?  "Fizz" :
          (fmod(data, 5) == 0)  ?  "Buzz" :
                                   (snprintf(buf, 8, "%g", data), buf)
          ,stdout);
}

 これを.soにコンパイル。

$ gcc -shared -fPIC -o fizzbuzzize.so fizzbuzzize.c

 あとは、seq 100を実行する。

$ LD_PRELOAD=./fizzbuzzize.so \
seq 100
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
(以下略)

コメント

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://emasaka.blog65.fc2.com/tb.php/226-04b3dcfc

 | HOME | 

Categories

Recent Entries

Recent Comments

Recent Trackbacks

Appendix

emasaka

emasaka

フリーター。
連絡先はこのへん

Monthly


FC2Ad