2014-07-04 45 views
1

我有一个锦标赛和2d“对手矩阵”的团队的1d列表。哈斯克尔边缘列表邻接矩阵

我只是想为每个团队提取一个对手列表。

我只是在学习Haskell,并且想知道,如果有人能够为下面已经工作的代码想出更优雅的解决方案。 ...也许是一个列表理解? ...

代码:

findOp :: (Eq a, Num a) => [b] -> [a] -> [b] 
findOp (x:xs) (y:ys) | y == 1 = [x] ++ findOp xs ys 
        | otherwise = findOp xs ys 

findOp [] [] = [] 

tab = [[0,1,0,1], 
     [1,0,1,0], 
     [0,1,0,1], 
     [1,0,1,0]] 

teams = ["team a", 
     "team b", 
     "team c", 
     "team d" ] 

main :: IO() 
main = do 
     let games = map (\x -> (fst x, findOp teams $ snd x)) $ zip teams tab 
     putStrLn $ show games 

结果:

[("team a",["team b","team d"]),("team b",["team a","team c"]),("team c",["team b","team d"]),("team d",["team a","team c"])] 
+1

...也许有人找到一个更好的问题标题! – st0ne

+1

你的“数组”是*列表*,你可以举一个简单的例子来说明你想在这里做什么?什么是*绘制*矩阵?这与球队和对手有什么联系? – Carsten

+0

这是一个图形问题,并且很简单,使用列表并不完全愚蠢 - 例如,没有随机访问。 – Carl

回答

5

无论如何,假定这将让即将迁移,这里是一个答案:

tab = [[0,1,0,1], 
     [1,0,1,0], 
     [0,1,0,1], 
     [1,0,1,0]] 

teams = ["team a", 
     "team b", 
     "team c", 
     "team d" ] 

main = do 
    let matches = zip teams . map (map fst . filter ((== 1) . snd) . zip teams) $ tab 
    print matches 

的关键的洞察力从开始。这会为您提供矩阵内的团队名称以及值。从那里,剩下的就是简单的数据操作 - 并且将三个操作的手动融合映射到每个内部列表。

顺便说一句 - 这实际上是将邻接矩阵转换为边列表的一般问题的一个具体示例。在使用软件中的图表表示时,它是最简单和最基本的操作之一。

+1

Thx ...你可以将标题编辑为有意义的东西吗?我看到你对这类问题很熟悉。 – st0ne