Grayコードを利用して、組み合わせデータを作る

Grayコードというものがあります

【wikipedia】
http://ja.wikipedia.org/wiki/%E3%82%B0%E3%83%AC%E3%82%A4%E3%82%B3%E3%83%BC%E3%83%89

こういう話苦手です。

で、このGrayコードを作成する関数とルーチンがSAS9.2から追加されました。
以下のテクニカルニュースの3ページ目で解説されています。

http://www.sas.com/offices/asiapacific/japan/periodicals/technews/pdf/09aut.pdf


これを最初読んだ時、思いました。こういう関数って一体何に使えと言うの?と。

きっと特殊な職業の人が特殊なことに使ってんだろうなぁとか思ってました。
しかし結構前ですが、これを使って面白いことをやっているコードを見かけました。

確か本だったか、海外の論文だったか覚えてないのですが、概要は記憶していたので
ちょっと再現してみました。

今、○と△と□と×を組み合わせて、1文字から4文字の組み合わせを全て列挙しなさい。

つまり、1文字パターンは ○、△、□、×の4通り
2文字パターンは○△、○□、○×、△□、△×、□×の6通り
って、感じですね。
3文字パターンは4通りで
4文字パターンは当然1通りなので

全部で15のはずです。

さて、これをSASで作ってみます。

data A0;
length OUT $10;
array N{4};
do i = 1 to 2**dim(N);
 call graycode (-1, of N{*});
   OUT='';
   do j = 1 to dim(N);
     if N{j}^=0 then OUT = cats(OUT,ksubstr("○×△□",j,1));
     end;
   if OUT^='' then output;
 end;
run;


結果は














となって、変数OUTの中身をみると、確かに15オブザベーション分できてます。

網羅的に0、1が出現するGrayコードを、こういう風に使うわけですか、
ちょうど0,1という値だから、これが文字列連結のための真偽値になってるわけか。

はぁ~、納得すると溜息つきたくなるようなコードですね。
どうやったらゼロからこういうコードを思いついて、表現できるようになるんでしょうか。
僕には一生思いつく気がしません。

わけわからんような、何の役にたたなさそうな関数やルーチンも、きちんと使い道を
研究検討しないと駄目ですね。






0 件のコメント:

コメントを投稿