En el post de Arithmos, explico el sistema de selección de diputados mediante el método D’Hont, pero como no, se me ocurrió crear el sistema bajo C# y ahí va.
public class CongresoDiputados { public CongresoDiputados() { Circunscripciones = new List(); PartidosCircunscripciones = new List(); PartidosCongreso = new List(); } public List Circunscripciones { get; set; } public List PartidosCircunscripciones { get; set; } public List PartidosCongreso { get; set; } public void Update(List circunscripciones) { Circunscripciones = circunscripciones; circunscripciones.ForEach(c => PartidosCircunscripciones.AddRange(c.PartidosCircunscripcion)); PartidosCongreso = (from u in PartidosCircunscripciones group u by u.Nombre into newGroup select new PartidoPolitico(newGroup.Key) { DiputadosAsignados = newGroup.Sum(s => s.DiputadosAsignados), NumVotos = newGroup.Sum(s=>s.NumVotos) }).ToList(); } public new string ToString => $"Congreso de los Diputados - Resultado Elecciones\n{PartidosCongreso.Aggregate("", (s, p) => s + p.ToString)}"; } public class Circunscripcion { public Circunscripcion(string nombre, int diputados) { NombreCircunscripcion = nombre; Diputados = diputados; PartidosCircunscripcion = new List(); } public string NombreCircunscripcion { get; set; } public int Diputados { get; set; } public List PartidosCircunscripcion { get; set; } public void Update(List partidos) { partidos.ForEach(p => Update(p)); } public void Update(PartidoPolitico partido) { partido.Cociente = Diputados; if (PartidosCircunscripcion.Contains(partido)) { PartidosCircunscripcion.Where(p => p.Nombre == partido.Nombre).FirstOrDefault().NumVotos = partido.NumVotos; } else { PartidosCircunscripcion.Add(partido); } var list = new List(); PartidosCircunscripcion.ForEach(k => list.AddRange(k.Distribuciones)); var listaOrdenada= list .OrderByDescending(v => v.ParticionVotos) .Take(Diputados); PartidosCircunscripcion.ForEach(k => k.DiputadosAsignados = listaOrdenada.Where(p => p.Nombre == k.Nombre).Count()); } public new string ToString => $"{PartidosCircunscripcion.Aggregate("", (s, p) => s + p.ToString)}"; } public class PartidoPolitico { public PartidoPolitico(string nombre) : this(nombre, 0) { } public PartidoPolitico(string nombre, int numVotos) { Nombre = nombre.PadRight(10,' '); NumVotos = numVotos; } public string Nombre { get; set; } public int NumVotos { get; set; } public int Cociente { get; set; } = 10; public int DiputadosAsignados { get; set; } public List Distribuciones { get { var l = new List(); l.AddRange(Enumerable.Range(1, Cociente).ToList().Select(n => new Distribucion(Nombre, NumVotos / n)).ToList()); return l; } } public new string ToString => $"{Nombre}\t{NumVotos} Votos\t\tDiputados:\t{DiputadosAsignados}\n"; } public class Distribucion { public Distribucion(string nombre, int votos) { Nombre = nombre; ParticionVotos = votos; } public string Nombre { get; set; } public int ParticionVotos { get; set; } }
He incluido alguno de los resultados de las elecciones del 10N del 2019 y he aquí los resultados
class Program { static void Main(string[] args) { Circunscripcion Malaga = new Circunscripcion("Málaga", 11); Malaga.Update(new List() { new PartidoPolitico("PSOE", 225344), new PartidoPolitico("PP", 162467), new PartidoPolitico("Vox", 161657), new PartidoPolitico("UP", 96988), new PartidoPolitico("Cs", 66524)}); Console.WriteLine(Malaga.ToString); Circunscripcion Madrid = new Circunscripcion("Madrid", 37); Madrid.Update(new List() { new PartidoPolitico("PSOE", 948751), new PartidoPolitico("PP", 879667), new PartidoPolitico("Vox", 647924), new PartidoPolitico("UP", 459030), new PartidoPolitico("Cs", 316310), new PartidoPolitico("Mas Pais", 199172) }); Console.WriteLine(Madrid.ToString); CongresoDiputados Congreso = new CongresoDiputados(); Congreso.Update(new List() { Malaga, Madrid }); Console.WriteLine(Congreso.ToString); Console.Read(); } }
PSOE 225344 Votos Diputados: 4
PP 162467 Votos Diputados: 3
Vox 161657 Votos Diputados: 2
UP 96988 Votos Diputados: 1
Cs 66524 Votos Diputados: 1
PSOE 948751 Votos Diputados: 10
PP 879667 Votos Diputados: 10
Vox 647924 Votos Diputados: 7
UP 459030 Votos Diputados: 5
Cs 316310 Votos Diputados: 3
Mas Pais 199172 Votos Diputados: 2
Congreso de los Diputados - Resultado Elecciones
PSOE 1174095 Votos Diputados: 14
PP 1042134 Votos Diputados: 13
Vox 809581 Votos Diputados: 9
UP 556018 Votos Diputados: 6
Cs 382834 Votos Diputados: 4
Mas Pais 199172 Votos Diputados: 2
Como siempre, el código mejorable.
Muy buen post, me lo copio.
Me gustaMe gusta