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 のコードです。