{"id":5821,"date":"2020-04-27T07:57:39","date_gmt":"2020-04-27T05:57:39","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=5821"},"modified":"2020-05-05T11:50:43","modified_gmt":"2020-05-05T09:50:43","slug":"reparto-de-escanos-por-la-ley-dhont","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/reparto-de-escanos-por-la-ley-dhont\/","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  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\n-- 1\u00aa soluci\u00f3n\n-- ===========\n\nreparto :: Int -> [Int] -> [(Int,Int)]\nreparto n vs = \n  [(x,1 + length xs) | (x:xs) <- group (sort (repartoAux n vs))] \n\n-- (repartoAux n vs) es el n\u00famero de los partidos, cuyos votos son vs, que\n-- obtienen los n esca\u00f1os. Por ejemplo,\n--    ghci> repartoAux 7 ejVotos\n--    [1,2,1,3,2,1,2]\nrepartoAux :: Int -> [Int] -> [Int]\nrepartoAux n vs = map snd (repartoAux' n vs)\n\n-- (repartoAux' n vs) es la lista formada por los n restos mayores\n-- correspondientes a la lista de votos vs. Por ejemplo,\n--    ghci> repartoAux' 7 ejVotos\n--    [(340000,1),(280000,2),(170000,1),(160000,3),(140000,2),(113333,1),\n--     (93333,2)]\nrepartoAux' :: Int -> [Int] -> [(Int,Int)]\nrepartoAux' n vs = \n  take n (reverse (sort (concatMap (restos n) (votosPartidos vs))))\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-- 2\u00aa soluci\u00f3n\n-- ===========\n\nreparto2 :: Int -> [Int] -> [(Int,Int)]\nreparto2 n xs = \n  ( map (\\x -> (head x, length x))  \n  . group  \n  . sort  \n  . map snd  \n  . take n  \n  . reverse  \n  . sort\n  ) [(x `div` i, p) | (x,p) <- zip xs [1..], i <- [1..n]]\n<\/pre>\n<h4>Otras soluciones<\/h4>\n<ul>\n<li>Se pueden escribir otras soluciones en los comentarios.\n<li>El c\u00f3digo se debe escribir entre una l\u00ednea con &#60;pre lang=&quot;haskell&quot;&#62; y otra con &#60;\/pre&#62;\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>El sistema D&#8217;Hondt es una f\u00f3rmula 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 n\u00famero&#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":[4],"tags":[8,58,30,13,28,10,11,32,16,14,47,9],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/5821"}],"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=5821"}],"version-history":[{"count":2,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/5821\/revisions"}],"predecessor-version":[{"id":5852,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/5821\/revisions\/5852"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=5821"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=5821"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=5821"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}