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"
        )
*/