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
