diff options
author | Determinant <ted.sybil@gmail.com> | 2017-06-08 13:51:43 -0400 |
---|---|---|
committer | Determinant <ted.sybil@gmail.com> | 2017-06-08 13:51:43 -0400 |
commit | 569664d524e4772342752f863778fe2c869a822a (patch) | |
tree | 99cde922b6b0e06b8a7637bc9ef09f46af0f49e8 /90-94/92.hs | |
parent | 2da9fcf44fb1e403860535e8b165434036d50540 (diff) |
finish vol 10
Diffstat (limited to '90-94/92.hs')
-rw-r--r-- | 90-94/92.hs | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/90-94/92.hs b/90-94/92.hs new file mode 100644 index 0000000..0f6f7a0 --- /dev/null +++ b/90-94/92.hs @@ -0,0 +1,24 @@ +import Data.List (sortBy) +import Data.Ord (comparing) + +vonKoch :: [(Int, Int)] -> [[(Int, Int)]] + +vonKoch edges = koch (reverse adj) [] [] [] + where koch [] _ _ vplan = return vplan + koch ((v, us):vs) eused vused vplan = + do (vn, eused') <- [(x, eused') + | x <- [1..maxvn], + x `notElem` vused, + let en = map (abs . (x-)) (map (findn vplan) us), + let (eused', f) = foldl (\(l, f) d -> + (d:l, f && d `notElem` l + && 1 <= d && d <= maxen)) + (eused, True) en, f] + koch vs eused' (vn:vused) ((v, vn):vplan) + maxen = length edges + maxvn = maxen + 1 + deg x = length $ filter (\(a, b) -> a == x || b == x) edges + genAdj [] = [] + genAdj (v:vs) = (v, [u | u <- vs, (v, u) `elem` edges || (u, v) `elem` edges]):genAdj vs + findn vplan u = snd $ head $ filter ((== u) . fst) vplan + adj = genAdj $ sortBy (comparing deg) [1..maxvn] |