Nhiệm vụ này là một phần của Câu đố đẩy lập trình hàng đầu định kỳ đầu tiên và được dự định là minh chứng cho đề xuất loại thử thách vua mới .
Nhiệm vụ là viết một chương trình để chơi tình huống khó xử của tù nhân tốt hơn so với những người tham gia khác.
Nhìn kìa Chúng tôi biết bạn cùng phòng của bạn --- tên anh ta là gì? Vâng McWongski, mobster Nippo-Ailen-Ukraina - là một cái gì đó và bạn biết nó là gì.
Vinnie đang cố gắng trở nên tốt đẹp ở đây, Vinnie. Givin 'bạn một cơ hội.
Nếu bạn nói với chúng tôi những gì anh ấy đang làm, chúng tôi sẽ thấy bạn có được sự phân công công việc tốt.
Và nếu bạn không ...
Luật của trò chơi
- Cuộc thi bao gồm một vòng tròn đầy đủ (tất cả có thể ghép đôi) của hai thí sinh tại một thời điểm (bao gồm cả tự chơi).
- Có 100 vòng chơi giữa mỗi cặp
- Trong mỗi vòng, mỗi người chơi được yêu cầu lựa chọn giữa việc hợp tác với người chơi khác hoặc phản bội họ, mà không biết ý định của người chơi khác trong vấn đề này, nhưng với một ký ức về kết quả của các vòng trước đối đầu với đối thủ này.
- Điểm được trao cho mỗi vòng dựa trên sự lựa chọn kết hợp. Nếu cả hai người chơi hợp tác, mỗi người được 2 điểm. Sự phản bội lẫn nhau mang lại 1 điểm mỗi. Trong trường hợp hỗn hợp, người chơi phản bội được thưởng 4 điểm và người hợp tác bị phạt 1.
- Một trận đấu "chính thức" sẽ được tiến hành không sớm hơn 10 ngày sau khi đăng với tất cả các bài dự thi tôi có thể làm việc và được sử dụng để chọn người chiến thắng "được chấp nhận". Tôi có hộp Mac OS 10.5, vì vậy các giải pháp POSIX sẽ hoạt động, nhưng có những ngôn ngữ không có. Tương tự như vậy, tôi không có hỗ trợ cho API win32. Tôi sẵn sàng thực hiện một nỗ lực cơ bản để cài đặt mọi thứ, nhưng có một giới hạn. Các giới hạn của hệ thống của tôi không có cách nào thể hiện giới hạn của các phản hồi có thể chấp nhận được, chỉ đơn giản là các giới hạn sẽ được đưa vào trận đấu "chính thức".
Giao diện của Lập trình viên
- Các mục nhập phải ở dạng chương trình có thể chạy từ dòng lệnh; quyết định phải là đầu ra (duy nhất!) của chương trình trên đầu ra tiêu chuẩn. Lịch sử của các vòng trước với đối thủ này sẽ được trình bày dưới dạng đối số dòng lệnh.
- Đầu ra là "c" (cho ngao lên ) hoặc "t" (cho tất cả ).
- Lịch sử là một chuỗi các ký tự đại diện cho các vòng trước với các vòng gần đây nhất đến sớm nhất trong chuỗi. Các nhân vật là
- "K" (vì giữ đức tin có nghĩa là hợp tác lẫn nhau)
- "R" (đối với chuột b @ st @rd đã bán cho tôi! )
- "S" (đối với kẻ hút! Có nghĩa là bạn được hưởng lợi từ sự phản bội)
- "E" (vì mọi người đang tìm kiếm số một về sự phản bội lẫn nhau)
Giá đỡ
Bốn người chơi sẽ được cung cấp bởi tác giả
- Thiên thần - luôn hợp tác
- Quỷ dữ - luôn luôn nói chuyện
- TitForTat - Hợp tác ở vòng đầu tiên sau đó luôn luôn làm như anh ta đã làm trong vòng cuối cùng
- Ngẫu nhiên - 50/50
mà tôi sẽ thêm tất cả các mục mà tôi có thể chạy.
Tổng số điểm sẽ là tổng điểm so với tất cả các đối thủ (bao gồm chỉ tự chơi một lần và sử dụng điểm trung bình).
Người đăng ký
(hiện tại kể từ ngày 2 tháng 5 năm 2011 7:00)
Cái bắt tay bí mật | Tên lửa chống T42T | Mistrust (biến thể) | Chống bắt tay | Cô bé nhỏ bé | Hội tụ | Cá mập | Dự phòng | Pavlov - Giành chiến thắng, mất công tắc | Danh dự giữa những tên trộm | Giúp ma cà rồng | Druid | Sơ đồ nhỏ | Quá khứ | Tit cho hai Tats | Đơn giản |
Vua phá lưới
#! /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
- Khiếu nại về con trăn khủng khiếp của tôi đều được chào đón, vì tôi chắc chắn rằng điều này hút nhiều hơn một cách
- Sửa lỗi chào mừng
Vua phá lưới Changelog:
- In sắp xếp người chơi và điểm số, và tuyên bố người chiến thắng (29/11, Casey)
- Tùy chọn chạy nhiều giải đấu (
./score warriors/ num_tournaments)
) mặc định = 1, phát hiện và biên dịch các nguồn python (29/2, Casey) - Sửa lỗi đặc biệt ngu ngốc trong đó người chơi thứ hai đã được thông qua một lịch sử không chính xác. (30 tháng 4, dmckee; cảm ơn Josh)
Chiến binh ban đầu
Bằng cách ví dụ, và để có thể xác minh kết quả
Thiên thần
#include <stdio.h>
int main(int argc, char**argv){
printf("c\n");
return 0;
}
hoặc là
#!/bin/sh
echo c
hoặc là
#!/usr/bin/python
print 'c'
ác quỷ
#include <stdio.h>
int main(int argc, char**argv){
printf("t\n");
return 0;
}
Ngẫu nhiên
#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;
}
Lưu ý rằng người ghi bàn có thể gọi lại chiến binh nhiều lần trong một giây, do đó phải thực hiện một nỗ lực nghiêm túc để đảm bảo tính ngẫu nhiên của kết quả nếu thời gian được sử dụng để gieo 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;
}
Người đầu tiên thực sự làm một cái gì đó với lịch sử.
Chạy vua phá lưới chỉ mang lại sản lượng chiến binh được cung cấp
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)
Con quỷ đó, anh ta là một kẻ thủ công, và những kẻ tốt bụng dường như đến sau cùng.
Các kết quả
của cuộc chạy "chính thức"
('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)
thành return (s1, L1+h1), (s2, L2+h2)
[Ghi chú L2+h2
thay vì L2+h1
ở cuối]? // Lỗi cắt-n-dán hoặc một cái gì đó không kém phần ngu ngốc. Sheesh!