Project Euler にチャレンジ:Problem 54 PHPでの解答

← Problem 53  Problem 55 →
以下のプログラムで読み込んだ手札の試合の勝敗を付けることができてしまったので、
ここで打ち止め。同じ値のツーペアとか2人そろってフラッシュとか、プログラムがめんどい手札がなかった。
<?php
// ストレートが11,12,13,A,2 がOKなのか、A,2,3,4,5がOKなのか何も書かれていないので、どちらも考慮しない方向で考える。
// 2 -> A だけを考える。

$file = file_get_contents("problem54.txt");
$answer = 0;
$tmp = explode("\n",trim($file));

// 適当にポイントを付ける。
// ロイヤルストレートフラッシュ 9
// ストレートフラッシュ 8
// フォーカード 7
// フルハウス   6
// フラッシュ   5
// ストレート   4
// スリーカード 3
// ツーペア     2
// ワンペア     1
// ハイカード   0

foreach($tmp as $v)
{
	$tmp2 = explode(" ",$v);
	$user = array();
	for($i = 0 ; $i < 10 ; $i++)
	{
		$tmp3 = substr($tmp2[$i],0,1);
		$tmp4 = substr($tmp2[$i],1,1);
		if($tmp3 == 'T'){
			@$user[(int)($i / 5)]['num']['10']++;
		}
		else if($tmp3 == 'J'){
			@$user[(int)($i / 5)]['num']['11']++;
		}
		else if($tmp3 == 'Q'){
			@$user[(int)($i / 5)]['num']['12']++;
		}
		else if($tmp3 == 'K'){
			@$user[(int)($i / 5)]['num']['13']++;
		}
		else if($tmp3 == 'A'){
			@$user[(int)($i / 5)]['num']['14']++;
		}
		else{
			@$user[(int)($i / 5)]['num'][$tmp3]++;
		}
		
		@$user[(int)($i / 5)]['mark'][$tmp4]++;
	}
	// user0 と user1 をチェック
	for($i = 0 ; $i < 2 ; $i++)
	{
		$max = max(array_keys($user[$i]['num']));
		// ロイヤルストレートフラッシュ・ストレートフラッシュ・フラッシュか否かを判定
		if(array_search(5,$user[$i]['mark']) !== false)
		{
			if(@$user[$i]['num'][$max - 1] == 1 and @$user[$i]['num'][$max - 2] == 1 and @$user[$i]['num'][$max - 3] == 1 and @$user[$i]['num'][$max - 4] == 1)
			{
				// ロイヤルストレートフラッシュ
				if($max == 14)
				{
					@$user[$i]['point'] = 9;
				}
				// ストレートフラッシュ
				else
				{
					@$user[$i]['point'] = 8;
				}
			}
			else
			{
				// フラッシュ確定
				@$user[$i]['point'] = 5;
			}
		}
		
		$tmp5 = array_count_values($user[$i]['num']);

		// フォーカードか否かを調査
		if(@$tmp5['4'] == 1)
		{
			@$user[$i]['point'] = 7;
		}
		// フルハウス・スリーカードか否かを調査
		else if(@$tmp5['3'] == 1)
		{
			if(@$tmp5['2'] == 1)
			{
				@$user[$i]['point'] = 6;
			}
			else
			{
				@$user[$i]['point'] = 3;
			}
		}
		// ワンペア・ツーペアか否かを調査
		else if(@$tmp5['2'] == 2)
		{
			@$user[$i]['point'] = 2;
		}
		else if(@$tmp5['2'] == 1)
		{
			@$user[$i]['point'] = 1;
		}
		// ストレートか否かを調査
		else if(@$user[$i]['num'][$max - 1] == 1 and @$user[$i]['num'][$max - 2] == 1 and @$user[$i]['num'][$max - 3] == 1 and @$user[$i]['num'][$max - 4] == 1)
		{
			@$user[$i]['point'] = 4;
		}
		else
		{
			@$user[$i]['point'] = 0;
		}
	}
	// user0 と user1 の役を比較
	if($user[0]['point'] > $user[1]['point'] )
	{
		$answer++;
	}
	else if($user[0]['point'] == $user[1]['point'])
	{
		// どっちもブタなら大きな数字
		if($user[0]['point'] == 0 and max(array_keys($user[0]['num'])) > max(array_keys($user[1]['num'])))
		{
			$answer++;
		}
		else if($user[0]['point'] == 1 and array_search(2,$user[0]['num']) > array_search(2,$user[1]['num']))
		{
			$answer++;
		}
	}
}
echo $answer."\n";

?>
問題文