X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;ds=sidebyside;f=scripts%2Fpocket-devotee;h=e2e667880c277ac65a0b83ef35f4ce9251189ff2;hb=c5688d38699c6136f8a7a5bc27e9eb05c92973e1;hp=5eb9e7b1b87ee2e86819ed1b2e4ee03142f38862;hpb=dcd900063d3572f77cd8a3f041f7a6e448af4749;p=debian-ctte.git diff --git a/scripts/pocket-devotee b/scripts/pocket-devotee index 5eb9e7b..e2e6678 100755 --- a/scripts/pocket-devotee +++ b/scripts/pocket-devotee @@ -98,6 +98,8 @@ sub main { my %options; GetOptions(\%options, 'option=s@', + 'default_option|default-option!', + 'quorum=i', ); if (not exists $options{option} or not ref($options{option}) or @{$options{option}} < 2 @@ -106,14 +108,17 @@ sub main { } my @options; for my $option (@{$options{option}}) { - my ($key,$name,$majority) = split /:/,$option; + my ($key,$name,$majority) = $option =~ /^\s*([^:]+)\s*:\s*(.+)\s*(?::(\d+))?$/; $majority //= 1; push @options,{key => $key, name => $name, majority => $majority, }; } - winner(options=>\@options); + winner(options=>\@options, + default_option => exists $options{default_option} ? $options{default_option} : 1, + quorum => exists $options{quorum} ? $options{quorum} : 2, + ); } sub encode_base64{ @@ -134,6 +139,9 @@ sub winner { tally_fh => {type => HANDLE, optional => 1, }, + default_option => {default => 1, + type => BOOLEAN, + }, }, ); # options is an array to keep it ordered @@ -157,7 +165,7 @@ sub winner { } # The constitution defines the maximum value of K to be 5 - my $K = 2; # Math::BigFloat->new($params{quorum}); + my $K = $params{quorum}; # 1. Given two options A and B, V(A,B) is the number of voters who # prefer option A over option B. @@ -176,6 +184,8 @@ sub winner { if (not defined $params{tally_fh}) { $params{tally_fh} = \*STDIN; } + # header been output? + my $header_output = 0; # This is where we get our input data from while (defined ($_ = $params{tally_fh}->getline)) { @@ -188,7 +198,7 @@ sub winner { } elsif (m/^(.+) # the voter, can have spaces \s*:\s+ # needs a colon and a space ((?:[$valid_options] # the vote - \s*(?:,|=|<)?\s*)*) # allow < and , or = + \s*(?:,|=|>)?\s*)*) # allow > and , or = \s*$/x # useless trailing spaces ) { $voter = $1; @@ -199,7 +209,7 @@ sub winner { my $current_rank = 1; my %option_rank; while ($vote =~ /([$valid_options]) # the vote - \s*((?:,|=|<)?)\s*/xg) { + \s*((?:,|=|>)?)\s*/xg) { my ($option,$relationship) = ($1,$2); $option_rank{$option} = $current_rank; if ($relationship ne '=') { @@ -208,12 +218,16 @@ sub winner { } $vote = ''; for my $opt (@options) { - $vote .= exists $option_rank{$opt->{key}} ? $option_rank{$opt->{key}} : '-'; + $vote .= exists $option_rank{$opt->{key}} ? $number_to_option{$option_rank{$opt->{key}}} : '-'; + } + if (not $header_output) { + print {$RESULTS} "/--".join("",map {$_->{key}} @options)."\n"; + $header_output = 1; } print {$RESULTS} "V: $vote $voter\n"; } else { - print STDERR "ignoring line '$_'; this is probably wrong!"; + print STDERR "ignoring line '$_'; this is probably wrong!\n"; next; } @@ -293,18 +307,20 @@ EOM my %Drop = (); - foreach my $i (0..($max_choices - 2)) { - if ($K > $Beat_Matrix[$i][$max_choices - 1]) { - $Drop{$i}++; - print {$RESULTS} "Dropping Option", $order_to_options{$i + 1}{key}, - " \"", $order_to_options{$i + 1}{name}, - "\" because of Quorum\n"; - } else { - print {$RESULTS} "Option ", $order_to_options{$i + 1}{key}, - " Reached quorum: $Beat_Matrix[$i][$max_choices - 1] > $K\n"; + if ($params{default_option}) { + foreach my $i (0..($max_choices - 2)) { + if ($K > $Beat_Matrix[$i][$max_choices - 1]) { + $Drop{$i}++; + print {$RESULTS} "Dropping Option ", $order_to_options{$i + 1}{key}, + " \"", $order_to_options{$i + 1}{name}, + "\" because of Quorum ($K > $Beat_Matrix[$i][$max_choices - 1])\n"; + } else { + print {$RESULTS} "Option ", $order_to_options{$i + 1}{key}, + " Reached quorum: $Beat_Matrix[$i][$max_choices - 1] >= $K\n"; + } } + print {$RESULTS} "\n\n"; } - print {$RESULTS} "\n\n"; # Record Majority my %Ratio = ();