LoginSignup
0
0

More than 5 years have passed since last update.

ドント方式による当選者数をAWKで計算する

Last updated at Posted at 2014-12-21

現在、衆院選の選挙方式は「小選挙区比例代表並立制」と呼ばれる方式でおこなわれております。この中で比例代表選挙での当選者の決定方法は「ドント方式」と呼ばれるアルゴリズムで算出されます。ドント方式をAWKで実装してみました。

{
    seats = $1;
    parties = NF - 1;
    print "#votes for each party:"
    for(i = 2; i <= NF; i++){
        print "party ",i-1,":" ,$i
        a[i-1] = $i
        b[i-1] = $i
    }
}
END{
    for(i = 1; i <= parties; i++){
        q[i] = 2;
        win[i] = 0;
    }
    for(j = 1; j <= seats; j++){
        indx = max_index(b)
        win[indx]++;
        b[indx] = a[indx]/q[indx]
        q[indx]++;
    }
    print("--------------")
    print("party: #winner")
    for(i = 1; i <= parties; i++){
        print(i,": ", win[i])
    }
}                            
function max_index(a) {
    for(i in a){
        v_max   = a[i];
        v_index = i;
        break
    }
    for(i in a){
        if(a[i]  > v_max){
            v_max   = a[i];
            v_index = i;
        }
    }
    return v_index;
}

以下のように、標準入力から当選者数、政党1の得票数、政党2の得票数、…と入力値を与えて使用します。

$ echo 7 400 60 150 330 160 | gawk -f dhondt.awk
#votes for each party:
party  1 : 400
party  2 : 60
party  3 : 150
party  4 : 330
party  5 : 160
--------------
party: #winner
1 :  3
2 :  0
3 :  1
4 :  2
5 :  1

最大値の計算はhttp://gauc.no-ip.org/awk-users-jp/blis.cgi/DoukakuAWK_064
を参考にしました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0