งานนี้เป็นส่วนหนึ่งของครั้งแรกงวดพรีเมียร์โปรแกรมปริศนาผลักดันและมีวัตถุประสงค์เพื่อเป็นสาธิตของใหม่คิงของเนินเขาท้าทายชนิดข้อเสนอ
ภารกิจคือเขียนโปรแกรมเพื่อเล่นภาวะที่กลืนไม่เข้าคายไม่ออกของนักโทษที่ทำซ้ำได้ดีกว่าผู้เข้าร่วมรายอื่น
ดู Vinny เรารู้จักเพื่อนร่วมห้องของคุณ --- เขาชื่ออะไร? ใช่ McWongski, นักเลงนิปโป - ไอริช - ยูเครน - ขึ้นอยู่กับบางสิ่งและคุณรู้ว่ามันคืออะไร
เราพยายามทำตัวให้ดีที่นี่วินนี ให้โอกาสคุณ Givin
ถ้าคุณบอกเราว่าเขาวางแผนอะไรเราจะเห็นว่าคุณได้รับงานที่ดี
และถ้าคุณไม่ ...
กฎของเกม
- การประกวดประกอบด้วยการแข่งขันรอบเต็มรูปแบบ (การจับคู่ที่เป็นไปได้ทั้งหมด) ของผู้เข้าแข่งขันสองคนในเวลาเดียวกัน (รวมถึงการเล่นด้วยตัวเอง)
- มี 100 รอบการเล่นระหว่างแต่ละคู่
- ในแต่ละรอบผู้เล่นแต่ละคนจะถูกขอให้เลือกระหว่างการร่วมมือกับผู้เล่นคนอื่นหรือทรยศพวกเขาโดยไม่ทราบเจตนาของผู้เล่นคนอื่นในเรื่องนี้แต่ด้วยความทรงจำเกี่ยวกับผลลัพธ์ของรอบก่อนหน้าที่เล่นกับคู่ต่อสู้นี้
- คะแนนจะได้รับในแต่ละรอบขึ้นอยู่กับตัวเลือกที่รวมกัน หากผู้เล่นทั้งสองร่วมมือกันพวกเขาแต่ละคนจะได้รับ 2 คะแนน การหักหลังร่วมกันให้คะแนน 1 คะแนน ในกรณีที่ผสมผู้เล่นที่ถูกหักหลังจะได้รับ 4 คะแนนและผู้ประสานงานจะถูกลงโทษด้วย 1
- การแข่งขัน "ทางการ" จะดำเนินการไม่ช้ากว่า 10 วันหลังจากโพสต์พร้อมกับผลงานทั้งหมดที่ฉันสามารถทำงานได้และใช้เพื่อเลือกผู้ชนะที่ "ยอมรับ" ฉันมีกล่อง Mac OS 10.5 ดังนั้นโซลูชัน POSIX ควรใช้งานได้ แต่มี linuxisms ที่ไม่มี ในทำนองเดียวกันฉันไม่ได้รับการสนับสนุนสำหรับ win32 API ฉันยินดีที่จะใช้ความพยายามขั้นพื้นฐานในการติดตั้งสิ่งต่าง ๆ แต่มีข้อ จำกัด ข้อ จำกัด ของระบบของฉันไม่แสดงถึงขีด จำกัด ของการตอบสนองที่ยอมรับได้เพียงแค่สิ่งที่จะรวมอยู่ในการแข่งขัน "อย่างเป็นทางการ"
ส่วนต่อประสานของโปรแกรมเมอร์
- รายการควรอยู่ในรูปแบบของโปรแกรมที่สามารถเรียกใช้จากบรรทัดคำสั่ง การตัดสินใจจะต้องส่งออก (แต่เพียงผู้เดียว!) ของโปรแกรมในการส่งออกมาตรฐาน ประวัติของรอบก่อนหน้ากับคู่ต่อสู้นี้จะถูกนำเสนอเป็นอาร์กิวเมนต์บรรทัดคำสั่ง
- เอาท์พุทเป็น "c" (สำหรับclam up ) หรือ "t" (เพื่อบอกทั้งหมด )
- ประวัติเป็นสตริงอักขระเดียวที่แสดงถึงรอบก่อนหน้าโดยมีรอบล่าสุดที่เร็วที่สุดในสตริง ตัวละครนั้น
- "K" (สำหรับการรักษาความเชื่อหมายถึงความร่วมมือซึ่งกันและกัน)
- "R" (สำหรับหนู b @ st @ rd ขายให้ฉันหมดแล้ว! )
- "S" (สำหรับผู้ดูด!หมายความว่าคุณได้รับประโยชน์จากการทรยศ)
- "E" (สำหรับทุกคนมองหาหมายเลขหนึ่งในการทรยศต่อกัน)
ตัวยึด
ผู้เล่นสี่คนจะได้รับการจัดทำโดยผู้เขียน
- นางฟ้า - ร่วมมือกันเสมอ
- Devil - พูดเสมอ
- TitForTat - ให้ความร่วมมือในรอบแรกจากนั้นทำตามที่เขาทำในรอบสุดท้ายเสมอ
- สุ่ม - 50/50
ที่ฉันจะเพิ่มรายการทั้งหมดที่ฉันสามารถเรียกใช้
คะแนนรวมจะเป็นคะแนนรวมกับทุกฝ่าย (รวมถึงการเล่นด้วยตนเองเพียงครั้งเดียวและใช้คะแนนเฉลี่ย)
ผู้เข้าประกวด
(ปัจจุบัน ณ วันที่ 2 พฤษภาคม 2011 7:00 น.)
The Secret Handshake | Anti-T42T Missile | ความไม่ไว้วางใจ (ตัวแปร) | ป้องกันการจับมือกัน | The Little Lisper | บรรจบ | ฉลาม | Probabimatic | พาฟโลฟ - ชนะ Stay, สวิทช์ลด | เกียรติยศในหมู่โจร | ช่วยเหลือแวมไพร์ | Druid | ลิตเติ้ลอุบาย | Bygones | หัวนมสำหรับ Two Tats | Simpleton |
คนจดบัญชี
#! /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)
) ค่าเริ่มต้น = 1, ตรวจจับและรวบรวมไพ ธ อนแหล่ง (4/29, เคซี่ย์) - แก้ไขข้อผิดพลาดโง่ ๆ ที่ผู้เล่นคนที่สองกำลังถูกส่งผ่านประวัติที่ไม่ถูกต้อง (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;
}
โปรดทราบว่าผู้บันทึกคะแนนอาจเรียกนักรบอีกหลายครั้งในหนึ่งวินาทีดังนั้นความพยายามอย่างจริงจังจะต้องทำเพื่อประกันการสุ่มผลลัพธ์ถ้าใช้เวลาในการหว่าน 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)
[Note L2+h2
แทนที่จะL2+h1
เป็นตอนท้าย] เป็นเรื่องง่ายไหม? // ความผิดพลาดของ Cut-n-paste หรือสิ่งที่งี่เง่าอย่างเท่าเทียมกัน Sheesh!