{"id":1488,"date":"2015-05-26T06:00:06","date_gmt":"2015-05-26T04:00:06","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=1488"},"modified":"2021-04-25T17:12:01","modified_gmt":"2021-04-25T15:12:01","slug":"reparto-de-escanos-por-la-ley-dhont-2015","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/reparto-de-escanos-por-la-ley-dhont-2015\/","title":{"rendered":"Reparto de esca\u00f1os por la ley d&#8217;Hont"},"content":{"rendered":"<p>El <a href=\"http:\/\/bit.ly\/1PHWBSU\">sistema D&#8217;Hondt<\/a> es una f\u00f3rmula electoral, creada por Victor d&#8217;Hondt, que permite obtener el n\u00famero de cargos electos asignados a las candidaturas, en proporci\u00f3n a los votos conseguidos.<\/p>\n<p>Tras el recuento de los votos, se calcula una serie de divisores para cada partido. La f\u00f3rmula de los divisores es V\/N, donde V representa el n\u00famero total de votos recibidos por el partido, y N representa cada uno de los n\u00fameros enteros desde 1 hasta el n\u00famero de cargos electos de la circunscripci\u00f3n objeto de escrutinio. Una vez realizadas las divisiones de los votos de cada partido por cada uno de los divisores desde 1 hasta N, la asignaci\u00f3n de cargos electos se hace ordenando los cocientes de las divisiones de mayor a menor y asignando a cada uno un esca\u00f1o hasta que \u00e9stos se agoten<\/p>\n<p>Definir la funci\u00f3n<\/p>\n<pre lang=\"text\">\n   reparto :: Int -> [Int] -> [(Int,Int)]\n<\/pre>\n<p>tal que (reparto n vs) es la lista de los pares formados por los n\u00fameros de los partidos y el n\u00famero de esca\u00f1o que les corresponden al repartir n esca\u00f1os en funci\u00f3n de la lista de sus votos. Por ejemplo,<\/p>\n<pre lang=\"text\">\n   ghci> reparto 7 [340000,280000,160000,60000,15000]\n   [(1,3),(2,3),(3,1)]\n   ghci> reparto 21 [391000,311000,184000,73000,27000,12000,2000]\n   [(1,9),(2,7),(3,4),(4,1)]\n<\/pre>\n<p>es decir, en el primer ejemplo,<\/p>\n<ul>\n<li>al 1\u00ba partido (que obtuvo 340000 votos) le corresponden 3 esca\u00f1os, <\/li>\n<li>al 2\u00ba partido (que obtuvo 280000 votos) le corresponden 3 esca\u00f1os,  <\/li>\n<li>al 3\u00ba partido (que obtuvo 160000 votos) le corresponden 1 esca\u00f1o. <\/li>\n<\/ul>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport Data.List (sort, group)\n\n-- Para los ejemplos que siguen, se usar\u00e1 la siguiente ditribuci\u00f3n de\n-- votos entre 5 partidos.\nejVotos :: [Int]\nejVotos = [340000,280000,160000,60000,15000]\n\nejVotos2 :: [Int]\nejVotos2 = [391000,311000,184000,73000,27000,12000,2000]\n\n-- ghci> reparto 21 ejVotos2\n-- [(1,9),(2,7),(3,4),(4,1)]\n\nejVotos3 :: [Int]\nejVotos3 = [221,195,40,6,4]\n\n-- (votosPartidos vs) es la lista con los pares formados por los votos y\n-- el n\u00famero de cada partido. Por ejemplo, \n--    ghci> votosPartidos ejVotos\n--    [(340000,1),(280000,2),(160000,3),(60000,4),(15000,5)]\nvotosPartidos :: [Int] -> [(Int,Int)]\nvotosPartidos vs = zip vs [1..]\n\n-- (restos n (x,i)) es la lista obtenidas dividiendo n entre 1, 2,..., n.\n-- Por ejemplo, \n--    ghci> restos 5 (340000,1)\n--    [(340000,1),(170000,1),(113333,1),(85000,1),(68000,1)]\nrestos :: Int -> (Int,Int) -> [(Int,Int)]\nrestos n (x,i) = [(x `div` k,i) | k <- [1..n]]\n\n-- (reparto1 n vs) es la lista formada por los n restos mayores\n-- correspondientes a la lista de votos vs. Por ejemplo,\n--    ghci> reparto1 7 ejVotos\n--    [(340000,1),(280000,2),(170000,1),(160000,3),(140000,2),(113333,1),\n--     (93333,2)]\nreparto1 :: Int -> [Int] -> [(Int,Int)]\nreparto1 n vs = \n    take n $ reverse $ sort (concatMap (restos n) (votosPartidos vs))\n\n-- (reparto2 n vs) es el n\u00famero de los partidos, cuyos votos son vs, que\n-- obtienen los n esca\u00f1os. Por ejemplo,\n--    ghci> reparto2 7 ejVotos\n--    [1,2,1,3,2,1,2]\nreparto2 :: Int -> [Int] -> [Int]\nreparto2 n vs = map snd (reparto1 n vs)\n\n-- (reparto n vs) es la lista de los pares formados por los n\u00fameros de\n-- los partidos y el n\u00famero de esca\u00f1o que les corresponden al repartir n\n-- esca\u00f1os en funci\u00f3n de la lista de sus votos. Por ejemplo, \n--    ghci> reparto 7 ejVotos\n--    [(1,3),(2,3),(3,1)]\nreparto :: Int -> [Int] -> [(Int,Int)]\nreparto n vs = \n    [(x,1 + length xs) | (x:xs) <- group (sort (reparto2 n vs))] \n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>El sistema D&#8217;Hondt es una f\u00f3rmula electoral, creada por Victor d&#8217;Hondt, que permite obtener el n\u00famero de cargos electos asignados a las candidaturas, en proporci\u00f3n a los votos conseguidos. Tras el recuento de los votos, se calcula una serie de divisores para cada partido. La f\u00f3rmula de los divisores es V\/N, donde V representa el&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"footnotes":"","_jetpack_memberships_contains_paid_content":false},"categories":[7],"tags":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/1488"}],"collection":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/comments?post=1488"}],"version-history":[{"count":3,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/1488\/revisions"}],"predecessor-version":[{"id":1512,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/1488\/revisions\/1512"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=1488"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=1488"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=1488"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}