summaryrefslogtreecommitdiff
path: root/scheduling/Main.hs
blob: e08d17108586f842c1512eb5d0e9429ac752afba (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import Control.Monad (forM_)
data Player = Player { name :: String
                     , rank :: Int
                     , matchLimit :: Int
                     } deriving (Show, Eq)

players :: [Player]
players = [ Player "orbekk" (-1) 4
          , Player "ltsang" (-4) 4
          , Player "sebh" 2 4
          , Player "fringd" (-1) 4
          , Player "sheyrax" (-2) 2
          ]

remove :: Eq a => a -> [a] -> [a]
remove p = filter (/=p)

matchPlayers :: [Player] -> [Player] -> ([Player], [(Player, Player)])
matchPlayers [] qs = (qs, [])
matchPlayers ps [] = (ps, [])
matchPlayers (p:ps) (q:qs)
  | p == q    = matchPlayers (p:ps) qs
  | otherwise = ([p', q'] ++ s', (p, q) : m')
      where p' = p { matchLimit = matchLimit p - 1 }
            q' = q { matchLimit = matchLimit q - 1 }
            (s', m') = matchPlayers (remove q ps) (remove p qs)

main = do
  let (players', matches) = matchPlayers players players
  print players'
  forM_ matches $ \(p, q) ->
    putStrLn ((name p) ++ " vs. " ++ (name q))