即時流出選択のシミュレーション


15

選挙です!私たちがいる領域は、インスタントランオフと呼ばれる投票システムを実装しています(代替投票と呼ばれることもあります)または優先投票ます)。各有権者は、各候補者に番号を付けるまで、各候補者を最も優先度の高いものから最も優先度の低いものに「1」、2番目の候補に「2」などをマークします。この親しみやすいコアラに残りを説明させてください:

優先投票

オリジナルから変更された画像 CC BY-NC-SA 3.0 AUライセンスの下で使用されるPatrick Alexanderによって)。

テキスト形式の即時流出の説明が必要な場合は、Wikipediaの記事参照してください

(注:可能性は低いですが、最少票数の候補が2人以上存在することもあります。これらの状況では、同じ確率でランダムに1つを選択して削除します。)

このチャレンジでは、入力の最初の行は文字列のリストであり、これは選挙の候補者の名前です。これらの例では、パイプ区切り値を使用しましたが、言語に合わせて入力形式を自由に調整してください。

The Omitted Anti-neutrino|Placazoa|Alexander the Awesome|Tau Not Two|Semolina Sorcerer

それに続いて n入力行は文字列のリストでもあり、それぞれが単一の投票を表します。最初のエントリは、#1の優先順位、次の#2の優先順位などを表します。たとえば、

Alexander the Awesome|Semolina Sorcerer|Tau Not Two|Placazoa|The Omitted Anti-neutrino

つまり、その特定の投票の優先順位が最初にアレクサンダー、2番目にセモリナソーサラー、3番目にタウノット2などがあります。

投票を入力として、プログラムまたは機能が選挙の勝者を出力する必要があります。Python 3に、参照されていないリファレンス実装があります

入力と出力の例

入力

Dionysius|Portal Butter|Alexander the Awesome|Red Trainmen
Portal Butter|Alexander the Awesome|Dionysius|Red Trainmen
Dionysius|Portal Butter|Alexander the Awesome|Red Trainmen
Portal Butter|Red Trainmen|Alexander the Awesome|Dionysius
Dionysius|Portal Butter|Alexander the Awesome|Red Trainmen
Alexander the Awesome|Red Trainmen|Portal Butter|Dionysius
Red Trainmen|Alexander the Awesome|Dionysius|Portal Butter
Dionysius|Portal Butter|Alexander the Awesome|Red Trainmen
Red Trainmen|Dionysius|Portal Butter|Alexander the Awesome
Alexander the Awesome|Dionysius|Red Trainmen|Portal Butter
Dionysius|Portal Butter|Alexander the Awesome|Red Trainmen
Alexander the Awesome|Red Trainmen|Dionysius|Portal Butter

出力

Alexander the Awesome

入力

Depressed Billy|Sighted Citrus|Frosty Fox|Electronic Accident
Frosty Fox|Sighted Citrus|Electronic Accident|Depressed Billy
Frosty Fox|Depressed Billy|Sighted Citrus|Electronic Accident
Depressed Billy|Electronic Accident|Sighted Citrus|Frosty Fox
Depressed Billy|Sighted Citrus|Electronic Accident|Frosty Fox
Depressed Billy|Electronic Accident|Sighted Citrus|Frosty Fox
Electronic Accident|Frosty Fox|Depressed Billy|Sighted Citrus
Sighted Citrus|Frosty Fox|Electronic Accident|Depressed Billy
Frosty Fox|Depressed Billy|Sighted Citrus|Electronic Accident
Sighted Citrus|Electronic Accident|Frosty Fox|Depressed Billy
Frosty Fox|Electronic Accident|Depressed Billy|Sighted Citrus
Sighted Citrus|Frosty Fox|Depressed Billy|Electronic Accident

出力

Sighted Citrus または Frosty Fox(ランダムに)

入力

ここで最後の入力セットを取得できます。これは、最近のオーストラリアの選挙の投票領域の1つであり、63 428票で構成されています。

出力

Ross HART

1
最初の行を取得する必要がありますか、それとも残りの入力から推測できますか?
マルティセン

@Maltysen必要に応じて最初の行を省略できますが、提出の際にメモしてください。
アブサン

1
@absinthe-オーストラリアの投票セットはもうありません。どこかにコピーがありますか?
pixma140

回答:



1

R101 99バイト

f=function(m)`if`(n<-dim(m)-1,f(matrix(m[m!=names(t<-sample(table(m[1,])))[which.min(t)]],n)),m[1])

オンラインでお試しください!

入力を行列として受け取り、各列が1人の投票者の選択肢を表します。再帰による動作:投票数が最小の候補を見つけ、マトリックス内の対応するすべてのエントリを削除し、マトリックスを再フォーマットし、マトリックスが1行になるまで再帰します。

各反復でのtable投票は、各投票者の現在の最上位の選択肢である最上行の値でカウントすることにより計算されます。これは、sample関係をランダムに壊すためにシャッフルされます。

n<-dim(m)-1長さ2のベクトルを指定しますが、最初の値のみが使用されます(したがって、同等ですが、1バイトより短くなりますn<-nrow(m)-1)。この値は2回使用されます。最初に0と比較され、最後の反復に到達したかどうかが確認されます。第二に、再帰する場合、それは新しい行列の行数です。


0

Python 2、209バイト

def f(s):
 d={}
 for v in s:
	k=v[0];d[k]=d.get(k,[])+[v]
	if len(d[k])>len(s)/2:return k
 D=d.values()
 for v in choice([g for g in D if len(g)==len(min(D,key=len))]):v.pop(0)
 return f(s)
from random import*

オンラインでお試しください!

投票者の優先順位のリストのリストとして入力を受け取ります(ヘッダー行は含まれません)。同点の場合のランダム化は厄介です!



0

Python 2、200バイト

def f(s):
 d={}
 for v in s:
    k=v[0];d[k]=d.get(k,[])+[v]
    if len(d[k])>len(s)/2:return k
 D=d.values()
 x=[g for g in D if len(g)==len(min(D,key=len))]
 for v in x[id(x)%len(x)]:v.pop(0)
 return f(s)

オンラインでお試しください!

配列のオブジェクトIDを「ランダム性」のソースとして利用します。Chas Brownの回答に
基づいています-コメントするのに十分な担当者がいません!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.