WordleをSASで実装してみた.判定はdo overとhash iterator object), 出力はSAS RWIを使ってみた

 Wordleっていうのが流行っていて,最近,やってる人多いなぁって思ってました
(最初はなんかみんな,謎の図形をSNSにあげてて,なんかの暗号?こわいと思ってました)

いわゆる文字当てゲームで
5文字単語の答えに対して6回チャレンジできるのですが

アルファベットとその位置が回答とあっていたら緑

アルファベットはあってるけど位置が違う場合は黄 って感じで,こちらのチャレンジに対してのフィードバックが返ってくるので,それを手掛かりにできるだけ早く正解に辿り着きましょうってゲームです

詳しくはウィキペディア参照
https://ja.wikipedia.org/wiki/Wordle



昨晩
SASユーザーなら何使ってアルゴリズム組むんだ?って海外の方が問いかけました?
Arrayか? hash objectか? IMLか? 正規表現か?

https://twitter.com/cjdinger/status/1503707344907251715







まあarrayが一位だろうと思いつつ,海外はhashの支持率高くていいなぁって,私も第一感hashなんですよね
https://twitter.com/Poswith1/status/1503712048282476544












私の敬愛する方が,こんなこといっちゃうので,色々とお祝いしたいこともあったので
書いてみました

インターフェースをマクロウインドウとかで作ってもよかったんですが
SAS ondemandとかで動かないので,ちょっとそこは手抜き

まず,答えとなる単語をデータセットにしたものを

どっかの永久ライブラリにでもおいておく

data ANS;

NO=1;WD="R";output;

NO=2;WD="E";output;

NO=3;WD="B";output;

NO=4;WD="U";output;

NO=5;WD="S";output;

run;


んで

解答は6回挑戦できるので
まあ,1回答1行ずつ文字いれて実行するイメージで


data DT1;

/*Try-1*/

C1="A";C2="R";C3="I";C4="S";C5="E";output;

/*Try-2*/

C1="R";C2="O";C3="U";C4="T";C5="E";output;

/*Try-3*/

C1="R";C2="U";C3="L";C4="E";C5="S";output;

/*Try-4*/

C1="R";C2="E";C3="B";C4="U";C5="S";output;

/*Try-5*/

C1="";C2="";C3="";C4="";C5="";output;

/*Try-6*/

C1="";C2="";C3="";C4="";C5="";output;

run;


で,肝心の判定と出力部分ですが

解答のデータセットをハッシュ反復子オブジェクト,

挑戦回答を横持ちでdo overでループして

_i_とハッシュの格納Noが一致して,かつデータが一致しているか

データはあるけど_i_とNoが不一致かで判定するようにしました

で,データステップでの判定の流れからダイレクトに美しめの出力を作りたかったので

マイナーですがSASのReport Writing Interface(RWI)オブジェクトを利用してみました


data _NULL_;

length background $50.;

set DT1;

where ^missing(cats(C1,C2,C3,C4,C5));

if 0 then set ANS;

if _N_=1 then do;

declare hash h1(dataset:"ANS",ordered:"Y");

declare hiter hi1('h1');

h1.definekey("NO");

h1.definedata("NO","WD");

h1.definedone();

end;

array  AR C1-C5;

dcl odsout ob();


  ob.layout_gridded( columns:5, rows:1 ,column_gutter: '2mm');

  do over AR;

  position=_i_;

  put position=;

  rc = hi1.first();

  do while (rc = 0);

   if position=NO and AR=WD  then background= "green";

   else if missing(color) and AR=WD  then background= "darkyellow";

rc = hi1.next();

  end;

  if missing(background) then background="gray";

  text=cats(" color=white height=1.5cm width=1.5cm fontsize=5 vjust=center background=",background);

      ob.region();

       ob.table_start();

          ob.row_start();

               ob.format_cell(data:AR,style_attr:text);

          ob.row_end();

       ob.table_end();

   call missing(background);

end;

   ob.layout_end();

 run;


















どうでしょう,わりと再現度高くないですかね?
ハッシュ反復子オブジェクトとRWI,両方,データステップ内でのオブジェクトなので
そこで判定とレポートがそのままの流れでできて美しいと感じたのですがどうなんでしょう


0 件のコメント:

コメントを投稿