1P5: कैदी की दुविधा को मिटा दिया


35

यह कार्य प्रथम आवधिक प्रीमियर प्रोग्रामिंग पहेली पुश का हिस्सा है और इसे नए चुनौती-प्रकार के प्रस्ताव के प्रदर्शन के रूप में अभिप्रेत है ।

कार्य अन्य कैदियों की तुलना में बेहतर कैदी की दुविधा को खेलने के लिए एक कार्यक्रम है।

देखो, विन्नी। हम आपके सेलमेट को जानते हैं --- उसका नाम क्या है? हाँ McWongski, निप्पो-आयरिश-उक्रानियन डकैत - कुछ करने के लिए है और आप जानते हैं कि यह क्या है।

हम यहाँ अच्छा बनने की कोशिश कर रहे हैं, विन्नी। Givin 'तुम एक मौका।

यदि आप हमें बताते हैं कि वह क्या है तो हम देखेंगे कि आपको एक अच्छा काम मिलेगा।

और अगर तुम नहीं ...

खेल के नियम

  • प्रतियोगिता में एक समय में दो प्रतियोगियों की एक पूर्ण राउंड-रॉबिन (सभी संभव जोड़ी) शामिल होती है (आत्म नाटकों सहित)।
  • प्रत्येक जोड़ी के बीच 100 राउंड खेले जाते हैं
  • प्रत्येक राउंड में प्रत्येक खिलाड़ी को दूसरे खिलाड़ी के साथ सहयोग करने या उन्हें धोखा देने के बीच चुनने के लिए कहा जाता है, इस मामले में अन्य खिलाड़ियों के इरादों को जाने बिना, लेकिन इस प्रतिद्वंद्वी के खिलाफ खेले गए पिछले राउंड के परिणामों की स्मृति के साथ।
  • संयुक्त पसंद के आधार पर प्रत्येक दौर के लिए अंक प्रदान किए जाते हैं। यदि दोनों खिलाड़ी सहयोग करते हैं तो उन्हें प्रत्येक 2 अंक मिलते हैं। पारस्परिक विश्वासघात 1 अंक देता है। मिश्रित मामले में, विश्वासघात करने वाले खिलाड़ी को 4 अंक दिए जाते हैं और कूपर को 1 से दंडित किया जाता है।
  • एक "आधिकारिक" मैच जल्द ही नहीं चलाया जाएगा जो सभी प्रस्तुतियाँ मुझे काम करने के लिए मिल सकती हैं और "स्वीकृत" विजेता का चयन करने के लिए उपयोग किए जाने के 10 दिनों के बाद किया जाएगा। मेरे पास Mac OS 10.5 बॉक्स है, इसलिए POSIX समाधान काम करना चाहिए, लेकिन ऐसे linuxisms हैं जो नहीं करते हैं। इसी तरह, मुझे win32 एपीआई के लिए कोई समर्थन नहीं है। मैं चीजों को स्थापित करने के लिए एक मूल प्रयास करने को तैयार हूं, लेकिन एक सीमा है। किसी भी तरह से मेरे सिस्टम की सीमाएं स्वीकार्य प्रतिक्रियाओं की सीमाओं का प्रतिनिधित्व करती हैं, बस उन्हें "ऑफिकल" मैच में शामिल किया जाएगा।

प्रोग्रामर का इंटरफ़ेस

  • प्रविष्टियां उन कार्यक्रमों के रूप में होनी चाहिए जिन्हें कमांड लाइन से चलाया जा सकता है; मानक आउटपुट पर प्रोग्राम का आउटपुट (एकमात्र!) होना चाहिए। इस प्रतिद्वंद्वी के साथ पिछले दौर के इतिहास को कमांड-लाइन तर्क के रूप में प्रस्तुत किया जाएगा।
  • आउटपुट या तो "c" ( क्लैम अप के लिए ) या "t" ( सभी को बताने के लिए ) है।
  • इतिहास वर्णों का एक एकल तार है जो पिछले दौरों का प्रतिनिधित्व करता है जिसमें सबसे हाल के दौर स्ट्रिंग में जल्द से जल्द आ रहे हैं। अक्षर हैं
    • "के" ( विश्वास के लिए परस्पर सहयोग रखने के लिए)
    • "आर" ( चूहे के लिए b @ st @ rd ने मुझे बेच दिया! )
    • "एस" ( चूसने वाले के लिए! मतलब आपको विश्वासघात से फायदा हुआ)
    • "ई" ( हर कोई आपसी विश्वासघात पर नंबर एक की तलाश में है)

कोष्ठक

चार खिलाड़ी लेखक द्वारा प्रदान किए जाएंगे

  • परी - हमेशा सहयोग करती है
  • शैतान - हमेशा बात करता है
  • टिटफॉरटैट - पहले राउंड में सहयोग करता है, फिर हमेशा वैसा ही करता है जैसा कि आखिरी राउंड में किया गया था
  • यादृच्छिक - 50/50

जिसके लिए मुझे वे सभी प्रविष्टियाँ मिलेंगी जो मुझे चलाने के लिए मिल सकती हैं।

कुल स्कोर सभी विरोधियों (केवल एक बार स्व-नाटकों सहित और औसत स्कोर का उपयोग करके) के खिलाफ कुल स्कोर होगा।

प्रवेशकों

(वर्तमान 2 मई 2011 7:00 बजे तक)

सीक्रेट हैंडशेक | एंटी- T42T मिसाइल | अविश्वास (संस्करण) | एंटी हैंडशेक | द लिटिल लिस्पर | अभिसरण | शार्क | प्रोबाइमैटिक | पावलोव - विन स्टे, लूज स्विच | चोरों के बीच सम्मान | मदद पिशाच | ड्र्यूड | छोटी सी शेमर | बाईगोन | दो टाट के लिए टाइट | सरलटन |

गणक

#! /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, केसी)
  • वैकल्पिक रूप से कई टूर्नामेंट चलाएं ( ./score warriors/ num_tournaments)) डिफ़ॉल्ट = 1, अजगर स्रोतों का पता लगाएं और संकलित करें (4/29, केसी)
  • विशेष रूप से गूंगा बग को ठीक करें जिसमें दूसरे खिलाड़ी को एक गलत इतिहास दिया जा रहा था। (4/30, dmckee; धन्यवाद जोश)

प्रारंभिक योद्धा

उदाहरण के माध्यम से, और ताकि परिणामों को सत्यापित किया जा सके

देवदूत

#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 को बीज करने के लिए समय का उपयोग किया जा रहा है, तो परिणामों की यादृच्छिकता का बीमा करने के लिए एक गंभीर प्रयास किया जाना चाहिए।

जैसे को तैसा

#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

2
अगर मेरा सेलमेट निप्पो-आयरिश-यूक्रेनी है, तो उसका नाम हाइबरनो-सिनो-रूसी क्यों दिखता है?
पीटर टेलर

2
@ पेटर: LOL। सच्चाई? खैर, (1) वंशावली स्पष्ट नहीं हैं, लेकिन मैं शायद स्कॉच-आयरिश के माध्यम से अपने mic'edness द्वारा आता हूं ; (2) "निप्पो" लिखने के बाद मैंने उगते सूरज की भूमि से अपने दोस्तों के नामों के विभिन्न बिट्स की कोशिश की और उन्हें जिस तरह से स्कैन किया, वह पसंद नहीं आया, इसलिए मैंने आगे बढ़कर एक चीनी उपनाम का इस्तेमाल किया, जो लग रहा था इसके बजाय अच्छा है, और (3) मुझे अंतर नहीं पता होगा अगर वे मुझे टायर की बेड़ियों से पीटते हैं। जो परिस्थितियों में संभव प्रतीत होता है।
dmckee

