Skip to content

Instantly share code, notes, and snippets.

@uhyo
Created October 1, 2013 08:07
Show Gist options
  • Save uhyo/6775234 to your computer and use it in GitHub Desktop.
Save uhyo/6775234 to your computer and use it in GitHub Desktop.
jinrou2
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