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 (以下略)
コメント
コメントの投稿
トラックバック
https://emasaka.blog.fc2.com/tb.php/226-04b3dcfc