Comment detail

ポーカーの役判定 (Nested Flatten)

Squeak Smalltalk で。

バッグ(a Bag)はマルチセットとも呼ばれる特殊なコレクションのひとつで、要素を、その種類と出現数との組として管理しています。情報は内包される辞書に保持され、#valuesAndCounts をコールすることでアクセスできます。なお、Smalltalk で辞書(a Dictionary)とは、連想配列のことを指します。

辞書は #values で、自らが要素として持つ「キー -> 値」の組の「値」(この場合、出現数)のみを抽出した配列を返します。本スクリプトでは、この出現数のみを抽出した配列(ソート済み)のパターンを見て(#caseOf:otherwise:)、手の役(ストレートやフラッシュ以外の…)を判定しています。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
| 入力 ランク順 ランク スート |
入力 := 'SQSJSASKST'.
ランク順 := 'A', ($2 to: $9), 'TJQK'.
ランク := Bag new.
スート := Bag new.
入力 pairsDo: [:a :b | スート add: a. ランク add: (ランク順 indexOf: b)].
スート asSet size = 1 ifTrue: [
    ランク asSortedArray = #(1 10 11 12 13) ifTrue: [^'Royal flush'].
    ランク asSortedArray = (ランク min to: ランク min + 4) ifTrue: [^'Straight flush'].
    ^'Flush'].
ランク asSortedArray = (ランク min to: ランク min + 4) ifTrue: [^'Straight'].
^ランク valuesAndCounts values sort caseOf: {
    [#(1 4)] -> ['Four of a kind'].
    [#(2 3)] -> ['Full house'].
    [#(1 1 3)] -> ['Three of a kind'].
    [#(1 2 2)] -> ['Two pair'].
    [#(1 1 1 2)] -> ['One pair']} otherwise: ['No pair']

Index

Feed

Other

Link

Pathtraq

loading...