1
@Josh: इसे सरल बदलने के लिए return (s1, L1+h1), (s2, L2+h1)करने के लिए return (s1, L1+h1), (s2, L2+h2)[नोट L2+h2के बजाय L2+h1अंत में]? // कट-एन-पेस्ट गलती या कुछ समान रूप से बेवकूफ। शीश!
dmckee

2
मैंने परीक्षण स्क्रिप्ट पर कुछ समय बिताया है, और मैं यहां एक अपडेट की घोषणा करके प्रसन्न हूं । यह अद्यतन परीक्षण स्क्रिप्ट में एक सरल शेल जोड़ता है, जो उपयोगकर्ता को इस बॉट बनाम उस बॉट को मैन्युअल रूप से चलाने की अनुमति देता है, प्रतिबंधित क्षेत्रों और कुछ अन्य शांत सामान के साथ टूर्नामेंट चलाता है। सुझाव देने के लिए स्वतंत्र महसूस करें! ओह। और मैं बॉट-बनाम-बॉट विचार के लिए @josh का एहसानमंद हूं। यह वास्तव में उनकी "ट्रेनर" स्क्रिप्ट का एक कट्टर कार्यान्वयन है।
गिरफ्तारी

2
दिलचस्प: 23 प्रतियोगी थे, इसलिए प्रत्येक ने 22 राउंड खेले। अगर हर कोई "एंजेल" खेलता तो हर स्कोर 4400 होता, लेकिन 4167 का सर्वश्रेष्ठ स्कोर भी उससे मेल नहीं खाता। यदि केवल हम एक आदर्श दुनिया में रहते थे ... :)
Briguy37

जवाबों:


11

क्रमिक

यह रणनीति ब्यूफिल्स, डेलहाई और मैथ्यू के एक पेपर पर आधारित है । मेरा सी वास्तव में सबसे अच्छा नहीं है, इसलिए यदि किसी के पास कोड को बेहतर बनाने / गति देने के लिए कोई सुझाव है, तो मुझे बताएं!

[संपादित करें] ध्यान देने योग्य बात यह है कि ग्रैडुअल को एक रणनीति के रूप में डिजाइन किया गया था जो टाट के लिए टाइट को आउटपरफॉर्म करता है। इसमें समान गुण हैं कि यह एक विरोधी प्रतिद्वंद्वी के खिलाफ सहयोग करने और प्रतिशोध लेने के लिए तैयार है। टाट फॉर टाट के विपरीत, जिसमें केवल अंतिम राउंड की स्मृति होती है, ग्रैडुअल पूरी बातचीत को याद रखेगा और प्रतिद्वंद्वी को अब तक जितने भी बार डिफ्यूज कर चुका है, उसे हटाएगा। यद्यपि यह बाद में फिर से आपसी सहयोग की पेशकश करेगा।

हमेशा की तरह, रणनीति का प्रदर्शन अन्य रणनीतियों की लाइन-अप पर निर्भर करता है। साथ ही कुछ विवरणों पर मूल पेपर वास्तव में स्पष्ट नहीं था।

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char* argv[]) {
    if(argc == 1){
        printf("c\n");
        return 0;
    }

    size_t l = strlen(argv[1]);
    int i;
    size_t currentSequence = 0;
    size_t totalDefects = 0;
    size_t lastDefects = 0;

    for(i = l-1; i >= 0; i--){
        if(argv[1][i] == 'E' || argv[1][i] == 'R'){
            totalDefects++;
            currentSequence = 0;
        } else if(argv[1][i] == 'S') {
            currentSequence++;
        }
    }

    if(currentSequence < totalDefects)
        // continue defect sequence
        printf("t\n");
    else if(argv[1][0] == 'S' || argv[1][0] == 'E' ||
            argv[1][1] == 'S' || argv[1][1] == 'E')
        // blind cooperation
        printf("c\n");
    else if(argv[1][0] == 'R')
        // start new defect sequence
        printf("t\n");
    else
        printf("c\n");

    return 0;
}

11

द सीक्रेट हैंडशेक

#!/usr/bin/python
import sys
import random

def main():
    if len(sys.argv) == 1:
        hist = ""
    else:
        hist = sys.argv[1]
    if len(hist) <= len(TAG) and hist == TAGMATCH[len(TAG) - len(hist):]:
        print TAG[len(TAG) - len(hist) - 1]
        return
    if hist[-len(TAG):] == TAGMATCH:
        print 'c'
        return
    print "t"

def getTag():
    global TAG
    filename = sys.argv[0]
    filename = filename.replace(".pyc", ".py")
    f = open(filename, 'r')
    code = f.read().split('\n')
    f.close()
    if len(code[1]) == 0 or code[1][0] != '#':
        random.seed()
        newtag = 't' * 10
        cs = 0
        while cs < 3:
            pos = random.randint(0, 8)
            if newtag[pos] == 't':
                newtag = newtag[:pos] + 'c' + newtag[pos+1:]
                cs += 1
        code.insert(1, '#%s' % newtag)
        f = open(filename, 'w')
        f.write('\n'.join(code))
        f.close()
        TAG = newtag
    else:
        TAG = code[1][1:]
    global TAGMATCH
    TAGMATCH = TAG.replace('c', 'K').replace('t', 'E')

if __name__ == "__main__":
    getTag()
    main()

यहां रणनीति "गुप्त" हाथ मिलाने के लिए पहले 10 राउंड का बलिदान करना है। अगर मैं अपने आप को सेल कर रहा हूं, तो मैं पहले 10 चालों के इतिहास को पहचानता हूं और बाकी गेम के लिए अपनी एंजेल कैप लगाता हूं। जैसे ही मैं पहचानता हूं कि मेरा सेलमेट खुद नहीं है, मैं अत्यधिक सहकारी सेलमेट्स का लाभ उठाने के प्रयास में एक शैतान में बदल जाता हूं।

पहले 10 राउंड का त्याग करने से मुझे शैतान को बाहर निकालने की अनुमति मिलेगी या नहीं, इस बात पर निर्भर करता है कि वहाँ कितनी प्रविष्टियाँ हैं। क्षति को कम करने के लिए, केवल 3 सहयोगी हैंडशेक में दिखाई देते हैं।

संपादित करें: TAGMATCH को अब केवल एक को बदलने जैसी बेवकूफ त्रुटियों को रोकने के लिए गतिशील है और इसलिए मैं भविष्य में कुछ बिंदु पर TAG को गतिशील बना सकता हूं।

संपादित करें 2: अब बेतरतीब ढंग से पहले रन पर टैग उत्पन्न करता है और इसे निर्दिष्ट फ़ाइल में संग्रहीत करता है sys.argv[0]( इसके .pycद्वारा .pyइसे कोड में जाता है, न कि बायटेकोड, फ़ाइल)। मुझे लगता है कि मेरे सभी उदाहरणों में यही एकमात्र जानकारी है जो किसी और के पास नहीं है, इसलिए यह परजीवियों से बचने के लिए एकमात्र विकल्प की तरह लगता है।


लेकिन आपका डोपेलगैंगर खुद को शैतान बनाने के लिए कैसे जानता है?
arrdem

1
(मैं तोते की तरह महसूस करता हूं, "हर समय टाट के लिए" कहते हुए ...) ध्यान दें कि टी 4 टी के खिलाफ एक जोड़ी में आपकी रणनीति को हरा देगा: टी 4 टी (पहले सहयोग करता है) और डेविल (कम चूहा परिणाम), और आपके साथ टाई जाएगा रणनीति। बेशक, कुल जोड़ नहीं, कुल, अंत में क्या मायने रखता है। जैसा कि आप कहते हैं, जनसंख्या महत्वपूर्ण है।
जोश कैसवेल

