変数の値の中で、データを分解してソートしたり重複を除いたりしてみる

自分で問題を作って、自分で頑張って解いて
自分で自分を褒めるという悲しい遊びを繰り返す可哀想な子です。

例えば、以下のようなデータがあって、

data Q1;
length x $1000.;
x="3,1,2,5,3";output;
x="1,2,3";output;
x="1,1,1,3,2,2,2,4";output;
x="2";output;
x="";output;
x="999,15,3";output;
run;














xの中身をカンマで分解して、取り出した数字をソートして、重複をとって、再びカンマでつなぎ合わせて戻す。
ただし、入る数字は飛び番もあり、カンマの数も上限がないとする。
上限値を設定することなく、最速最短ステップで解け。

そういう問題に対して、以下のように書いてみました。

data A1;
set Q1;
if _N_=1 then do;
declare hash h1(ordered:"A");
declare hiter hi1("h1");
h1.definekey("val","valc");
h1.definedone();
end;

do i=1 to count(x,",") +1 ;
valc=scan(x,i,",");
val=input(valc,best.);
h1.ref();
end;

   rc = hi1.first();
   _x=valc;
   do while (rc = 0);
  if _x ne valc then _x=catx(",", _x,  valc );
      rc = hi1.next();
   end;

h1.clear();

keep x _x;
run;















パチパチパチ、できたできた。あんたはエライ!

あってるかどうか、最善手かどうかはわからない。

面白ポイントとしては
ハッシュオブジェクトでキー重複除去と並び替えを行って
それをハッシュ反復子オブジェクトで取得してるとこ。
反復子だと、キーがどう設定されてるかを無視するわけで、今回は並び替えが終わった時点で、キーの役目は終わってるわけですからね。
反復子がキーの呪縛から逃れて順次取得できるところにカタルシスがあるんです

そして、1obsごとにハッシュの中身をクリアしてるところも見どころ。
テンポラリーの作業場としてのハッシュオブジェクトという考え方は面白い。

一生懸命定義して、工夫してハッシュに格納したデータを、1obsごとにゴミの様に捨てることの背徳感。ゾクゾクってしません?



0 件のコメント:

コメントを投稿