Created
October 1, 2013 08:07
-
-
Save uhyo/6775234 to your computer and use it in GitHub Desktop.
jinrou2
This file contains hidden or 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
| type Rank = Int | |
| data Jobname = Human | Diviner | Werewolf Rank deriving (Eq,Show) | |
| data State=State Jobname Bool deriving (Show) | |
| type Plid=String | |
| type Pattern = (Plid,State) | |
| -- 配列を一つ抜く | |
| cutoff :: Int -> [a] -> (Maybe a,[a]) | |
| cutoff _ [] = (Nothing,[]) | |
| cutoff n list = case (splitAt n list) of (mae, []) -> (Nothing,mae) | |
| (mae,(nth:ato)) -> (Just nth,concat [mae,ato]) | |
| -- 0,1,...,(n-1)の中からkコ選んだ組み合わせを返す | |
| combi :: Int -> Int -> [[Int]] | |
| combi n k | |
| | k <= 0 = [[]] | |
| | n<=k = [take n [0..]] | |
| -- | otherwise = concat $ map (\i -> map (\x -> i:(map ((i+1)+) x) | |
| -- ) (combi (n-i-1) (k-1))) $ take (n-k+1) [0..] | |
| | otherwise = foldr (\left acc -> | |
| -- 0,1,...,left を消費したので (left+1)...(n-1)から残りの(k-1)個を選んでもらう | |
| let rest = combi (n-left-1) (k-1) | |
| -- 残りの(k-1)個は 0...を(left+1)...に変換する | |
| -- それぞれの先頭にleftをつける | |
| in foldr (\one acc2 -> -- one :: [Int] acc2 :: [[Int]] | |
| (left:(map (left+1+) one)):acc2 | |
| ) acc rest | |
| ) [] $ take (n-k+1) [0..] | |
| makelist :: [Plid] -> [(Jobname,Int)] -> [[Pattern]] | |
| makelist _ [] = [[]] | |
| makelist [] _ = [[]] | |
| makelist plids ((thisjob,num):jobs) = | |
| -- numの分だけplidsからとる(とり方はcombiで列挙) | |
| let coms = combi (length plids) num | |
| in foldr (\poss acc -> -- poss :: [Int] ひとつの取り方 acc::[[Pattern]] | |
| --restplids::[Plid] とった後の残りのplids pats::[Pattern]この取り方でとったときのできたPattern | |
| let (restplids,pats) = foldr (\pos (rest,acc2) -> -- pos::Int; rest::[Plid]; acc2::[Pattern] | |
| -- pos番目のプレイヤーを抜き出す | |
| let (Just plid,cutt) = cutoff pos rest | |
| in (cutt,(plid,State thisjob False):acc2) | |
| ) (plids,[]) poss | |
| in foldr (\rpats acc2 -> | |
| (pats++rpats):acc2 | |
| ) acc $ makelist restplids jobs | |
| ) [] coms | |
| main = let number=24 | |
| plids=map (\num -> "Player" ++ (show num)) [1..number] | |
| jobs=[(Human,19),(Werewolf 1,1),(Werewolf 2,1),(Werewolf 3,1),(Werewolf 4,1),(Diviner,1)] | |
| in print $ length $ makelist plids jobs | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment