d'Hondt方式

なんかよく分からないけれども、d'Hondt方式を組む流れらしい。
http://d.hatena.ne.jp/flappphys/20050912#p3

dHondt len xs = map (\(a,b)->(a,length $ findIndices (\(_,z) -> a==z) sorted)) xs
  where sorted = take len $ foldl1 merge $ map (\(name,b)->(map (\f->(f b, name)) (map (flip (/)) [1..]))) xs

merge (x:xs) (y:ys) | x >  y = x: merge xs (y:ys)
                    | x == y = x: y: merge xs ys
                    | x <  y = y: merge (x:xs) ys

> dHondt 10 [("c",1500), ("c++",700), ("java", 300), ("lisp", 200)]
[("c",6),("c++",3),("java",1),("lisp",0)]

とっても高階で、無限リストをさらっと使っていて、foldl1 merge あたりは洒落ているかなと思うけど、それ以外は美しくないコードですね。特にその無理やり接いだみたいなクロージャ。zip,unzipを使えばだいぶ良くなるのかな。 Ord を流用したのも無理があったか。
あ〜、wikiには書いてなかったから組まなかったけども、同点の場合は当選者数が少ないほうからでしたっけ。日能研でやった記憶があります。今だと名前順ですかね。

あ、これ Haskell のコードです。