Bu görev, Birinci Periyodik Premier Programlama Yapboz Baskısının bir parçasıdır ve yeni bir tepe kralı meydan okuma önerisinin kanıtı olarak tasarlanmıştır .
Görev, yinelenen mahkumun ikilemini diğer katılımcılardan daha iyi oynamak için bir program yazmaktır.
Bak Vinny. Hücre arkadaşını biliyoruz --- adı ne? Evet McWongski, Nippo-İrlanda-Ukraynalı mafyası - bir şeylere kalmış ve ne olduğunu biliyorsunuz.
Burada kibar olmaya çalışıyoruz, Vinnie. Sana bir şans veriyorum.
Bize ne planladığını söylersen, iyi bir iş atama yaptığını görürüz.
Ve eğer yapmazsan ...
Oyunun kuralları
- Yarışma, aynı anda iki yarışmacının (kendi kendine oynanan oyunlar dahil) tam bir turdan (olası tüm eşleşme) oluşmasından oluşur.
- Her çift arasında oynanan 100 tur var
- Her turda, her oyuncudan, diğer oyuncu ile işbirliği yapma veya onlara ihanet etme arasından seçim yapması istenir, bu konudaki diğer oyuncuların niyetlerini bilmeden, ancak bu rakibe karşı oynanan önceki turların sonuçlarının bir hatırası ile.
- Kombine seçim bazında her tur için puan verilir. Her iki oyuncu da işbirliği yaparsa her ikisi de 2 puan alır. Karşılıklı ihanet, her birine 1 puan kazandırır. Karışık durumda, ihanet eden oyuncuya 4 puan verilir ve işbirlikçi 1 ile cezalandırılır.
- "Resmi" bir maç yayınlanacak en geç 10 gün içerisinde yayınlanacak ve tüm başvuruları ile birlikte çalışmaya başladım ve "kabul edilen" birinciyi seçmek için kullanılacağım. Bir Mac OS 10.5 kutum var, bu yüzden POSIX çözümleri işe yaramalı, ama işe yaramayan linuxism var. Aynı şekilde, win32 API için desteğim yok. Bir şeyler kurmak için temel bir çaba göstermeye istekliyim, ancak bir sınır var. Sistemimin sınırları hiçbir şekilde kabul edilebilir cevapların sınırlarını, sadece “resmi” eşleşmeye dahil edilecekleri temsil etmiyor.
Programcı arayüzü
- Girişler, komut satırından çalıştırılabilen programlar biçiminde olmalıdır; Karar, programın standart çıktıdaki (tek!) çıktısını almalıdır. Bu rakiple önceki turların geçmişi, bir komut satırı argümanı olarak sunulacak.
- Çıktı ya "c" ( istiridye için ) ya da "t" ( hepsini anlatmak için ).
- Tarihçe, önceki turları temsil eden tek bir karakter dizisidir ve en son tur dizgede en erken gelir. Karakterler
- "K" ( karşılıklı işbirliği anlamına gelen inancı sürdürdüğü için )
- "R" ( fare b @ st @ rd için beni sattı! )
- "S" ( enayi için! İhanetten faydalandığın anlamına gelir)
- "E" ( herkes için karşılıklı ihanette bir numarayı arıyor )
Dirsek
Dört oyuncu yazar tarafından sağlanacaktır
- Angel - her zaman işbirliği yapar
- Şeytan - her zaman konuşur
- TitForTat - İlk rauntta işbirliği yapar, sonra son rauntta olduğu gibi yapar
- Rastgele - 50/50
Çalıştırmak için tüm girişleri ekleyeceğim.
Toplam puan, tüm rakiplere karşı toplam puan olacaktır (yalnızca bir kez kendi kendine oynama ve ortalama puanı kullanma dahil).
Katılımcılar
(2 Mayıs 2011, 07:00 itibariyle geçerli)
Gizli El Sıkışma | Anti-T42T Füze | Güvensizlik (değişken) | Anti-El Sıkışma | Küçük Lisper | Yakınsama | Köpekbalığı | Probabimatik | Pavlov - Win Stay, Geçiş Anahtarı | Hırsızlar Arasında Onur | Yardım Vampir | Druid | Küçük Schemer | Bygones | İki Tat Baştankara | Simpleton |
Golcü
#! /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
- Korkunç pitonumla ilgili şikayetler açıktır, çünkü bunun birden fazla yoldan berbat olduğundan eminim.
- Hata düzeltmeleri hoş geldiniz
Golcü Değişimi:
- Sıralanan oyuncuları ve puanları yazdırın ve kazanan ilan edin (4/29, Casey)
- İsteğe bağlı olarak çoklu turnuvalar
./score warriors/ num_tournaments)
yürütün ( ) default = 1, python kaynaklarını algıla ve derle (4/29, Casey) - İkinci oyuncunun yanlış bir tarihçeden geçtiği aptalca hatayı düzelt. (4/30, dmckee; teşekkürler Josh)
İlk savaşçılar
Örnek olarak ve sonuçların doğrulanabilmesi için
melek
#include <stdio.h>
int main(int argc, char**argv){
printf("c\n");
return 0;
}
veya
#!/bin/sh
echo c
veya
#!/usr/bin/python
print 'c'
şeytan
#include <stdio.h>
int main(int argc, char**argv){
printf("t\n");
return 0;
}
rasgele
#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;
}
Golcü, savaşçıyı bir saniyede birçok kez tekrar başlatabilir; bu nedenle, PRNG'yi tohumlamak için zaman kullanılıyorsa, sonuçların rasgele olmasını sağlamak için ciddi bir çaba sarf edilmesi gerekmektedir.
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;
}
İlk olarak tarihle ilgili bir şey yapan var.
Golcüyü sadece verilen savaşçıların veriminde kullanmak
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)
O şeytan, o bir zanaat biri ve görünüşe göre en iyi adamlar geldi.
Sonuçlar
"resmi" koşunun
('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)
için return (s1, L1+h1), (s2, L2+h2)
[Not L2+h2
yerine L2+h1
sonunda]? // Cut-n-paste hatası veya eşit derecede aptalca bir şey. Sheesh!