Concurrent Clean : あなたならどうお書きになります1.0
[id:Nabetani:20061217:p1]
そっこーで1つ。乱数の使い方に自信が無い。あと、効率もよく考えていない。
module Main import StdEnv, OptEnv, MersenneTwister perm :: [a] -> [[a]] | Eq a perm [] = [[]] perm ls = [[a:ar] \\ a <- ls, ar <- perm (filter (\b = a <> b) ls)] ::Person = Person !Char !Int instance == Person where (==) (Person g1 p1) (Person g2 p2) = g1 == g2 && p1 == p2 allcomb :: [Person] -> [[(Person,Person)]] allcomb ps = filter f $ map (zip2 ps) $ perm ps where f [] = True f [(Person g1 _,Person g2 _):rest] = g1 <> g2 && f rest choice :: [a] -> a choice ls = ls!!(r rem length ls) where r = abs $ genRandInt randSeed!!0 case4 = [Person 'a' 1, Person 'a' 2, Person 'b' 1, Person 'c' 1] case5 = [Person 'a' 1, Person 'a' 2, Person 'b' 1, Person 'c' 1, Person 'd' 1] Start = choice $ allcomb case4 /* Start = (allcomb case4,"\n" ,allcomb case5,"\n" ) */