ラベル reverse の投稿を表示しています。 すべての投稿を表示
ラベル reverse の投稿を表示しています。 すべての投稿を表示

SUBSTR(変数名,1,1)やSUBSTR(変数名,N,1)のような一字抜きであればFIRST関数、CHAR関数が使えるという話

例えば

data Q1;
 X='ABCDEFG';
 A=substr(X,1,1);
 B=substr(X,3,1);
run;

AはXから先頭1文字をとってきて、Bは3番目の文字をとります。
これで、問題ないです。





文句のつけようのないコードですが、敢えて無理やり文句をつけてみます。

まず、引数が3つもいるのが面倒臭い。
そして、今作成されたA、BのLENGTHは元のXのLENGTHを継承するため
$7です。一字だけとってるんだから、長さは$1あれば必ず足りるのに6も余計な
領域使っていて、無駄だ!エコでない!

というわけで、上記のコードは、必ず先頭1文字を取得するFIRST関数と、指定した場所を
1文字抜くCHAR関数で

data A1;
 X='ABCDEFG';
 A=first(X);
 B=char(X,3);
run;

とかけます。






この場合、A、Bの長さは$1です。

ちなみに最後の1文字をとる関数については、多分ないので

A=first(reverse(X));

のようにreverse関数で逆さ読みにしてから、firstかけてください。





回文を作成するプログラム_reverse関数を使ってみたい

reverse関数というものがあって、ABCをCBAのように、反転させてくれるといいます。ヘルプやマニュアルで存在とその機能は何回も目にしていたのですが、実践で一度も使ったことありませんでした。
そこで今回、無理やり使うべきシチュエーションを考えました。
回文ってご存知ですか?「留守に何する」のように反対から読んでも同じになる文章のことですね。
「るすにな」に「るすにな」を反転した語をつけると「るすにななにする」となります、「な」が一個多いのでそれをとれば「るすにな」から「るすになにする」ができます。

data A;
 BASE='たいやき';
 KAIBUN=cats(BASE,ksubstr(strip(kreverse(BASE)),2));
run;

proc print;
run;






これで関数にかけるワードから回文を生成するプログラムができました。

日本語は2byte文字なんでkreverse関数になります。revesrseで反転させてから
とりあえず前後空白を飛ばして、substr(同じく今回はksubstr)で2文字目以降全範囲を取得して
cats関数で元データと空白を入れずに結合しているという感じです。

これで回文はいくらでもつくれますが、その生成された文章が、文章として意味をなしているかが
重要でそれを判断できるのはプログラムでは難しいです。

けど、僕は本当は、プログラムに、人間が見て感動するようなすごい回文を生成させてみたいです。それには言語の構造を解釈できるようにプログラムを組まなければいけないのでしょうね、
いつか本腰を入れて取り組んでみたいです。