wahl.pl
#!/usr/bin/perl -w
use strict;
use Data::Dumper;
my @parteien = qw(CSU SPD FW GRUENE FDP AFD);
my %wahlkreise = (
Oberbayern => {
CSU => 1595380,
SPD => 443344,
FW => 494399,
GRUENE => 1054749,
FDP => 302764,
AFD => 405338
},
Niederbayern => {
CSU => 490741,
SPD => 81589,
FW => 230013,
GRUENE => 136499,
FDP => 60634,
AFD => 172871
},
Oberpfalz => {
CSU => 489389,
SPD => 117771,
FW => 172690,
GRUENE => 152194,
FDP => 43921,
AFD => 151268
},
Oberfranken => {
CSU => 470782,
SPD => 160315,
FW => 129713,
GRUENE => 154812,
FDP => 50019,
AFD => 132233
},
Mittelfranken => {
CSU => 680886,
SPD => 215660,
FW => 155723,
GRUENE => 335207,
FDP => 74962,
AFD => 171744
},
Unterfranken => {
CSU => 598078,
SPD => 145938,
FW => 132464,
GRUENE => 235163,
FDP => 69830,
AFD => 141815
},
Schwaben => {
CSU => 720217,
SPD => 144371,
FW => 257444,
GRUENE => 323510,
FDP => 88288,
AFD => 213047
}
);
my %direktmandate = (
Oberbayern => {
# CSU => 26,
# GRUENE => 5
CSU => 31,
GRUENE => 0
},
Niederbayern => {
CSU => 9
},
Oberpfalz => {
CSU => 8
},
Oberfranken => {
CSU => 8
},
Mittelfranken => {
CSU => 12
},
Unterfranken => {
# CSU => 9,
# GRUENE => 1
CSU => 10,
GRUENE => 0
},
Schwaben => {
CSU => 13
}
);
my %wksitze = (
Oberbayern => 61,
Niederbayern=> 18,
Oberpfalz => 16,
Oberfranken => 16,
Mittelfranken => 24,
Unterfranken => 19,
Schwaben => 26
);
my %gesamtstimmen = (CSU => 0, SPD => 0, FW => 0, GRUENE => 0, FDP => 0, AFD => 0);
my %gesamtsitze = %gesamtstimmen;
my %gesamtdirekt = %gesamtstimmen;
my $allesitze = 0;
foreach my $wk(keys %wahlkreise) {
# print "$wk\n";
my $wkverteilung = &reste($wksitze{$wk}, $wahlkreise{$wk});
my $mitueberhang = $wksitze{$wk};
while (not &genug($wkverteilung, $direktmandate{$wk})) {
++$mitueberhang;
$wkverteilung = &reste($mitueberhang, $wahlkreise{$wk});
}
foreach my $partei(@parteien) {
$gesamtstimmen{$partei} += $wahlkreise{$wk}->{$partei};
$gesamtsitze{$partei} += $wkverteilung->{$partei};
if (defined $direktmandate{$wk}->{$partei}) {
$gesamtdirekt{$partei} += $direktmandate{$wk}->{$partei};
}
$allesitze += $wkverteilung->{$partei};
# print "\t$partei\t$wkverteilung->{$partei}\n";
}
# print "\n";
}
print "\nSumme: $allesitze\n";
foreach my $partei(@parteien) {
print "$partei: \t$gesamtsitze{$partei} \t", $gesamtsitze{$partei} / $allesitze, "\n";
}
print "\nOhne Bezirke: ";
$allesitze = &hsum(\%wksitze);
my $ohneb = &reste($allesitze, \%gesamtstimmen);
while (not &genug($ohneb, \%gesamtdirekt)) {
++$allesitze;
$ohneb = &reste($allesitze, \%gesamtstimmen);
}
print "$allesitze\n";
foreach my $partei(@parteien) {
print "$partei: \t$ohneb->{$partei} \t", $ohneb->{$partei} / $allesitze, "\n";
}
sub reste{
my ($n, $stimmen) = @_;
# printf dumper($stimmen);
my $t = 0;
foreach my $partei(@parteien) {
$t += $stimmen->{$partei};
}
my $sganze = 0;
my (%sitze, %rest);
foreach my $partei(@parteien) {
my $sitzanteil = $n * $stimmen->{$partei} / $t;
$sganze += ($sitze{$partei} = int($sitzanteil));
$rest{$partei} = $sitzanteil - int($sitzanteil);
}
foreach my $partei(sort {$rest{$b} <=> $rest{$a}} keys %rest) {
++$sitze{$partei};
++$sganze;
last if $sganze == $n;
}
return(\%sitze);
}
sub genug {
my ($sitze, $direkt) = @_;
foreach my $partei(keys %{$direkt}) {
return 0 if $sitze->{$partei} < $direkt->{$partei};
}
return 1;
}
sub hsum {
my $h = shift;
my $total = 0;
foreach (keys %{$h}) {
$total += $h->{$_};
}
return $total;
}
Generated by GNU Enscript 1.6.6.