カイジ
論文読むの疲れて息抜きに書いた。
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
適当すぎる笑