challenge ポーカーの役判定

引数に手札を与えると、ポーカーの役を表示するプログラムを作ってください。

条件:

  • スートはS,D,H,C、ランクはA,2~9,T,J,Q,Kのそれぞれ一文字で表します。
  • 手札は S2D5H3CQS9 のように10文字で指定されます。特にソートはされていません。
  • 手札にジョーカーは含まれません。
  • ストレートで取りうるランクの種類はA2345, 23456 ... 9TJQK, TJQKAの10種類で、JQKA2のようにK-A-2をまたぐものはストレートではありません。

実行例:

% ./poker SQSJSASKST
Royal flush

% ./poker D9D7D6D5D8
Straight flush

% ./poker C2D2S2H3H2
Four of a kind

% ./poker C2D3S2H3H2
Full house

% ./poker S9S4S8STSJ
Flush

% ./poker C4H7D5S6H3
Straight

% ./poker S6H6C5DQC6
Three of a kind

% ./poker S6HQC5DQC6
Two pair

% ./poker S6H4C5DQC6
One pair

% ./poker SJSQSKSAC2
No pair

お題にしようと思っていたのに間違えてしまいました。今から変更可能でしょうか?

(説明)
当初間違ってトピックに投稿していたので、このようなコメントを付けていたのですが、
このコメントに気づいた管理人さんにお題に移していただきました。
(最初の2つだけ投稿日時が早いのはそのためです)

Posted feedbacks - Smalltalk

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...