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.