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