Como ando ocioso, voy a dedicar unos minutillos a jugar con los resultados de las últimas elecciones generales españolas, aplicándole distintos métodos de reparto, a ver cuántos escaños se llevaría cada uno. Seguramente ya lo hayan hecho por ahí muchos, pero bueno, así me distraigo.
Los datos los tomo de la página que ha dedicado el Ministerio del Interior a estas elecciones centrándome en el Congreso, que el Senado pinta menos que Gallardón en Génova.
Así han quedado con la ley actual, esto es, con D'Hondt, circunscripciones provinciales y un mínimo de un 3% de los votos válidos por circunscripción.
Código: Seleccionar todo
P.S.O.E. 169
P.P. 154
CiU 10
EAJ-PNV 6
ESQUERRA 3
I.U. 2
B.N.G. 2
CC-PNC 2
UPyD 1
NA-BAI 1
Así quedarían con D'Hondt, circunscripción única y una cota inferior del 3%.
Código: Seleccionar todo
P.S.O.E. 170
P.P. 155
I.U. 14
CiU 11
Con D'Hondt, circunscripción única y sin cota inferior.
Código: Seleccionar todo
P.S.O.E. 162
P.P. 147
I.U. 13
CiU 11
EAJ-PNV 4
UPyD 4
ESQUERRA 4
B.N.G. 3
CC-PNC 2
Con reparto proporcional puro, circunscripción única y una cota inferior del 3%.
Código: Seleccionar todo
P.S.O.E. 169
P.P. 154
I.U. 15
CiU 12
Con reparto proporcional puro, circunscripción única y sin cota inferior.
Código: Seleccionar todo
P.S.O.E. 154
P.P. 140
I.U. 13
CiU 11
EAJ-PNV 4
UPyD 4
ESQUERRA 4
B.N.G. 3
CC-PNC 3
CA 1
NA-BAI 1
EA 1
C's 1
PACMA 1
VERDES 1
PAR 1
CHA 1
NC-CCN 1
LV-GV 1
ARALAR 1
BLOC-IC-EV-EE 1
UPLI 1
PUM+J 1
Mayoritario, circunscripción provincial.
Código: Seleccionar todo
P.S.O.E. 175
P.P. 175
Para los cálculos mediante el método D'Hondt, me he ayudado de un cutrescript en _perl_ que me hecho. Por si alguien lo quiere para hacer el indio un rato, aquí lo dejo.
Código: Seleccionar todo
#!/usr/local/bin/perl
# Propósito: pide al usuario una relación de partidos políticos juno con sus respectivos votos conseguidos y devuelve los escaños que se les asignaría según el método D'Hondt, suponiendo una circunscripción única y un limite inferior en % sobre el total de votos válidos.
use strict;
my $num_partidos = 0; # Número de partidos políticos
my $total_votos_validos = 0; # Número total de votos válidos. Incluye los votos en blanco, pero no los nulos.
my $total_escanios = 350; # Número total de escaños (por ejemplo, hay 350 en el Congreso de los diputados y 111 en la Asamblea de Madrid)
my $limite_inferior = 0.03; # Límite inferior (por ejemplo, para el congreso es del 3% y para la Comunidad de Madrid del 5%)
# Pide el número de escaños
print "Número total de escaños: ";
chop( $total_escanios = <STDIN> );
# Pide el límite mínimo
print "Límite mínimo de votos (en %): ";
chop( $limite_inferior = <STDIN> );
$limite_inferior /= 100; # Se pasa al tanto por uno
# Pide el número de partidos
print "Número de partidos políticos: ";
chop( $num_partidos = <STDIN> );
# Lista de partidos: se inicializa con los votos en blanco, que siempre serán considerados.
my %lista_votos = ( "Blanco" => 0 );
# Va preguntando los nombres y los votos de los partidos.
my $nombre_partido;
my $numero_votos;
for ( my $i = 1; $i <= $num_partidos; $i++ )
{
print "Nombre del partido número $i: ";
chop( $nombre_partido = <STDIN> );
print "Número de votos conseguidos por el partido número $i: ";
chop( $numero_votos = <STDIN> );
$lista_votos{ $nombre_partido } = $numero_votos;
# Acumula el número de votos
$total_votos_validos += $numero_votos;
}
# Pide votos en blanco
print "Número de votos en blanco: ";
chop( $lista_votos{ "Blanco" } = <STDIN> );
$total_votos_validos += $lista_votos{ "Blanco" }; # Acumula número de votos válidos
# Lista de restos: sólo se incluirán los partidos cuyos votos superen el 3%.
my %lista_restos;
my $partido;
foreach $partido ( keys %lista_votos )
{
if ( $lista_votos{ $partido } >= $total_votos_validos * $limite_inferior and $partido ne "Blanco" )
{
# Si el partido supera el 3%, se construye un array de longitud 350 con su lista de restos
for ( my $i = 1; $i <= $total_escanios; $i++ )
{
push( @{ $lista_restos{ $partido } }, $lista_votos{ $partido } / $i );
}
}
}
# Se construye la lista de escaños
my %lista_escanios;
foreach $partido ( keys %lista_restos )
{
$lista_escanios{ $partido } = 0;
}
for ( my $i = 1; $i <= $total_escanios; $i++ )
{
my $mayor_resto = 0;
my $partido_con_mayor_resto;
foreach $partido ( keys %lista_restos )
{
if ( ${@{ $lista_restos{ $partido } } }[0] > $mayor_resto )
{
$mayor_resto = ${@{ $lista_restos{ $partido } } }[0];
$partido_con_mayor_resto = $partido;
}
}
$lista_escanios{ $partido_con_mayor_resto } += 1; # Se le asigna el escaño al partido con mayor resto
shift( @{ $lista_restos{ $partido_con_mayor_resto } }); # Se elimina el resto utilizado
}
# Por último, muestra los escaños por partidos.
foreach $partido ( keys %lista_escanios )
{
print $partido . ": " . $lista_escanios{ $partido } . " escaños\n";
}