Problem 54 (Project Euler) [原文]
poker.txtには1000個のランダムな手札の組が含まれている. 各行は10枚のカードからなる (スペースで区切られている): 最初の5枚がプレイヤー1の手札であり, 残りの5枚がプレイヤー2の手札である. 以下のことを仮定してよい
- 全ての手札は正しい (使われない文字が出現しない. 同じカードは繰り返されない)
- 各プレイヤーの手札は特に決まった順に並んでいるわけではない
- 各勝負で勝敗は必ず決まる
1000回中プレイヤー1が勝つのは何回か?
問題文の引用は一部だけにとどめました。
独りポーカーなんかでは各役に以下のような得点をつけることがあります。
こうした問題で見通しをよくするにはクラスを作ってしまうことでしょう。
カード単体(Card)とカードを5枚保持する手札(Hands)とにそれぞれ相当するクラスがあれば十分です。
カード単体相当のクラスを作ると、"initialize"が使えるだけでもファイル読み込みの処理が随分楽になります。
また、5枚のカードを保持する手札相当のクラスでは"initialize"と同時に役相応の点数を計算保持するとともに、他者との勝負判定用に不等号演算子の再定義も行いました。
同役の際の勝負判定には役に関わるカードの数値が使われるので、当該数値を上記の得点の小数点以下に埋め込みます。
ちょっと処理が面倒だったのが、同役同数値の場合の勝負判定でした。役に付随するカード以外のカードの数値に基づいて判定されるので、役の点数とは別のインスタンス変数を設けました。
"poker.txt"は完全にランダムに作成されたらしく、無役の割合が多くて、高い役はありませんでした。なお、同ファイル中、"10"は"T"と1文字で表記されています。