このタスクは、最初の定期的なプレミアプログラミングパズルプッシュの一部であり、新しいキングオブザヒルチャレンジタイプの提案のデモンストレーションを目的としています。
タスクは、繰り返しの囚人のジレンマを他の参加者よりもうまくプレイするプログラムを書くことです。
ほら、ヴィニー。私たちはあなたのセルメートを知っています---彼の名前は何ですか?ニッポ・アイルランド・ウクライナのギャング、ええ、マクウォンスキーは何かしらあなたが知っています。
ここで素敵になろうとしています、ヴィニー。あなたにチャンスを与えます。
彼が何を計画しているのかを教えていただければ、良い仕事が割り当てられます。
そして、もしあなたが...
ゲームのルール
- コンテストは、一度に2人の競技者の完全なラウンドロビン(可能なすべてのペアリング)で構成されます(自己プレーを含む)。
- 各ペア間で100ラウンドプレイされます
- 各ラウンドでは、各プレイヤーは、他のプレイヤーの意図を知らずに、他のプレイヤーと協力するか裏切るかを選択するように求められますが、この対戦相手と対戦した前のラウンドの結果を記憶します。
- 組み合わせた選択に基づいて、各ラウンドでポイントが付与されます。両方のプレイヤーが協力すると、それぞれ2ポイントを獲得します。相互裏切りはそれぞれ1ポイントをもたらします。混合ケースでは、裏切りプレイヤーに4ポイントが付与され、協力者には1のペナルティが科せられます。
- 「オフィシャル」マッチは、投稿後10日以内に実行され、私が仕事に参加し、「受け入れられた」勝者を選択するために使用できるすべての提出物が含まれます。私はMac OS 10.5ボックスを持っているので、POSIXソリューションは動作するはずですが、動作しないLinuxismがあります。同様に、win32 APIのサポートもありません。私は物事をインストールする基本的な努力をするつもりですが、制限があります。私のシステムの制限は、受け入れ可能な応答の制限を表すものではなく、単に「公式」一致に含まれるものです。
プログラマーインターフェイス
- エントリは、コマンドラインから実行できるプログラムの形式である必要があります。決定は、標準出力上のプログラムの(唯一の)出力でなければなりません。この対戦相手との以前のラウンドの履歴は、コマンドライン引数として提示されます。
- 出力は、「c」(クラムアップ)または「t」(すべてを伝える)のいずれかです。
- 履歴は、以前のラウンドを表す文字の単一の文字列であり、最新のラウンドが文字列の中で最も早く来ています。キャラクターは
- 「K」(相互協力を意味する信仰を維持するため)
- 「R」(ラットb @ st @ rdの場合は売り切れました!)
- 「S」(吸盤用!裏切りの恩恵を受けたことを意味します)
- 「E」(誰もが相互裏切りでナンバーワンを探しているため)
ブラケット
著者によって4人のプレイヤーが提供されます
- エンジェル-常に協力
- 悪魔-いつも話す
- TitForTat-最初のラウンドで協力し、常に最後のラウンドで行われたとおりに行います
- ランダム-50/50
これに、実行できるすべてのエントリを追加します。
合計スコアは、すべての対戦相手に対する合計スコアになります(1回だけのセルフプレイと平均スコアの使用を含む)。
応募者
(2011年5月2日現在7:00)
秘密の握手 | 対T42Tミサイル | 不信(バリアント) | アンチハンドシェイク | リトル・リスパー | 収束 | サメ | 確率的 | パブロフ-勝利の滞在、スイッチを失う | 泥棒の名誉 | 吸血鬼を助ける | ドルイド | Little Schemer | Bygones | 2タットの乳首 | シンプトン |
得点者
#! /usr/bin/python
#
# Iterated prisoner's dilemma King of Hill Script Argument is a
# directory. We find all the executables therein, and run all possible
# binary combinations (including self-plays (which only count once!)).
#
# Author: dmckee (https://codegolf.stackexchange.com/users/78/dmckee)
#
import subprocess
import os
import sys
import random
import py_compile
###
# config
PYTHON_PATH = '/usr/bin/python' #path to python executable
RESULTS = {"cc":(2,"K"), "ct":(-1,"R"), "tc":(4,"S"), "tt":(1,"E")}
def runOne(p,h):
"""Run process p with history h and return the standard output"""
#print "Run '"+p+"' with history '"+h+"'."
process = subprocess.Popen(p+" "+h,stdout=subprocess.PIPE,shell=True)
return process.communicate()[0]
def scoreRound(r1,r2):
return RESULTS.get(r1[0]+r2[0],0)
def runRound(p1,p2,h1,h2):
"""Run both processes, and score the results"""
r1 = runOne(p1,h1)
r2 = runOne(p2,h2)
(s1, L1), (s2, L2) = scoreRound(r1,r2), scoreRound(r2,r1)
return (s1, L1+h1), (s2, L2+h2)
def runGame(rounds,p1,p2):
sa, sd = 0, 0
ha, hd = '', ''
for a in range(0,rounds):
(na, ha), (nd, hd) = runRound(p1,p2,ha,hd)
sa += na
sd += nd
return sa, sd
def processPlayers(players):
for i,p in enumerate(players):
base,ext = os.path.splitext(p)
if ext == '.py':
py_compile.compile(p)
players[i] = '%s %sc' %( PYTHON_PATH, p)
return players
print "Finding warriors in " + sys.argv[1]
players=[sys.argv[1]+exe for exe in os.listdir(sys.argv[1]) if os.access(sys.argv[1]+exe,os.X_OK)]
players=processPlayers(players)
num_iters = 1
if len(sys.argv) == 3:
num_iters = int(sys.argv[2])
print "Running %s tournament iterations" % (num_iters)
total_scores={}
for p in players:
total_scores[p] = 0
for i in range(1,num_iters+1):
print "Tournament %s" % (i)
scores={}
for p in players:
scores[p] = 0
for i1 in range(0,len(players)):
p1=players[i1];
for i2 in range(i1,len(players)):
p2=players[i2];
# rounds = random.randint(50,200)
rounds = 100
#print "Running %s against %s (%s rounds)." %(p1,p2,rounds)
s1,s2 = runGame(rounds,p1,p2)
#print (s1, s2)
if (p1 == p2):
scores[p1] += (s1 + s2)/2
else:
scores[p1] += s1
scores[p2] += s2
players_sorted = sorted(scores,key=scores.get)
for p in players_sorted:
print (p, scores[p])
winner = max(scores, key=scores.get)
print "\tWinner is %s" %(winner)
total_scores[p] += 1
print '-'*10
print "Final Results:"
players_sorted = sorted(total_scores,key=total_scores.get)
for p in players_sorted:
print (p, total_scores[p])
winner = max(total_scores, key=total_scores.get)
print "Final Winner is " + winner
- 私の恐ろしいpythonに対する苦情は歓迎されます。
- バグ修正を歓迎します
得点者の変更ログ:
- ソートされたプレーヤーとスコアを印刷し、勝者を宣言します(4/29、ケーシー)
- 必要に応じて、複数のトーナメント(
./score warriors/ num_tournaments)
)default = 1を実行し、Pythonソースを検出およびコンパイルします(4/29、Casey) - 2番目のプレーヤーに誤った履歴が渡されていた特に愚かなバグを修正します。(4/30、dmckee、ジョシュに感謝)
初期の戦士
例として、結果を検証できるように
天使
#include <stdio.h>
int main(int argc, char**argv){
printf("c\n");
return 0;
}
または
#!/bin/sh
echo c
または
#!/usr/bin/python
print 'c'
悪魔
#include <stdio.h>
int main(int argc, char**argv){
printf("t\n");
return 0;
}
ランダム
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
int main(int argc, char**argv){
srandom(time(0)+getpid());
printf("%c\n",(random()%2)?'c':'t');
return 0;
}
得点者は1秒間に何度も戦士を再呼び出しする可能性があるため、PRNGのシードに時間が使用されている場合は、結果のランダム性を保証するために真剣に努力する必要があります。
TitForTat
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char**argv){
char c='c';
if (argv[1] && (
(argv[1][0] == 'R') || (argv[1][0] == 'E')
) ) c='t';
printf("%c\n",c);
return 0;
}
実際に歴史で何かをする最初のもの。
提供された戦士のみに得点をかける
Finding warriors in warriors/
Running warriors/angel against warriors/angel.
Running warriors/angel against warriors/devil.
Running warriors/angel against warriors/random.
Running warriors/angel against warriors/titfortat.
Running warriors/devil against warriors/devil.
Running warriors/devil against warriors/random.
Running warriors/devil against warriors/titfortat.
Running warriors/random against warriors/random.
Running warriors/random against warriors/titfortat.
Running warriors/titfortat against warriors/titfortat.
('warriors/angel', 365)
('warriors/devil', 832)
('warriors/random', 612)
('warriors/titfortat', 652)
その悪魔、彼は巧妙なものであり、ナイスガイは明らかに最後に来ます。
結果
「公式」実行の
('angel', 2068)
('helpvamp', 2295)
('pavlov', 2542)
('random', 2544)
('littleschemer', 2954)
('devil', 3356)
('simpleton', 3468)
('secrethandshake', 3488)
('antit42t', 3557)
('softmajo', 3747)
('titfor2tats', 3756)
('convergence', 3772)
('probabimatic', 3774)
('mistrust', 3788)
('hyperrationalwasp', 3828)
('bygones', 3831)
('honoramongthieves', 3851)
('titfortat', 3881)
('druid', 3921)
('littlelisper', 3984)
('shark', 4021)
('randomSucker', 4156)
('gradual', 4167)
Winner is ./gradual
return (s1, L1+h1), (s2, L2+h1)
するのは簡単でしょうか?//カットアンドペーストの間違いまたは何かと同じくらいばかげたこと。シーシュ!return (s1, L1+h1), (s2, L2+h2)
L2+h2
L2+h1