1
ओह, नहीं, आपको टाट के लिए एक अतिरिक्त एस मिलता है। अच्छा लगा। मुझे नहीं पता TAGथा कि पीछे की तरफ खेला जा रहा है। हालाँकि, क्या आपका TAGMATCH'KEEEKEEEKE' नहीं होना चाहिए ? "".join({('c', 'c'):'K', ('t', 't'): 'E'}[moves] for moves in zip(TAG, TAG))
जोश कैसवेल

@ जॉन अच्छा बिंदु - मेरे पास मूल रूप से एक अलग टैग था और जब मैंने सहयोग को कम करने के लिए इसे बदल दिया, तो मैं TAGMATCH को अपडेट करना भूल गया। @Arrdem विचार यह है कि यदि मैं खुद के खिलाफ खेल रहा हूं, तो सबसे अच्छी बात यह है कि दोनों अपने स्कोर के योग को बढ़ाने के लिए हर समय सहयोग करें।
एरोन ड्यूफोर

1
आह, लानत है। इसलिए अब मुझे .pyआपके कोड के लिए सभी फाइलों को खोजना होगा और TAG को निकालना होगा। मैं सी में ऐसा नहीं करूंगा, हालांकि ...
जोए

6

लिटिल लिस्पर

(setf *margin* (/ (+ 40 (random 11)) 100))
(setf *r* 0.0)
(setf *s* 0.0)
(setf *k* 0.0)
(setf *e* 0.0)

;; step 1 - cout up all the games results

