wvogel日記

自分用の技術備忘録が多めです.

カイジ

論文読むの疲れて息抜きに書いた。

Card.hs

module Card where

data Card = Emperor | Citizen | Slave deriving (Eq,Show)
data Winner = First | Second | Draw deriving (Eq,Show)

cards1 = [Citizen,Citizen,Citizen,Citizen,Emperor]
cards2 = [Citizen,Citizen,Citizen,Citizen,Slave]

buttle :: Card -> Card -> Winner
buttle Emperor Citizen = First
buttle Emperor Slave = Second
buttle Slave Citizen = Second
buttle Slave Emperor = First
buttle Citizen Emperor = Second
buttle Citizen Slave = First
buttle Citizen Citizen = Draw

Main.hs

import Control.Applicative
import Card

type Player = (Int,[Card])

main = do
	(p1,p2) <- game ((0,cards1),(0,cards2))
	putStrLn.show $ winner (fst p1,fst p2)

game :: (Player,Player) -> IO (Player,Player) 
game (p1,p2) = do
	case snd p1 == [] || snd p2 == [] of
		True -> return (p1,p2)
		False -> do
			putStrLn.show $ zip [0..] (snd p1)
			n <- (read <$> getLine :: IO Int)
			game (nextP1 n,nextP2 n)
	where
		nextPt n = point (fst p1,fst p2) (snd p1 !! n `buttle` head (snd p2))
		cards1' n = take n (snd p1) ++ drop (n+1) (snd p1)
		cards2' = tail (snd p2)
		nextP1 n = (fst $ nextPt n,cards1' n)
		nextP2 n = (snd $ nextPt n,cards2')

point :: (Int,Int) -> Winner -> (Int,Int)
point (f,s) First = (f+1,s)
point (f,s) Second = (f,s+1)
point (f,s) Draw = (f,s)

winner :: (Int,Int) -> Winner
winner (f,s)
	| f == s = Draw
	| f > s = First
	| f < s = Second

適当すぎる笑