Tugas ini merupakan bagian dari Push Puzzle Pemrograman Premier Periodik Pertama dan dimaksudkan sebagai demonstrasi proposal tipe tantangan raja-dari-bukit -baru .
Tugasnya adalah menulis program untuk memainkan dilema tahanan yang diulang lebih baik daripada peserta lainnya.
Lihat, Vinny. Kami tahu teman satu selmu --- siapa namanya? Ya McWongski, mafia Nippo-Irlandia-Ukrania - terserah sesuatu dan Anda tahu apa itu.
Kami berusaha bersikap baik di sini, Vinnie. Memberi Anda kesempatan.
Jika Anda memberi tahu kami apa yang dia rencanakan, kami akan melihat Anda mendapat tugas kerja yang baik.
Dan jika Anda tidak ...
Aturan main
- Kontes ini terdiri dari round-robin penuh (semua pasangan mungkin) dari dua kontestan pada suatu waktu (termasuk bermain sendiri).
- Ada 100 putaran yang dimainkan antara masing-masing pasangan
- Dalam setiap putaran masing-masing pemain diminta untuk memilih antara bekerja sama dengan pemain lain atau mengkhianati mereka, tanpa mengetahui niat pemain lain dalam masalah ini, tetapi dengan memori hasil putaran sebelumnya dimainkan melawan lawan ini.
- Poin diberikan untuk setiap putaran berdasarkan pilihan gabungan. Jika kedua pemain bekerja sama, masing-masing mendapat 2 poin. Pengkhianatan timbal balik menghasilkan masing-masing 1 poin. Dalam kasus campuran, pemain yang mengkhianati diberikan 4 poin dan kooperator dihukum 1 poin.
- Pertandingan "resmi" akan berjalan tidak lebih cepat dari 10 hari setelah memposting dengan semua kiriman yang saya dapat mulai bekerja dan digunakan untuk memilih pemenang yang "diterima". Saya memiliki kotak Mac OS 10.5, jadi solusi POSIX harus bekerja, tetapi ada linuxisms yang tidak. Demikian juga, saya tidak memiliki dukungan untuk API win32. Saya bersedia melakukan upaya dasar untuk menginstal sesuatu, tetapi ada batasnya. Batas-batas sistem saya sama sekali tidak mewakili batas-batas respons yang dapat diterima, hanya batas-batas yang akan dimasukkan dalam pertandingan "resmi".
Antarmuka Programmer
- Entri harus dalam bentuk program yang dapat dijalankan dari baris perintah; keputusan harus keluaran (tunggal!) dari program pada keluaran standar. Sejarah putaran sebelumnya dengan lawan ini akan disajikan sebagai argumen baris perintah.
- Outputnya bisa berupa "c" (untuk clam up ) atau "t" (untuk semua ).
- Sejarah adalah string tunggal karakter yang mewakili babak sebelumnya dengan putaran terbaru yang paling awal dalam string. Karakternya adalah
- "K" (untuk menjaga iman yang berarti kerja sama)
- "R" (untuk tikus b @ st @ rd terjual habis! )
- "S" (untuk pengisap! Artinya Anda mendapat manfaat dari pengkhianatan)
- "E" (untuk semua orang mencari nomor satu pada pengkhianatan timbal balik)
Braket
Empat pemain akan disediakan oleh penulis
- Malaikat - selalu bekerja sama
- Iblis - selalu berbicara
- TitForTat - Bekerja sama di babak pertama lalu selalu melakukan apa yang dia lakukan di babak terakhir
- Acak - 50/50
di mana saya akan menambahkan semua entri yang bisa saya jalankan.
Skor total akan menjadi skor penjumlahan terhadap semua lawan (termasuk permainan mandiri hanya sekali dan menggunakan skor rata-rata).
Peserta
(saat ini pada 2 Mei 2011 7:00)
Jabat Tangan Rahasia | Rudal Anti-T42T | Ketidakpercayaan (varian) | Anti-Jabat Tangan | The Little Lisper | Konvergensi | Hiu | Probabimatic | Pavlov - Menangkan Menginap, Kalah Beralih | Hormatilah Pencuri | Bantu Vampir | Druid | Schemer Kecil | Dulu | Gayung Dua Tats | Simpleton |
Pencetak gol
#! /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
- Keluhan tentang python mengerikan saya diterima, karena saya yakin ini menyebalkan lebih dari satu cara
- Perbaikan bug diterima
Daftar Perubahan Pencetak Gol:
- Cetak pemain dan skor yang diurutkan, dan nyatakan pemenang (29/4, Casey)
- Menjalankan beberapa turnamen secara opsional (
./score warriors/ num_tournaments)
) default = 1, mendeteksi & mengkompilasi sumber python (4/29, Casey) - Perbaiki bug yang sangat bodoh di mana pemain kedua melewati sejarah yang salah. (4/30, dmckee; terima kasih Josh)
Prajurit awal
Sebagai contoh, dan agar hasilnya dapat diverifikasi
malaikat
#include <stdio.h>
int main(int argc, char**argv){
printf("c\n");
return 0;
}
atau
#!/bin/sh
echo c
atau
#!/usr/bin/python
print 'c'
setan
#include <stdio.h>
int main(int argc, char**argv){
printf("t\n");
return 0;
}
Acak
#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;
}
Perhatikan bahwa pencetak gol dapat memanggil kembali prajurit berkali-kali dalam satu detik, jadi upaya serius harus dilakukan untuk memastikan keacakan hasil jika waktu digunakan untuk seed 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;
}
Yang pertama yang benar-benar melakukan sesuatu dengan sejarah.
Menjalankan pencetak gol hanya pada hasil prajurit yang disediakan
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)
Iblis itu, dia seorang perajin, dan orang-orang baik tampaknya datang terakhir.
Hasil
dari menjalankan "resmi"
('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)
ke return (s1, L1+h1), (s2, L2+h2)
[Note L2+h2
bukannya L2+h1
di akhir]? // Kesalahan cut-n-paste atau sesuatu yang sama bodohnya. Sheesh!