ポーカーの役を求めます。
集計する対象はワンペア、ツーペア、スリーカード、フォーカード、フルハウス。
つまりスートは一切無視してよいということです。
<?php
class POKER{
// 役
private $roles = [
'4K'=>[4, 1],
'FH'=>[3, 2],
'3K'=>[3, 1, 1],
'2P'=>[2, 2, 1],
'1P'=>[2, 1, 1, 1],
];
/**
* ポーカー
* @param String 「D3C3C10D10S3」みたいな文字列
* @return String 「FH」みたいな文字列
*/
public function get($input){
// 値をカウント
$cards = array_count_values(explode('-', trim( str_replace(['S', 'H', 'D', 'C'], '-', $input), '-')));
rsort($cards);
// 同じ役があるか確認
foreach($this->roles as $key=>$val){
if($cards === $val){
return $key;
}
}
// なかった
return '--';
}
}
// テスト
$test = [
['D3C3C10D10S3', 'FH'],
['S8D10HJS10CJ', '2P'],
['DASAD10CAHA', '4K'],
['S10HJDJCJSJ', '4K'],
['S10HAD10DAC10', 'FH'],
['HJDJC3SJS3', 'FH'],
['S3S4H3D3DA', '3K'],
['S2HADKCKSK', '3K'],
['SASJDACJS10', '2P'],
['S2S10H10HKD2', '2P'],
['CKH10D10H3HJ', '1P'],
['C3D3S10SKS2', '1P'],
['S3SJDAC10SQ', '--'],
['C3C9SAS10D2', '--'],
];
$poker = new POKER();
foreach($test as $key=>$data){
$answer = $poker->get($data[0]);
if($answer !== $data[1]){
print('えらー');
}
}
数字ごとの枚数に一切ぶれがないため、===で簡単にマッチング可能です。
これまでで一番簡単だった気がします。
かかった時間は20分程度。