Last active
December 20, 2015 14:49
-
-
Save fddcddhdd/6149919 to your computer and use it in GitHub Desktop.
第一回ギークハウスプログラムコンテスト【8/4開催】で作ったプログラムhttps://www.facebook.com/events/206583066132014/?hc_location=stream
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
// 問題: | |
// プログラム引数で与えられる5枚のカード情報から、その5枚を用いて出来る一番強いポーカーの役を判定して出力せよ(*1)(*2)。 | |
// プログラム引数は以下のように与えられる。 | |
// $ prog Ac Th Kd 3h As | |
// カード情報について(*3)(*4)(*5) | |
// 1文字目:数値 (A:エース 2〜9:数字 T:10 J:11 Q:12 K:13) | |
// 2文字目:スート(s:スペード h:ハート d:ダイヤ c:クローバー) | |
// ポーカー役の強さの順番と出力値、それに対応する入力例 | |
// 1:straight flash (As Ks Qs Js Ts) (*6) | |
// 2:four of a kind (7s 7h 7d 7c As) | |
// 3:full house (Ts Th Td 7c 7d) | |
// 4:flush (Ad 4d 5d Jd Kd) | |
// 5:straight (2s 3h 4s 5d 6c) | |
// 6:three of a kind (9s 9h 9d Ts 3s) | |
// 7:two pair (Ts Th 2c 2h 5d) | |
// 8:one pair (2s 2d 5c 6d 9c) | |
// 9:high cards (Ah Jc 5d 4s 9c) | |
// *1 入力が「As Ks Qs Js Ts」のとき、「straight flash\n」と出力すること | |
// *2 標準入力からの入力内容は無し | |
// *3 カード情報は特に決まった順番はなく、ランダムに与えられる | |
// *4 大文字・小文字は例示の通り与えられる | |
// *5 ジョーカーは無い | |
// *6 T J Q K A はストレートになるが、J Q K A 2 はストレートにならない | |
// 全ての役の判定実装が間に合わない場合、部分的に実装して「○番と○番以外は判定できます」という申告もアリ。 | |
// 追加問題: | |
// テキサスホールデムの役判定を行え。 | |
// 7枚分のカード情報が与えられるので、そのうち任意の5枚を用いて作られる最高の役を判定して出力せよ。 | |
// (プログラムは上記5枚バージョンとは別に作成してください) | |
// 参考: | |
// "straight flash" | |
// "four of a kind" | |
// "full house" | |
// "flush" | |
// "straight" | |
// "three of a kind" | |
// "two pair" | |
// "one pair" | |
// "high cards" | |
//引数から変数に格納 | |
for($i=0; $i<5; $i++){ | |
$data[$i] = $argv[$i+1]; | |
} | |
//カードの数とスートを切り出して、2次元配列に入れる。 | |
for($i=0; $i<5; $i++){ | |
//文字->数字に変換 | |
if(substr($data[$i],0,1)=="A"){ $card_num[$i]=1;} | |
elseif(substr($data[$i],0,1)=="T"){ $card_num[$i]=10;} | |
elseif(substr($data[$i],0,1)=="J"){ $card_num[$i]=11;} | |
elseif(substr($data[$i],0,1)=="Q"){ $card_num[$i]=12;} | |
elseif(substr($data[$i],0,1)=="K"){ $card_num[$i]=13;} | |
else{$card_num[$i]=substr($data[$i],0,1);} | |
//スート | |
$card_suit[$i] = substr($data[$i],1,1); | |
} | |
//数字でソート(最初の配列の中身でソートされる。二番目の配列も一緒にくっついてくる) | |
array_multisort($card_num, $card_suit); | |
//print_r($card_num); | |
//print_r($card_suit); | |
//ストレート判定 | |
$straight_flag = 0; | |
for($i=0; $i<4; $i++){ //5枚目は比較しない! | |
//A,T, J,Q,Kの場合 | |
if($card_num[0]==1 && | |
$card_num[1]==10 && | |
$card_num[2]==11 && | |
$card_num[3]==12 && | |
$card_num[4]==13){ | |
$straight_flag = 1; | |
}elseif($card_num[$i] == ($card_num[$i+1]-1)){ | |
$straight_flag = 1; | |
}else{ | |
$straight_flag = 0; | |
break ; | |
} | |
} | |
//フラッシュ判定 | |
$flush_flag = 0; | |
$base_suit = $card_suit[0]; | |
for($i=1; $i<5; $i++){ | |
if($base_suit == $card_suit[$i]){ | |
$flush_flag = 1; | |
}else{ | |
$flush_flag = 0; | |
break; | |
} | |
} | |
//ペア数カウント変数 | |
$four_card_flag = 0; | |
$tree_card_flag = 0; | |
$pair_card_count = 0; | |
//配列内にある重複した値と数を、配列で返してくれる関数 | |
$card_pair = array_count_values($card_num); | |
//1-13の数字で重なっている数を数える | |
for($i=1; $i<=13; $i++){ | |
if($card_pair[$i] == 4){ //4カード | |
$four_card_flag = 1; | |
} | |
if($card_pair[$i] == 3){ //3カード | |
$tree_card_flag = 1; | |
} | |
if($card_pair[$i] == 2){ //ペア数をカウント | |
$pair_card_count = $pair_card_count+1; | |
} | |
} | |
//フラグを使って判定&表示する。 | |
if($straight_flag ==1 && $flush_flag==1){ | |
$disp = "straight flush" ; | |
}elseif($four_card_flag==1){ | |
$disp = "four of a kind"; | |
}elseif($tree_card_flag ==1 && $pair_card_count==1){ | |
$disp = "full house"; | |
}elseif($flush_flag==1){ | |
$disp = "flush"; | |
}elseif($straight_flag==1){ | |
$disp = "straight"; | |
}elseif($tree_card_flag==1){ | |
$disp = "tree of a kind"; | |
}elseif($pair_card_count==2){ | |
$disp = "two pair"; | |
}elseif($pair_card_count==1){ | |
$disp = "one pair"; | |
}else{ | |
$disp = "high card"; | |
} | |
//表示して終わり | |
echo $disp . PHP_EOL; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment