chiark
/
gitweb
/
~ian
/
appendix-a6.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
compute-scottish-stv: --sort=alpha
[appendix-a6.git]
/
compute-scottish-stv
diff --git
a/compute-scottish-stv
b/compute-scottish-stv
index e09f1ebcefb4430d7b8299afa0c27b8dcbd4d3e5..81dc6adeafb10d553c50b2153a250a530bfc8966 100755
(executable)
--- a/
compute-scottish-stv
+++ b/
compute-scottish-stv
@@
-31,6
+31,7
@@
our %cands;
our $stage=0;
our $quota;
our %tie;
our $stage=0;
our $quota;
our %tie;
+our @elected;
our $DIGS = 5;
our $F = (new Math::BigRat 10)->bpow($DIGS);
our $DIGS = 5;
our $F = (new Math::BigRat 10)->bpow($DIGS);
@@
-57,6
+58,8
@@
$SIG{__DIE__} = sub {
die $_[0];
};
die $_[0];
};
+sub total_history_cmp ();
+
sub unkopt ($$) {
my ($what,$opt) = @_;
if ($opt =~ m/^[A-Z]/) {
sub unkopt ($$) {
my ($what,$opt) = @_;
if ($opt =~ m/^[A-Z]/) {
@@
-66,6
+69,19
@@
sub unkopt ($$) {
}
}
}
}
+my $display_cmp = \&total_history_cmp;
+
+while (@ARGV && $ARGV[0] =~ m/^\-/) {
+ $_ = shift @ARGV;
+ if (m/^--$/) {
+ last;
+ } elsif (m/^--sort=alpha$/) {
+ $display_cmp = sub { $b->{Cand} cmp $a->{Cand} };
+ } else {
+ die;
+ }
+}
+
for (;;) {
$_ = <>;
if (m/^\| /) {
for (;;) {
$_ = <>;
if (m/^\| /) {
@@
-197,7
+213,7
@@
sub countballots () {
$c->{History}[$stage-1] = $c->{Total};
}
$c->{History}[$stage-1] = $c->{Total};
}
- foreach my $c (reverse sort
total_histor
y_cmp
+ foreach my $c (reverse sort
$displa
y_cmp
grep { !$_->{NonCont} } values %cands) {
prf "candidate %-10s: %s votes\n", $c->{Cand}, sv $c->{Total};
}
grep { !$_->{NonCont} } values %cands) {
prf "candidate %-10s: %s votes\n", $c->{Cand}, sv $c->{Total};
}
@@
-206,8
+222,8
@@
sub countballots () {
sub computequota () {
my $totalvalid = 0/1;
$totalvalid += $_->{Total} foreach values %cands;
sub computequota () {
my $totalvalid = 0/1;
$totalvalid += $_->{Total} foreach values %cands;
- $quota = floor($totalvalid / (1 + $seats));
- prf "
quota %s\n", sv $quota
;
+ $quota = floor($totalvalid / (1 + $seats)
+ 1
);
+ prf "
total valid %s quota %s\n", (sv $totalvalid), (sv $quota)
;
}
sub total_history_cmp () {
}
sub total_history_cmp () {
@@
-288,6
+304,7
@@
sub elect_core ($) {
my ($c) = @_;
prf "*** ELECT %s \`%s' ***\n", $c->{Cand}, $c->{Desc};
$c->{NonCont} = 'Elected';
my ($c) = @_;
prf "*** ELECT %s \`%s' ***\n", $c->{Cand}, $c->{Desc};
$c->{NonCont} = 'Elected';
+ push @elected, $c;
}
$stage = 0;
}
$stage = 0;
@@
-297,8
+314,12
@@
for (;;) {
sortballots @allvotes if $stage == 1;
sortballots @allvotes if $stage == 1;
- my $seats_remain = $seats
- - grep { ($_->{NonCont} // '') eq 'Elected' } values %cands;
+ my $seats_remain = $seats - @elected;
+
+ prf "seats remaining %d\n", $seats_remain;
+
+ last unless $seats_remain;
+
if (continuing() <= $seats_remain) {
foreach my $c (continuing()) {
prf "electing %s to fill remaining place(s)\n", $c->{Cand};
if (continuing() <= $seats_remain) {
foreach my $c (continuing()) {
prf "electing %s to fill remaining place(s)\n", $c->{Cand};
@@
-328,6
+349,8
@@
for (;;) {
next;
}
next;
}
+ last if $seats_remain == 1; # don't bother doing more transfers
+
my $B = $c->{Total};
my %tspr;
my $B = $c->{Total};
my %tspr;
@@
-348,7
+371,7
@@
for (;;) {
die unless $tspr{"@$previously"} == $xfervalue;
} else {
$tspr{"@$previously"} = $xfervalue;
die unless $tspr{"@$previously"} == $xfervalue;
} else {
$tspr{"@$previously"} = $xfervalue;
- prf "transfer value of ballots %s: %s\n",
+ prf "transfer value of ballots %
20
s: %s\n",
"@$previously", sv $xfervalue;
}
}
"@$previously", sv $xfervalue;
}
}
@@
-375,4
+398,11
@@
for (;;) {
die;
}
die;
}
-print "done.\n";
+print "Winners:\n";
+
+foreach my $i (0..$#elected) {
+ my $c = $elected[$i];
+ printf " %3d. %-10s %s\n", $i+1, $c->{Cand}, $c->{Desc};
+}
+
+print "done.\n";