駒交換における得点計算プログラム_Formatプロシジャのinvalueで入力形式を作成して計算する話にかこつけて

【※注意】後で、SASの話も一応でてきますので、、


将棋において、なんの犠牲も払わずに、タダで相手の駒をとることができる状況はまれです。
序盤は特にそうですが、
例えば、相手の「銀」を取れる代わりに、自分の「桂馬」がとられるといったように、戦う以上、駒の交換は避けられません。
しかし、避けられないならば、できる限り、自分に得になって、相手に損になるように交換するのが、勝つための大原則です。

例えば、「歩」と「飛車」の交換であれば、明らかに「飛車」の方が価値が高いので、喜んで「歩」を差し出していいでしょう。

では、例えば、相手の「飛車」を取れる代わりに、こちらの「香車」と「桂馬」の2つを犠牲にしなければならない攻め方の場合、その交換を行うべきか、避けるべきかどちらでしょう?

当然、状況によって駒の価値は変わるので、答えはでませんが、単純化して考える方法として駒の得点化ということをよく言います。


谷川浩司九段の有名な点数化例では、以下の通りです。


飛=15
竜=17点
角=13点
馬=15点
金=9点
銀=8点
成銀=9点
桂=6
成桂=10点
香=5
成香=10点
歩=1点
と金=12点

これをみると「香車」と「桂馬」の2つの点数の合計は11点、対して「飛車」は15点なので、積極的に交換してもよいという理屈になります。



さて、ここからはおまけみたいなもんですが、とりあえず、やっとSASの話です。

以下のようなデータセットがあったとします。

data TRADE;
SENTE='桂';GOTE='金';output;
SENTE='香';GOTE='銀';output;
SENTE='香';GOTE='';output;
SENTE='歩';GOTE='';output;
run;









変数名SENTEは「先手」、GOTEは「後手」です。
このように、交換対象の駒をオブザベーションごとにいれます。

今回は先手4枚と後手2枚の交換ですが、どっちが得をするかぱっとわかりますか??

SASに計算させたいのですが、これ文字なんで、そのままじゃどうしようもないわけです。
アプローチはたくさんありそうですが、今回はインフォーマットでいきましょう

proc format;
invalue  koma '飛'=15 '竜'=17 '角'=13 '馬'=15 '金'=9 '銀'=8 '成銀'=9
              '桂'=6 '成桂'=10 '香'=5 '成香'=10 '歩'=1 'と金'=12;
run;

として点数換算表をインフォーマットにしちゃいましょう!
valueステートメントはよく使いますが、invalueって個人的にはあまりつかわないので新鮮です。

あとはもう

proc sql;
 select sum(input(SENTE,koma.)) as SPOINT label='先手の駒の得点合計'
       ,sum(input(GOTE,koma.)) as GPOINT label='後手の駒の得点合計'
  from TRADE;
 quit;

なんでもいいんで計算しちゃえば










こんなアウトプットがでて、損とも得ともいえない交換ということがわかります。
でも、僕が先手ならこの交換は絶対やりますけどね。まあ目安です。

この得点化プログラム、将棋の際に是非使ってください。

遊びで作ったコードの方が、実戦的なものよりプログラム能力を上達させる効果があるというのが僕の持論(言い訳)です。






0 件のコメント:

コメントを投稿