(loop for i from 1 to (length(car *args*)) do
    (setf foo (char (car *args*) (1- i)))
    (cond 
        ((equal foo #\R) (setf *r* (1+ *r*)))
        ((equal foo #\S) (setf *s* (1+ *s*)))
        ((equal foo #\K) (setf *k* (1+ *k*)))
        ((equal foo #\E) (setf *e* (1+ *e*)))
    )
)

(setf *sum* (+ *r* *s* *k* *e*))

;; step 2 - rate trustworthiness
(if (> *sum* 0)
    (progn
        (setf *dbag* (/ (+ *r* *e*) *sum*)) ; percentage chance he rats
        (setf *trust* (/ (+ *s* *k*) *sum*)); percentage chance he clams
    )
    (progn
        (setf *dbag* 0) ; percentage chance he rats
        (setf *trust* 0); percentage chance he clams
    )
)



;; step 3 - make a decision (the hard part....)

(write-char
    (cond
        ((> *sum* 3) (cond 
                    ((or (= *dbag* 1) (= *trust* 1)) #\t) ; maximizes both cases
                                                          ; takes advantage of the angel, crockblocks the devil
                    ((> (+ *dbag* *margin*) *trust*) #\t) ; crockblock statistical jerks
                    ((< *dbag* *trust*) #\c)              ; reward the trusting (WARN - BACKSTABBING WOULD IMPROVE SCORE)
                    ((and
                        (= (floor *dbag* *margin*) (floor *trust* *margin*))
                        (not (= 0 *dbag* *trust*)))
                        #\t)                              ; try to backstab a purely random opponent, avoid opening w/ a backstab
                    )
        )
        (t #\c)                                            ; defalt case - altruism
    )
)

शैतान

निम्नलिखित पर विचार करें, प्रारूप (प्लेयर 1, प्लेयर 2)

  • (सी, टी) - पी 2 अपने विश्वासघात के लिए चार अंक प्राप्त करता है, जबकि पी 1 लोस वन
  • (टी, टी) - पी 2 और पी १ गैइन १

यह मानते हुए कि पी 2 शैतान है, ऐसा कोई तरीका नहीं है कि शैतान कभी भी ढीले अंक ले सकता है, वास्तव में सबसे खराब यह है कि वह केवल एक बिंदु हासिल कर सकता है। विशुद्ध रूप से यादृच्छिक प्रतिद्वंद्वी के खिलाफ इसलिए, शैतान का सबसे खराब संभव स्कोर बिल्कुल (5/2) * n होगा जहां n "खेल" की संख्या है। उनका पूर्ण रूप से सबसे खराब मामला खुद के खिलाफ है, जहां उनका स्कोर n होगा, और उनका सबसे अच्छा मामला एक परी के खिलाफ है, जो 4 * n होगा

जोर: इष्टतम_स्ट्रैट = शैतान

यह एक दौरा है। मेरे सेल-मेट को बैकस्टैबिंग करना सहयोग की तुलना में बहुत बेहतर रणनीति है क्योंकि यह MY SCORE (+4) में मदद करता है । बोनस - वह (1) पटक दिया जाता है! अगर मैं उसके लिए अपनी गर्दन बाहर करता हूं, तो मैं (+2) और ढीला (-1) हासिल करने के लिए खड़ा हूं। इसके लिए सांख्यिकीय रूप से बैकस्टैबिंग को पुरस्कृत किया जाता है।

लेकिन यह इष्टतम है?

EVER (इस स्कोरिंग सिस्टम के तहत) को-ऑपरेट करने का कोई कारण नहीं है।

  • यदि आपने क्लैम को गलत करने के लिए चुना है, तो आप ढीले हो जाते हैं।
  • यदि आप चूहे हैं, तो कम से कम आप कुछ भी ढीला न करें।
  • यदि आप चूहे और वह गूंगा है, तो आप 2x से अधिक लाभ प्राप्त करते हैं यदि आप एक अच्छे पाल थे।

KOTH प्रणाली में, रिटर्न का अधिकतमकरण आवश्यक है। यहां तक ​​कि अगर आपके पास दो बॉट्स हैं, जो पूरी तरह से सिंक और को-ऑपरेट करते हैं, तो उनके व्यक्तियों का स्कोर अभी भी केवल उनकी स्पोर्ट्समैनशिप के लिए 200 अंकों तक बढ़ाया जाएगा। दूसरी ओर एक शैतान 200 के औसत मामले और अधिकतम 400 के साथ कम से कम 100 अंक अर्जित करेगा, और अपने विरोधियों को प्रत्येक 100 अंक तक खर्च करेगा! तो व्यावहारिक रूप से, शैतान वास्तव में 300 का औसत खेल स्कोर करता है, 500 तक घूमता है।

निचला रेखा - समय बताएगा

मेरे लिए, ऐसा लग रहा है कि स्कोरिंग को फिर से माना जाना चाहिए, जैसे शैतान ने दिन निकाला। सहयोग स्कोर को 3 तक बढ़ाकर सभी ऐसा कर सकते हैं। हालांकि, शैतानों का पता लगाना और उन्हें अपने पूरे 400 को पावलोव और स्पाइट शो के रूप में स्कोर करने से रोकना संभव है। क्या मैं यह साबित कर सकता हूं कि या तो कोई उनके विश्वास को सही ठहराने के लिए उनके सहयोग के लिए पर्याप्त बिंदु उठाएगा? नहीं। यह सब दावेदारों के अंतिम क्षेत्र पर निर्भर है।

जीएल, एचएफ!

और कृपया इस पोस्ट के लिए अपना बुरा करें। मैं इस पर अपना वरिष्ठ पत्र लिखना चाहता हूं जब सभी ने कहा और किया।

संस्करण इतिहास

  1. एक मार्जिन वैरिएबल जोड़ा गया जो डचेबगरी के लिए लिस्पर की सहिष्णुता को बेतरतीब ढंग से बदल देता है।
  2. को-ऑपरेटिव विरोधियों के साथ दाहिने पैर पर उतरने के लिए पहले दो राउंड के लिए क्लैम को अपडेट करना
  3. विरोधियों के एक मानक समूह के खिलाफ उनके अधिकतम संचयी स्कोर के आधार पर यादृच्छिक थ्रेशोल्ड जनरेटर के लिए सबसे मजबूत मूल्यों को खोजने के लिए एक आनुवंशिक एल्गोरिथ्म का उपयोग किया। उनके सहित अद्यतन पोस्ट किया।

LISPER का आधिकारिक संस्करण

LISPER का विकास संस्करण


स्कोरिंग खेल के विभिन्न रूपों में भिन्न होता है। मैंने सहयोग प्रोत्साहन बढ़ाने के साथ चारों ओर खेल किया , और मैं मानता हूं कि यह चुनी गई रणनीतियों पर प्रभाव डालेगा। अच्छी खबर: आप स्कोरर को पकड़ सकते हैं, अपने खुद के नियम निर्धारित कर सकते हैं और इसे आजमा सकते हैं। सिद्धांत रूप में आप एक इनाम भी दे सकते हैं।
dmckee

fink install clisp :: बार-बार उंगलियां
चटकाना

1
@ जोश - लिंक के लिए धन्यवाद। मैंने इस दुविधा पर कुछ अन्य विकिपीडिया पृष्ठ पढ़े, लेकिन मुझे वह भाग याद नहीं रहा। एक नियम बग मैंने अभी देखा, फाइलसिस्टम का उपयोग करके प्रविष्टियों के खिलाफ कोई नियम नहीं हैं। यह हाथ मिलाने की तर्ज पर अधिक कुशल सहयोग की क्षमता पैदा करता है।
गिरफ्तारी

3
There is no reason to EVER (under this scoring system) co-operateकेवल आधा सही है। यदि आप जानते हैं कि आपका प्रतिद्वंद्वी इतिहास को ध्यान में नहीं रखता है (परी, शैतान, यादृच्छिक) तो आपको हमेशा दोष देना चाहिए। यदि आपका प्रतिद्वंद्वी इतिहास को ध्यान में रखता है और आप सिंक कर सकते हैं तो आप बेहतर कर सकते हैं। मेरे पास कुछ विचार हैं जो यह पता लगाने के लिए घूमते हैं कि प्रतिद्वंद्वी तर्कसंगत है या सुपरट्रेशनल है।
पीटर टेलर

1
क्या आपको नवीनतम संस्करण के साथ समय के 3/20 वें भाग में विभाजित-शून्य त्रुटियाँ नहीं मिल रही हैं? जब भी (random 20)2, 5, या 8 देता है, (/ (+1 rand-num) 10)0.3, 0.6, 0.9 है, और 0.3 के साथ विभाजन का शेष 0 है; तो (floor *dbag* *margin*)मर जाता है।
जोश कैसवेल

5

अविश्वास (भिन्न)

यह एक साल पहले मेरे अपने परीक्षणों में पहले आया था (फिर मैं 11 वीं कक्षा में था और ठीक इसी पर एक छोटे से शोध किया था, अन्य छात्रों द्वारा तैयार की गई रणनीतियों का उपयोग करके)। यह क्रम से शुरू होता है tcc(और इसके बाद जैसे तैसे टाट के लिए खेलता है।

भयानक कोड के लिए माफी; अगर कोई इसे छोटा कर सकता है जबकि बिल्कुल इसे गोल्फ नहीं कर रहा है, तो मैं आभारी रहूंगा :-)

#include <stdio.h>
#include <string.h>

int main(int argc, char* argv[]) {
    if (argc == 1)
        printf("t\n");
    else switch (strlen(argv[1])) {
        case 0:
            printf("t\n");
            break;
        case 1:
        case 2:
            printf("c\n");
            break;
        default:
            if (argv[1][0] == 'R' || argv[1][0] == 'E')
                printf("t\n");
            else
                printf("c\n");
            break;
    }

    return 0;
}

लंबाई 1 और 2 पर डुप्लिकेट कोड की आवश्यकता नहीं है: इसके माध्यम से उपयोग करें case 1: case2: printf(...); break;:। और जीसीसी string.hउपयोग की स्पष्ट घोषणा चाहता है strlen। किसी भी मामले में मेरे पास यह चल रहा है।
dmckee

आह, यह सच है। मुझे यकीन नहीं था कि बहुत पहले दौर का पता कैसे लगाया जा सकता है, हालांकि, एक खाली पहला तर्क (इतिहास) है या कोई भी नहीं है।
जॉय

मुझे यकीन नहीं है। यह जो भी अजगर Popen(p+" "+h,stdout=subprocess.PIPE,shell=True)कब के साथ करता है h = ''। मैं अनुमान लगा रहा हूं argc=1
dmckee

1
टाट की कमजोरी के लिए टाइट पर चौकोर लक्ष्य बनाते हुए यह प्रारंभिक अनुक्रम काफी अच्छा विचार है। आप उस पर एक छोटे से नेतृत्व प्राप्त करते हैं, फिर उसके बाद अपना रास्ता खेलते हैं।
जोश कैसवेल

1
@ जोश, छोटे नेतृत्व कहाँ है? टी 4 टी के खिलाफ यह एसआरके शुरू करता है और फिर के। के साथ जारी रहता है लेकिन एसआर प्रत्येक खिलाड़ी के लिए 3 अंक के बराबर है।
पीटर टेलर

5

एंटी- T42T मिसाइल

#!/usr/bin/python

"""
Anti-T42T Missile, by Josh Caswell

That Tit-for-two-tats, what a push-over!
  T42T: ccctcctcc...
AT42TM: cttcttctt...
        KSSRSSRSS...
"""
import sys
try:
    history = sys.argv[1]
except IndexError:
    print 'c'
    sys.exit(0)

if history[:2] == 'SS':
    print 'c'
else:
    print 't'

योद्धाओं के आधार सेट के खिलाफ उचित रूप से अच्छी तरह से करता है: एंजेल को मारता है, शैतान द्वारा थोड़ा पीटा जाता है (लेकिन अपने स्कोर को कम रखता है), आम तौर पर रैंड को आसानी से मारता है, और बस मुश्किल से टाट के लिए टाइट को हरा देता है। खुद के खिलाफ खेलने पर खराब प्रदर्शन करता है।


मैंने एक संपादन प्रस्तुत किया है जो इसे वास्तव में काम करता है :) इसे अनुमोदित करने की आवश्यकता है।
केसी

@ कैसी: अच्छा भगवान, मैं इस समस्या के लिए मेरे उत्साह में बहुत सारी बेवकूफियाँ कर रहा हूँ! धन्यवाद, लेकिन आपने श-बैंग को क्यों खत्म किया?
जोश कैसवेल

एर, वह एक दुर्घटना थी। मैं इसे वापस जोड़ दूँगा।
केसी

@ कैसी: कोई बात नहीं। मैं इसे करूँगा। एक डॉक्टर स्ट्रिंग वैसे भी जोड़ने की जरूरत है।
जोश कैसवेल

4

कन्वर्जेंस

शुरू में अच्छा लगता है, फिर प्रतिद्वंद्वी के इतिहास पर एक नज़र के साथ यादृच्छिक रूप से खेलता है।

/* convergence
 *
 * A iterated prisoners dilemma warrior for
 *
 * Strategy is to randomly chose an action based on the opponent's
 * history, weighting recent rounds most heavily. Important fixed
 * point, we should never be the first to betray.
 */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <string.h>

int main(int argc, char**argv){
  srandom(time(0)+getpid()); /* seed the PRNG */
  unsigned long m=(1LL<<31)-1,q,p=m;
  if (argc>1) {
    size_t i,l=strlen(argv[1]);
    for (i=l; --i<l; ){
      switch (argv[1][i]) {
      case 'R':
      case 'E':
    q = 0;
    break;
      case 'K':
      case 'S':
    q = m/3;
    break;
      }
      p/=3;
      p=2*p+q;
    }
  }
  /* printf("Probability of '%s' is %g.\n",argv[1],(double)p/(double)m); */
  printf("%c\n",(random()>p)?'t':'c'); 
  return 0;
}

मैंने इतिहास पर भार डालने का प्रयास किया है, लेकिन इसे ठीक से अनुकूलित नहीं किया है।


4

शार्क

#!/usr/bin/env python

"""
Shark, by Josh Caswell

Carpe stultores.
"""

import sys

HUNGER = 12

try:
    history = sys.argv[1]
except IndexError:
    print 'c'
    sys.exit(0)

if history.count('S') > HUNGER:
    print 't'
else:
    print 'c' if history[0] in "SK" else 't'

बेस रोस्टर के खिलाफ काफी अच्छा करता है।


... क्लैम जब्त?
arrdem

:) मूर्खों को जब्त करो।
जोश कैसवेल

वर्तमान क्षेत्र में लगातार 2 स्थान रखने के लिए +1।
गिरफ्तारी

3

पावलोव - विन स्टे, लूज स्विच

पहले मोड़ पर यह सहयोग करता है, और फिर यह सहयोग करता है अगर और केवल अगर दोनों खिलाड़ियों ने पिछले चाल में एक ही विकल्प चुना।

#!/usr/bin/python
import sys

if len(sys.argv) == 1:
    print 'c'
else:
    hist = sys.argv[1]
    if hist[0] == 'K' or hist[0] == 'E':
        print 'c'
    else:
        print 't'

क्या यह उपयोग नहीं होना चाहिए hist[0]( hist[-1]हमेशा गोल का पहला कदम है)?
जोश कैसवेल

अरे वाह, आप सही कह रहे हैं। मैंने मान लिया कि इनपुट स्ट्रिंग में स्ट्रिंग के अंत में सबसे हाल के दौर थे, शुरुआत नहीं। फिक्स्ड।
केसी

3

चोरों के बीच सम्मान

#!/usr/bin/env python

"""
Honor Among Thieves, by Josh Caswell

I'd never sell out a fellow thief, but I'll fleece a plump mark,
and I'll cut your throat if you try to cross me.
"""

from __future__ import division
import sys

PLUMPNESS_FACTOR = .33
WARINESS = 10

THIEVES_CANT = "E" + ("K" * WARINESS)

try:
    history = sys.argv[1]
except IndexError:
    history = ""

if history:
    sucker_ratio = (history.count('K') + history.count('S')) / len(history)
    seem_to_have_a_sucker = sucker_ratio > PLUMPNESS_FACTOR


# "Hey, nice t' meetcha."
if len(history) < WARINESS:
    #"Nice day, right?"
    if not set(history).intersection("RE"):
        print 'c'
    # "You sunnuvab..."
    else:
        print 't'

# "Hey, lemme show ya this game. Watch the queen..."
elif len(history) == WARINESS and seem_to_have_a_sucker:
    print 't'

# "Oh, s#!t, McWongski, I swear I din't know dat were you."
elif history[-len(THIEVES_CANT):] == THIEVES_CANT:

    # "Nobody does dat t' me!"
    if set(history[:-len(THIEVES_CANT)]).intersection("RE"):
        print 't'
    # "Hey, McWongski, I got dis job we could do..."
    else:
        print 'c'

# "Do you know who I am?!"
elif set(history).intersection("RE"):
    print 't'

# "Ah, ya almos' had da queen dat time. One more try, free, hey? G'head!"
elif seem_to_have_a_sucker:
    print 't'

# "Boy, you don't say much, do ya?"
else:
    print 'c'

ध्यान दें कि THIEVES_CANTअनिवार्य रूप से एक हैंडशेक है, हालांकि यह केवल एक कूपरेटर के खिलाफ खेलने पर उभरेगा। हालाँकि, यह परजीवी समस्या से बचा जाता है बाद में पार करने के लिए जाँच करके। बेस रोस्टर के खिलाफ काफी अच्छा करता है।


+1 मज़बूती से उछाल उछाल करने वाला पहला स्ट्रैट होने के लिए। जीत का औसत मार्जिन - 300 पीटी।
arrdem

वर्तमान क्षेत्र के एक टूर्नामेंट रन में सबसे मजबूत माना जाता है।
पीटर टेलर

वास्तव में, नहीं, ड्र्यूड अब यह है कि मैंने स्कोरर में बग को ठीक कर दिया है।
पीटर टेलर

@rmckenzie, @Peter: गीज़, सच? मैं सिर्फ व्यक्तित्व के लिए जा रहा था।
जोश कैसवेल

@ जोश - कोई और नहीं .... नए स्कोरिंग कोड पर @ केसी का स्कोरिंग कोड लिस्पर शीर्ष पर है और इसके बाद शार्क है।
गिरफ्तारी

3

"Probabimatic"

सहयोग करने से शुरू होता है, फिर जो भी विकल्प चुनता है वह इसे उच्चतम अपेक्षित मूल्य देता है। सरल।

#include <stdio.h>

void counts(char* str, int* k, int* r, int* s, int* e) {
    *k = *r = *s = *e = 0;
    char c;
    for (c = *str; c = *str; str++) {
        switch (c) {
            case 'K': (*k)++; break;
            case 'R': (*r)++; break;
            case 'S': (*s)++; break;
            case 'E': (*e)++; break;
        }
    }
}

// Calculates the expected value of cooperating and defecting in this round. If we haven't cooperated/defected yet, a 50% chance of the opponent defecting is assumed.
void expval(int k, int r, int s, int e, float* coop, float* def) {
    if (!k && !r) {
        *coop = .5;
    } else {
        *coop = 2 * (float)k / (k + r) - (float)r / (k + r);
    }
    if (!s && !e) {
        *def = 2.5;
    } else {
        *def = 4 * (float)s / (s + e) + (float)e / (s + e);
    }
}

int main(int argc, char** argv) {
    if (argc == 1) {
        // Always start out nice.
        putchar('c');
    } else {
        int k, r, s, e;
        counts(argv[1], &k, &r, &s, &e);
        float coop, def;
        expval(k, r, s, e, &coop, &def);
        if (coop > def) {
            putchar('c');
        } else {
            // If the expected values are the same, we can do whatever we want.
            putchar('t');
        }
    }
    return 0;
}

सहयोग करके शुरू किया गया था, लेकिन अब ऐसा लगता है कि वास्तव में दोष करना बेहतर काम करता है। संपादित करें: ओह रुको, यह वास्तव में नहीं है।


1
एक और सांख्यिकीविद! आइए देखें कि यह अपने साथी कैलकुलेटर के खिलाफ कैसे खेलता है !
जोश कैसवेल

वैसे, अगर आप बदल for (char c = *str;जाते हैं char c; for (c = *str;तो gcc यह शिकायत किए बिना संकलित करेगा कि इसे C99 मोड में डालने की आवश्यकता है।
पीटर टेलर

3

हाइपररेशनल वाष्प

जावा में लागू किया गया क्योंकि मुझे यकीन नहीं था कि डेटा संरचनाएं कितनी जटिल थीं। अगर यह किसी के लिए एक समस्या है, तो मुझे लगता है कि मैं इसे बहुत सारी समस्याओं के बिना भी मिटा सकता हूं क्योंकि अंत में यह वास्तव में सरल साहचर्य सरणियों का उपयोग करता है।

नोट : मैंने जावा को संभालने के लिए मेरे पैच के नवीनतम संस्करण के अनुरूप एक पैकेज से इसे हटा दिया है। यदि आप एक जावा समाधान पोस्ट करना चाहते हैं जो आंतरिक कक्षाओं का उपयोग करता है तो आपको पैच को पैच करना होगा।

import java.util.*;

public class HyperrationalWasp
{
    // I'm avoiding enums so as not to clutter up the warriors directory with extra class files.
    private static String Clam = "c";
    private static String Rat = "t";
    private static String Ambiguous = "x";

    private static final String PROLOGUE = "ttc";

    private static int n;
    private static String myActions;
    private static String hisActions;

    private static String decideMove() {
        if (n < PROLOGUE.length()) return PROLOGUE.substring(n, n+1);

        // KISS - rather an easy special case here than a complex one later
        if (mirrorMatch()) return Clam;
        if (n == 99) return Rat; // This is rational rather than superrational

        int memory = estimateMemory();
        if (memory == 0) return Rat; // I don't think the opponent will punish me
        if (memory > 0) {
            Map<String, String> memoryModel = buildMemoryModel(memory);
            String myRecentHistory = myActions.substring(0, memory - 1);
            // I don't think the opponent will punish me.
            if (Clam.equals(memoryModel.get(Rat + myRecentHistory))) return Rat;
            // I think the opponent will defect whatever I do.
            if (Rat.equals(memoryModel.get(Clam + myRecentHistory))) return Rat;
            // Opponent will cooperate unless I defect.
            return Clam;
        }

        // Haven't figured out opponent's strategy. Tit for tat is a reasonable fallback.
        return hisAction(0);
    }

    private static int estimateMemory() {
        if (hisActions.substring(0, n-1).equals(hisActions.substring(1, n))) return 0;

        int memory = -1; // Superrational?
        for (int probe = 1; probe < 5; probe++) {
            Map<String, String> memoryModel = buildMemoryModel(probe);
            if (memoryModel.size() <= 1 || memoryModel.values().contains(Ambiguous)) {
                break;
            }
            memory = probe;
        }

        if (memory == -1 && isOpponentRandom()) return 0;

        return memory;
    }

    private static boolean isOpponentRandom() {
        // We only call this if the opponent appears not have have a small fixed memory,
        // so there's no point trying anything complicated. This is supposed to be a Wilson
        // confidence test, although my stats is so rusty there's a 50/50 chance that I've
        // got the two probabilities (null hypothesis of 0.5 and observed) the wrong way round.
        if (n < 10) return false; // Not enough data.
        double p = count(hisActions, Clam) / (double)n;
        double z = 2;
        double d = 1 + z*z/n;
        double e = p + z*z/(2*n);
        double var = z * Math.sqrt(p*(1-p)/n + z*z/(4*n*n));
        return (e - var) <= 0.5 * d && 0.5 * d <= (e + var);
    }

    private static Map<String, String> buildMemoryModel(int memory) {
        // It's reasonable to have a hard-coded prologue to probe opponent's behaviour,
        // and that shouldn't be taken into account.
        int skip = 0;
        if (n > 10) skip = n / 2;
        if (skip > 12) skip = 12;

        Map<String, String> memoryModel = buildMemoryModel(memory, skip);
        // If we're not getting any useful information after skipping prologue, take it into account.
        if (memoryModel.size() <= 1 && !memoryModel.values().contains(Ambiguous)) {
            memoryModel = buildMemoryModel(memory, 0);
        }
        return memoryModel;
    }

    private static Map<String, String> buildMemoryModel(int memory, int skip) {
        Map<String, String> model = new HashMap<String, String>();
        for (int off = 0; off < n - memory - 1 - skip; off++) {
            String result = hisAction(off);
            String hypotheticalCause = myActions.substring(off+1, off+1+memory);
            String prev = model.put(hypotheticalCause, result);
            if (prev != null && !prev.equals(result)) model.put(hypotheticalCause, Ambiguous);
        }
        return model;
    }

    private static boolean mirrorMatch() { return hisActions.matches("c*ctt"); }
    private static String myAction(int idx) { return myActions.substring(idx, idx+1).intern(); }
    private static String hisAction(int idx) { return hisActions.substring(idx, idx+1).intern(); }
    private static int count(String actions, String action) {
        int count = 0;
        for (int idx = 0; idx < actions.length(); ) {
            int off = actions.indexOf(action, idx);
            if (off < 0) break;
            count++;
            idx = off + 1;
        }
        return count;
    }

    public static void main(String[] args) {
        if (args.length == 0) {
            hisActions = myActions = "";
            n = 0;
        }
        else {
            n = args[0].length();
            myActions = args[0].replaceAll("[KR]", Clam).replaceAll("[SE]", Rat);
            hisActions = args[0].replaceAll("[KS]", Clam).replaceAll("[RE]", Rat);
        }

        System.out.println(decideMove());
    }

}

इसे चलाने के लिए मैंने जो बदलाव किए, वे हैं:

17a18
> import re
22a24
> GCC_PATH = 'gcc'                #path to c compiler
24c26
< JAVA_PATH = '/usr/bin/java'   #path to java vm
---
> JAVA_PATH = '/usr/bin/java'     #path to java vm
50,55c52,59
<         elif ext == '.java':
<             if subprocess.call([JAVAC_PATH, self.filename]) == 0:
<                 print 'compiled java: ' + self.filename
<                 classname = re.sub('\.java$', '', self.filename)
<                 classname = re.sub('/', '.', classname);
<                 return JAVA_PATH + " " + classname
---
>         elif ext == '.class':
>             # We assume further down in compilation and here that Java classes are in the default package
>             classname = re.sub('.*[/\\\\]', '', self.filename)
>             dir = self.filename[0:(len(self.filename)-len(classname))]
>             if (len(dir) > 0):
>                 dir = "-cp " + dir + " "
>             classname = re.sub('\\.class$', '', classname);
>             return JAVA_PATH + " " + dir + classname
196c200,201
<         if os.path.isdir(sys.argv[1]):
---
>         warriors_dir = re.sub('/$', '', sys.argv[1])
>         if os.path.isdir(warriors_dir):
198,200c203,211
<             for foo in os.listdir("./src/"): # build all c/c++ champs first.
<                 os.system(str("gcc -o ./warriors/" + os.path.splitext(os.path.split(foo)[1])[0] + " ./src/" + foo ))
<                 #print str("gcc -o ./warriors/" + os.path.splitext(os.path.split(foo)[1])[0] + " ./src/" + foo )
---
>             for foo in os.listdir("./src/"): # build all c/c++/java champs first.
>                 filename = os.path.split(foo)[-1]
>                 base, ext = os.path.splitext(filename)
>                 if (ext == '.c') or (ext == '.cpp'):
>                     subprocess.call(["gcc", "-o", warriors_dir + "/" + base, "./src/" + foo])
>                 elif (ext == '.java'):
>                     subprocess.call([JAVAC_PATH, "-d", warriors_dir, "./src/" + foo])
>                 else:
>                     print "No compiler registered for ", foo
202,203c213,214
<             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)]
---
>             print "Finding warriors in " + warriors_dir
>             players = [warriors_dir+"/"+exe for exe in os.listdir(warriors_dir) if (os.access(warriors_dir+"/"+exe,os.X_OK) or os.path.splitext(exe)[-1] == '.class')]

मेरे चैलेंजर फंक्शन में तह करने के लिए @rmckenzie को धन्यवाद।


बस शैली की बात है .... .java फ़ाइल को "स्रोत" माना जाना चाहिए और ./src निर्देशिका और अंतिम .class में ले जाया गया ./warriors फ़ोल्डर को .c फ़ाइलों पर उपयोग की गई समान सबस्क्रिप्ट द्वारा, या। क्या जावा की व्याख्या की गई है और जैसे कि .java और .class एक साथ रहते हैं? किसी भी स्थिति में स्कोरर को अच्छा बदलाव ... उन्हें रेपो स्टेट में होगा।
20

@rmckenzie, अच्छी बात: हाँ, तकनीकी रूप से यह संकलित है। मेरे पास योद्धाओं की निर्देशिका में स्रोत फ़ाइल होने का कारण यह है कि अजगर फाइलें बहुत अधिक हैं - और वे संकलित हैं। यदि आप चाहते हैं कि मैं यह जांच सकता हूं कि इसे / संकलन / ./rc//ririors से संकलित करने के लिए क्या परिवर्तन आवश्यक हैं - लेकिन इसके लिए कुछ संकलक तर्क की आवश्यकता है, क्योंकि जावा डिफ़ॉल्ट रूप से मानता है कि निर्देशिका संरचना पैकेज (नाम स्थान) को दर्शाती है।
पीटर टेलर

@peter, मुझे बस आश्चर्य हो रहा था ... योद्धाओं में पाया जाता है ।/warriors * nix 777, या अन्यथा निष्पादन योग्य होने के कारण। पायथन और लिस्प लिपि NOMINALLY प्रदर्शन के लिए संकलित हैं, लेकिन उनकी प्राकृतिक (स्रोत) स्थिति में निष्पादन योग्य हैं। किसी गैर-जावा उपयोगकर्ता के रूप में मेरी जानकारी के लिए, .java फ़ाइलों के पास वे अनुमतियां नहीं हैं और इसलिए वे दिखाई नहीं देंगी। यही सी हैक के लिए मौजूद है ... क्योंकि संकलन एक अलग कदम है। तो हाँ। अगर आप उस बदलाव को देखेंगे तो मैं इसकी बहुत सराहना करूंगा।
REPO

अपने कोड और एक chmod 777'd ततैया का उपयोग करके, JVM ने इस सुंदरता को फेंक दिया। Exception in thread "main" java.lang.NoClassDefFoundError: //warriors/HyperrationalWasp Caused by: java.lang.ClassNotFoundException: ..warriors.HyperrationalWasp at java.net.URLClassLoader$1.run(URLClassLoader.java:217) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:205) at java.lang.ClassLoader.loadClass(ClassLoader.java:321) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294) at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
गिरफ्तारी

@rmckenzie, यह अजीब है। वैसे भी, मुझे लगता है कि मैं बहुत जल्द आपके लिए एक पैच होगा। मुझे लोडिंग कोड को हैक करना है, क्योंकि क्लास की फाइलें निष्पादन योग्य नहीं हैं। और अगर कोई अन्य जावा प्रविष्टियां आंतरिक कक्षाओं का उपयोग करती हैं तो यह टूट जाएगी।
पीटर टेलर

3

Soft_majo

ठीक है, मानक रणनीतियों का एक और, बस लाइन-अप को पूरा करने के लिए।

यह वह कदम है जिसे प्रतिद्वंद्वी ने सबसे अधिक बनाया है; यदि यह सहयोग करता है।

#include <stdio.h>
#include <string.h>

int main(int argc, char * argv[]) {
    int d = 0, i, l;

    if (argc == 1) {
        printf("c\n");
    } else {
        l = strlen(argv[1]);

        for (i = 0; i < l; i++)
            if (argv[1][i] == 'R' || argv[1][i] == 'E')
                d++;

        printf("%c\n", d > l/2 ? 't' : 'c');
    }
}

आपका कोड soft_majo है, लेकिन आपका वर्णन hard_majo है।
पीटर टेलर

पीटर: ईक, सॉरी; तय की।
जॉय

3

यादृच्छिक चूसने वाला

यदि प्रतिद्वंद्वी बहुत बार (दहलीज) को दोष देता है, तो यह एक दोष होगा, लेकिन बेतरतीब ढंग से हर अब और फिर बैकस्टैबिंग की कोशिश करेगा।

जावा और लिस्प खिलाड़ियों को छोड़कर हर किसी के खिलाफ काफी अच्छी तरह से करता है (जो कि मुझे चलाने के लिए नहीं मिल सकता है, न तो जावा और टेस्ट मशीन पर लिस्प के कारण); अधिकांश समय कम से कम।

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>

#define THRESHOLD 7
#define RAND 32

int main(int c, char * a []) {
    int r;
    char * x;
    int d = 0;

    srandom(time(0) + getpid());

    if (c == 1) {
        printf("c\n");
        return 0;
    }

    for (x = a[1]; *x; x++)
        if (*x == 'R' || *x == 'E') d++;

    if (d > THRESHOLD || random() % 1024 < RAND || strlen(a[1]) == 99)
        printf("t\n");
    else
        printf("c\n");

    return 0;
}

HyperrationalWasp के खिलाफ यह आम तौर पर शैतान के खिलाफ के रूप में होगा। यह हर समय बस सहयोग करना शुरू कर देता है, इसलिए मुझे लगता है कि यह परी है और हमले पर जाना है। फिर जब यह दहलीज से टकराएगा तो आप शैतान मोड में बदल जाएंगे और मैं t4t में बदल जाऊंगा। यदि यह पहले 6 चालों में बेतरतीब ढंग से बैकस्टैब्स करता है तो मैं t4t में स्विच करूँगा इससे पहले कि आप शैतान में स्विच करें, लेकिन इसके बारे में अधिक नहीं है।
पीटर टेलर

1
पीटर: ठीक है, मैं शायद ही कभी एक-दूसरे के खिलाफ रणनीतियों का सीधा परीक्षण करता हूं, क्योंकि समग्र क्षेत्र का रणनीति प्रदर्शन पर काफी प्रभाव है। वर्तमान में यह ज्यादातर मेरे परीक्षणों में पहले स्थान के लिए क्रमिक और ड्र्यूड के साथ लड़ता है।
जॉय

वाष्प के खिलाफ 200 और धीरे-धीरे दोनों स्कोर लगभग 200; यादृच्छिक चूसने वाला 83 के बारे में स्कोर करेगा।
पीटर टेलर

2

पुराने बात

#!/usr/bin/env python

"""
BYGONES, entry to 1P5 Iterated Prisoner's Dilemma, by Josh Caswell

Cooperates at first, plays as Tit for Tat for `bygones * 2` rounds, then checks 
history: if there's too much ratting, get mad and defect; too much 
suckering, feel bad and cooperate.
"""

bygones = 5

import sys

# React to strangers with trust.
try:
    history = sys.argv[1]
except IndexError:
    print 'c'
    sys.exit(0)

replies = { 'K' : 'c', 'S' : 'c',
            'R' : 't', 'E' : 't' }

# Reply in kind.
if len(history) < bygones * 2:
    print replies[history[0]]
    sys.exit(0)

# Reflect on past interactions.
faithful_count = history.count('K')
sucker_count = history.count('S')
rat_count = history.count('R')

# Reprisal. 
if rat_count > faithful_count + bygones:
    # Screw you!
    print 't'
    sys.exit(0)

# Reparation.
if sucker_count > faithful_count + bygones:
    # Geez, I've really been mean.
    print 'c'
    sys.exit(0)

# Resolve to be more forgiving.
two_tats = ("RR", "RE", "ER", "EE")
print 't' if history[:2] in two_tats else 'c'

bygonesअभी तक के लिए सबसे अच्छा मूल्य काम नहीं किया है । मुझे यह जीतने की रणनीति होने की उम्मीद नहीं है , लेकिन मुझे लगता है कि मुझे लगता है कि वास्तविक जीवन में "अच्छा" जैसी रणनीति के प्रदर्शन में दिलचस्पी है। भविष्य के संशोधन में आपसी बचावों की संख्या की जाँच करना भी शामिल हो सकता है।


2

वैम्पायर की मदद करें

#!/usr/bin/env python

"""
Help Vampire, entry to 1P5 Iterated Prisoner's Dilemma,
by Josh Caswell.

1. Appear Cooperative 2. Acknowledge Chastisement 
3. Act contritely 4. Abuse charity 5. Continual affliction
"""

import sys
from os import urandom

LEN_ABASHMENT = 5

try:
    history = sys.argv[1]
except IndexError:
    print 'c'    # Appear cooperative
    sys.exit(0)

# Acknowledge chastisement
if history[0] in "RE":
    print 'c'
# Act contritely
elif set(history[:LEN_ABASHMENT]).intersection(set("RE")):
    print 'c'
# Abuse charity
elif history[0] == 'S':
    print 't'
# Continual affliction
else:
    print 't' if ord(urandom(1)) % 3 else 'c'

खुद के खिलाफ खड़ा होने पर एक आश्चर्यजनक विषम परिणाम होता है। यदि केवल इस समाधान को वास्तविक जीवन में लागू किया जा सकता है।


2

ड्र्यूड

#!/usr/bin/env python

"""
Druid, by Josh Caswell

Druids are slow to anger, but do not forget.
"""

import sys
from itertools import groupby

FORBEARANCE = 7
TOLERANCE = FORBEARANCE + 5

try:
    history = sys.argv[1]
except IndexError:
    history = ""

# If there's been too much defection overall, defect
if (history.count('E') > TOLERANCE) or (history.count('R') > TOLERANCE):
    print 't'
# Too much consecutively, defect
elif max([0] + [len(list(g)) for k,g in     # The 0 prevents dying on []
                groupby(history) if k in 'ER']) > FORBEARANCE:
    print 't'
# Otherwise, be nice
else:
    print 'c'

बेस रोस्टर के खिलाफ काफी अच्छी तरह से करता है।


2

अनाड़ी

#!/usr/bin/env python

"""
Simpleton, by Josh Caswell

Quick to anger, quick to forget, unable to take advantage of opportunity.
"""

import sys
from os import urandom

WHIMSY = 17

try:
    history = sys.argv[1]
except IndexError:
    if not ord(urandom(1)) % WHIMSY:
        print 't'
    else:
        print 'c'
    sys.exit(0)

if history[0] in "RE":
    print 't'
elif not ord(urandom(1)) % WHIMSY:
    print 't'
else:
    print 'c'

बेस रोस्टर के खिलाफ ठीक है।


2

छोटी सी शेमर

#!/usr/bin/env python

"""
The Little Schemer, by Josh Caswell

No relation to the book. Keeps opponent's trust > suspicion 
by at least 10%, trying to ride the line.
"""

from __future__ import division
import sys
from os import urandom

out = sys.stderr.write

def randrange(n):
    if n == 0:
        return 0
    else:
        return ord(urandom(1)) % n

try:
    history = sys.argv[1]
except IndexError:
    print 'c'
    sys.exit(0)

R_count = history.count('R')
S_count = history.count('S')
K_count = history.count('K')
E_count = history.count('E')

# Suspicion is _S_ and E because it's _opponent's_ suspicion
suspicion = (S_count + E_count) / len(history)
# Likewise trust
trust = (K_count + R_count) / len(history)

if suspicion > trust:
    print 'c'
else:
    projected_suspicion = (1 + S_count + E_count) / (len(history) + 1)
    projected_trust = (1 + K_count + R_count) / (len(history) + 1)

    leeway = projected_trust - projected_suspicion
    odds = int(divmod(leeway, 0.1)[0])

    print 't' if randrange(odds) else 'c'

बेस सेट के खिलाफ खराब है, लेकिन इसके लक्ष्य के खिलाफ काफी अच्छी तरह से। जाहिर है, स्कीम में नहीं लिखा है।


मुझे एक चुनौती क्यों समझ में आती है?
arrdem

इस बग्गर को हरा दिया .... लिस्पर में दहलीज को बेतरतीब कर दिया।
ए.डी.एम.

@rmckenzie: लेकिन इसने आपके खेल को बाकी क्षेत्र के मुकाबले कैसे प्रभावित किया? एक-दूसरे के साथ काम करने वाले पर्याप्त सहयोगियों के साथ, विरोधाभास या ईर्ष्या की रणनीति खराब होने लगेगी। आपको अभी भी एक निश्चित ऊपरी सीमा मिल गई है, जिसका भी फायदा उठाया जा सकता है।
जोश कैसवेल

यदि आप वर्तमान लिस्पर के माध्यम से पढ़ते हैं, तो यह ईर्ष्या की तुलना में अधिक रक्षात्मक है। यह उन विरोधियों का पता लगाने की कोशिश करता है जो इस तरह सांख्यिकीय रूप से विश्वासघाती संघर्ष का पीछा कर रहे हैं, और उसके बाद ही आग लौटते हैं। यह CC उद्घाटन चोरों के साथ दाहिने पैर से उतरने के लिए डिज़ाइन किया गया है, और इसके साथ खेलने के लिए अधिकांश सहकारी स्ट्रेट्स को समझाने का अतिरिक्त लाभ है।
गिरफ्तारी

@rmckenzie: बहुत अच्छा! मैं इसे एक स्पिन दूंगा।
जोश कैसवेल

1

टिट टू टेट

एक और पुराना पसंदीदा

#!/usr/bin/env python

"""
Tit For Two Tats, entry to 1P5 Iterated Prisoner's Dilemma, 
    by Josh Caswell (not an original idea).

Cooperates unless opponent has defected in the last two rounds.
"""

import sys
try:
    history = sys.argv[1]
except IndexError:
    history = ""

two_tats = ("RR", "RE", "ER", "EE")

if len(history) < 2:
    print 'c'
else:
    print 't' if history[:2] in two_tats else 'c'

जब तक आप किसी फ़ंक्शन के अंदर नहीं होते हैं तब तक आप रिटर्न नहीं कर सकते। शायद उपयोग करें sys.exit(0)? या बस इसे खत्म होने दो।संपादित करें: इसके अलावा आपके कार्यक्रम का पहला आह्वान बिना किसी इतिहास के होता है, जो IndexErrorजब आप करते हैं, तब होता है argv[1]
केसी

आपने len(history)<2खंड को छोड़ दिया होगा , क्योंकि वह अंतिम elseभाग जैसा दिखता है ।
dmckee

@Casey @dmckee बग फिक्स के लिए धन्यवाद। returnविशेष रूप से मुझ पर "दूह" !
जोश कैसवेल

@ मॉमकी: यह एक और अधिक जटिल चीज़ के हिस्से के रूप में शुरू हुआ, और तब मुझे एहसास हुआ कि मैंने दो टाट्स के लिए टाइट को फिर से लिखा था और उसमें प्रवेश करने का फैसला किया। उपयोगकर्ता त्रुटि कॉपी-पेस्ट करें।
जोश कैसवेल

@ जोश: मैंने आपकी बाइट्स प्रविष्टि को संक्षेप में देखा, क्या आपने इसे हटा दिया था? इसमें दिलचस्पी दिखी।
केसी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.