summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKjetil Orbekk <kjetil.orbekk@gmail.com>2015-07-29 16:19:24 -0400
committerKjetil Orbekk <kjetil.orbekk@gmail.com>2015-07-29 16:19:24 -0400
commite29c4ddc7315b60885ff85689a811780e82312f3 (patch)
tree1dbee7c60b653f586479400fada0046c2a479997
parentb3f01c9dfa4b27d74183769f3d257f9e506cdf83 (diff)
Placeholder matching algorithm.
-rw-r--r--scheduling/Main.hs32
1 files changed, 32 insertions, 0 deletions
diff --git a/scheduling/Main.hs b/scheduling/Main.hs
new file mode 100644
index 0000000..e08d171
--- /dev/null
+++ b/scheduling/Main.hs
@@ -0,0 +1,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))