忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2024/11/23 08:32 |
PHP5.5.0 「第1回オフラインリアルタイムどう書くの参考問題」をPHPで解く
http://qiita.com/Nabetani/items/cbc3af152ee3f50a822f

ポーカーの役を求めます。
集計する対象はワンペア、ツーペア、スリーカード、フォーカード、フルハウス。
つまりスートは一切無視してよいということです。
<?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分程度。


「オフラインリアルタイムどう書く」の一覧

PR


2013/09/30 23:41 | Comments(0) | PHP

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<デッドアイランド ZOTY脱出記 23日目 | HOME | 買ったものリスト 2013/09/29>>
忍者ブログ[PR]