이 작업은 제 1 회 프리미어 프리미어 프로그래밍 퍼즐 푸시의 일부이며 새로운 왕 도전 과제 제안 을 시연하기위한 것 입니다.
과제는 다른 참가자보다 반복 된 죄수의 딜레마를 더 잘 수행하는 프로그램을 작성하는 것입니다.
비니 우리는 당신의 셀 메이트를 알고 있습니다. 그의 이름은 무엇입니까? 네, 닛포 아일랜드-우크라이나 폭도 들인 맥 W 스키 (McWongski)는 어떤 일에 달려 있고 그것이 무엇인지 알고 있습니다.
우린 여기 잘하려고 노력하고있어, 비니 기회를 줘
그가 무엇을 계획하고 있는지 말해 주면 우리는 당신이 좋은 과제를 얻는 것을 보게 될 것입니다.
그리고 당신이하지 않으면 ...
게임의 규칙
- 컨테스트는 한 번에 두 명의 참가자 (자체 플레이 포함)의 전체 라운드 로빈 (가능한 모든 페어링)으로 구성됩니다.
- 각 쌍 사이에 100 라운드가 진행됩니다
- 각 라운드에서 각 플레이어는 그 문제에 다른 플레이어의 의도를 알지 못하고, 다른 플레이어와 협력하거나 배신 사이에서 선택을 부탁한다 하지만 이 상대에 대한 재생 이전 라운드의 결과의 메모리.
- 조합 된 선택에 따라 각 라운드마다 포인트가 부여됩니다. 두 선수가 협력하면 각각 2 점을 얻습니다. 상호 배신은 각각 1 포인트를 산출합니다. 혼합 된 경우 배신한 플레이어는 4 점을 받고 협력자는 1을받습니다.
- "공식"경기는 게시 한 후 10 일 이내에 출근 할 수있는 모든 출품작과 함께 "승인 된"승자를 선택하는 데 사용됩니다. Mac OS 10.5 상자가 있으므로 POSIX 솔루션이 작동해야하지만 그렇지 않은 Linux가 있습니다. 마찬가지로, win32 API는 지원하지 않습니다. 나는 물건을 설치하기 위해 기본 노력을 기꺼이하지만 한계가 있습니다. 내 시스템의 한계는 허용 가능한 응답의 한계를 나타내지 않으며 단순히 "공식"일치에 포함될 한계를 나타냅니다.
프로그래머의 인터페이스
- 항목은 명령 행에서 실행할 수있는 프로그램 형식이어야합니다. 결정은 표준 출력에서 프로그램의 (단독!) 출력이어야합니다. 이 상대와의 이전 라운드 기록은 명령 행 인수로 표시됩니다.
- 출력은 "c"( 클램 업의 경우 ) 또는 "t"( 모두의 경우 )입니다.
- 히스토리는 가장 최근 라운드가 문자열에서 가장 빨리 나오는 이전 라운드를 나타내는 단일 문자열입니다. 문자는
- "K"( 상호 협력을 의미 하는 믿음 을 유지하기 위해 )
- "R"( 쥐 b @ st @ rd의 경우 매진되었습니다! )
- "S"( 빨리! 배신으로 이익을 의미)
- "E"( 모든 사람이 상호 배신에서 1 위 를 찾고 있습니다 )
브래킷
저자는 4 명의 플레이어를 제공합니다
- 천사-항상 협력
- 악마-항상 이야기
- TitForTat-첫 라운드에서 협력하고 마지막 라운드에서했던 것처럼 항상
- 랜덤-50/50
실행할 수있는 모든 항목을 추가합니다.
총 점수는 모든 상대에 대한 합계 점수입니다 (자기 플레이를 한 번만하고 평균 점수 사용).
참가자
(2011 년 5 월 2 일 현재 7:00)
비밀 악수 | Anti-T42T 미사일 | 불신 (변형) | 악수 방지 | 작은 사신 | 컨버전스 | 상어 | 유아 | Pavlov-승리 유지, 잃어버린 스위치 | 도둑들 중 명예 | 뱀파이어 도움말 | 드루이드 | 리틀 쉬머 | Bygones | 두 개의 가슴을위한 젖꼭지 | 심플 턴 |
득점자
#! /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
- 끔찍한 파이썬에 대한 불만은 환영합니다.
- 버그 수정 환영
채점자 변경 내역 :
- 정렬 된 플레이어 및 점수를 인쇄하고 승자를 선언하십시오 (4/29, Casey)
- 선택적으로 여러 토너먼트 (
./score warriors/ num_tournaments)
) default = 1을 실행하고 파이썬 소스 감지 및 컴파일 (4/29, Casey) - 두 번째 플레이어가 잘못된 기록을 전달했던 특히 벙어리 버그를 수정했습니다. (4/30, dmckee; 감사합니다 Josh)
초기 전사
예를 들어 결과를 확인할 수 있도록
천사
#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
말]? // 잘못 붙여 넣기 또는 똑같이 바보 같은 것을 붙여 넣습니다. esh!