importData.ListasListhand::String->(String,Bool)handcards=(casekindsof[1,4]->"Four of a kind"[2,3]->"Full house"[1,1,3]->"Three of a kind"[1,2,2]->"Two pair"[1,1,1,2]->"One pair"otherwise->caserdiffof[1,1,1,1]|headranks==10&&isFlush->"Royal"|True->"Straight"[1,1,1,9]->"Straight"otherwise->"No pair",isFlush)wheresuits=List.nub[cards!!n|n<-[0,2..8]]isFlush=lengthsuits==1ranks=List.sort[rankToInt$cards!!n|n<-[1,3..9]]rankToIntr=caseList.elemIndexr"23456789TJQKA"ofJustn->n+2kinds=List.sort$maplength$List.groupranksrdiff=zipWith(-)(tailranks)ranksmain=mapMtest["SQSJSASKST","D9D7D6D5D8","C2D2S2H3H2","C2D3S2H3H2","S9S4S8STSJ","C4H7D5S6H3","S6H6C5DQC6","S6HQC5DQC6","S6H4C5DQC6","SJSQSKSAC2"]wheretests=putStrLn(s++" => "++(showHand$hands))showHand("No pair",True)="Flush"showHand(s,True)=s++" flush"showHand(s,False)=s
kozima
#5193()
[
Haskell
]
Rating1/1=1.00
ストレートの判定がなかなかきれいにまとまりませんね。ソートしておいて隣り合う数の差で判断してみましたが……うーん。
Rating1/1=1.00-0+
[ reply ]