APL/J言語でトランプ


Easy JというJ言語の本(onlineです、無料)を読んでいたら15ページ目にトランプの手を計算している例が載っていました。ちょっとおもしろかったのでご紹介。52枚から13枚をランダムに選んだ手を作るだけです。トランプは1から13で、ダイヤ、クラブ、ハート、スペードとします。

n種類のものからm個重複なしに選ぶ方法はm?nですので、今回13枚をとりますので13?52です。それをhandという変数に入れますが、入れると同時に表示させるために頭に+をつけます。

   +hand=.13?52
30 19 10 43 6 13 29 27 23 7 24 31 32

さて、この結果を13で割って切り捨てると0 1 2 3の4種類になることを利用して、DCHS(ダイヤ、クラブ、ハート、スペード)に割り振ります。切捨ては<.(小なりドット)です。0 1 2 3の結果でDCHSを選ぶには{(波カッコ、ブレイス)を使います。あと変数suitに入れた結果を同時に表示させるのにこんどは,(カンマ)を使います。これはさっきは数字で、今回は文字列だからです。

   ,suit=.(<.hand%13){'DCHS'
HCDSDCHHCDCHH

同様に13で割った余りをカードの値にしますが、これも文字列で23456789TJQKAから{(波カッコ、ブレイス)で作ります。xをnで割った余りは|(たてぼう、バー)を使いますが、n|xの順で書くのがルールですので13|handとなります。

   ,value=.(13|hand){'23456789TJQKA'
68Q68253Q9K78

最後に見やすくするためにvalueとsuitを上下にならべたテーブルにしますが、縦に結合する動詞(関数、演算子)は,;(カンマコロン、ラミネート)を用います。

   value,:suit
68Q68253Q9K78
HCDSDCHHCDCHH

割り算の余りを出すための二項動詞のx,yの順序が気に食わないと思います。逆にするには~(なみ、チルダ)という副詞があって、x v~ yがy v xになったり、v~ yがy v yになったりしてけっこう便利です。

   13|~5
3
   ,value=.(hand|~13){'23456789TJQKA'
68Q68253Q9K78

以上