1 পি 5: ইটরেটেড কারাগারের দ্বিধা


35

এই টাস্কটি প্রথম পর্যায়ক্রমিক প্রিমিয়ার প্রোগ্রামিং ধাঁধা পুশ-এর অংশ এবং এটি নতুন চ্যালেঞ্জ-প্রকারের প্রস্তাবনা হিসাবে চিহ্নিত

কাজটি হ'ল পুনরাবৃত্তি হওয়া বন্দীর দ্বিধা অন্যান্য প্রবেশকারীদের চেয়ে ভাল খেলতে একটি প্রোগ্রাম লেখার জন্য।

ভিঞ্জি দেখুন। আমরা আপনার সেলমেট জানি --- তার নাম কি? হ্যাঁ ম্যাকওয়ংস্কি, নিপ্পো-আইরিশ-ইউক্রেনীয় চালক - এটি কিছুটা নির্ভর করে এবং আপনি জানেন যে এটি কী।

আমরা এখানে সুন্দর হওয়ার চেষ্টা করছি, ভিনি তোমাকে সুযোগ দেই

যদি তিনি আমাদের প্ল্যানিন 'বলে থাকেন তবে আমরা আপনাকে ভাল কাজের অ্যাসাইনমেন্টটি দেখতে পাব।

এবং যদি আপনি না ...

গেমের বিধি

  • প্রতিযোগিতাটিতে একবারে (স্ব নাটক সহ) দু'জন প্রতিযোগীর পূর্ণ রাউন্ড রবিন (সমস্ত সম্ভাব্য জুটি) থাকে of
  • প্রতিটি জুটির মধ্যে 100 টি রাউন্ড খেলা হয়
  • প্রতিটি রাউন্ডে প্রতিটি খেলোয়াড়কে এই বিষয়ে অন্যান্য খেলোয়াড়ের উদ্দেশ্য না জেনে অন্য খেলোয়াড়ের সাথে সহযোগিতা করা বা তাদের সাথে বিশ্বাসঘাতকতার মধ্যে নির্বাচন করতে বলা হয়, তবে এই প্রতিপক্ষের বিরুদ্ধে খেলানো পূর্ববর্তী রাউন্ডগুলির ফলাফলগুলির স্মৃতি দিয়ে।
  • সম্মিলিত পছন্দের ভিত্তিতে প্রতিটি রাউন্ডের জন্য পয়েন্টগুলি প্রদান করা হয়। উভয় খেলোয়াড় সহযোগিতা করলে তারা প্রত্যেকে 2 পয়েন্ট পায় get পারস্পরিক বিশ্বাসঘাতকতা প্রতি 1 পয়েন্ট উপার্জন করে। মিশ্র ক্ষেত্রে, বিশ্বাসঘাতক খেলোয়াড়কে 4 পয়েন্ট দেওয়া হয় এবং সহযোগীকে 1 দ্বারা শাস্তি দেওয়া হয়।
  • একটি কাজ "অফিসিয়াল" ম্যাচটি আমি কাজ করতে পারি এবং জমা দেওয়া "বিজয়ী" বিজয়ী নির্বাচন করতে ব্যবহৃত হতে পারে এমন সমস্ত জমা দিয়ে পোস্ট করার পরে 10 দিনের বেশি আগে চালানো হবে না। আমার কাছে একটি ম্যাক ওএস 10.5 বাক্স রয়েছে, সুতরাং পসিক্স সমাধানগুলিতে কাজ করা উচিত তবে লিনাক্সিজম রয়েছে যা তা নয়। তেমনি, win32 এপিআইয়ের জন্য আমার কোনও সমর্থন নেই। আমি জিনিসগুলি ইনস্টল করার জন্য একটি প্রাথমিক প্রচেষ্টা করতে ইচ্ছুক, তবে একটি সীমা রয়েছে। আমার সিস্টেমের সীমা কোনওভাবেই গ্রহণযোগ্য প্রতিক্রিয়ার সীমাবদ্ধতা উপস্থাপন করে না, কেবল "অফিশিয়াল" ম্যাচে অন্তর্ভুক্ত করা হবে।

প্রোগ্রামার ইন্টারফেস

  • কমান্ড লাইন থেকে চালানো যেতে পারে এমন প্রোগ্রামগুলির আকারে এন্ট্রি হওয়া উচিত; সিদ্ধান্তটি অবশ্যই স্ট্যান্ডার্ড আউটপুটে প্রোগ্রামের (একক!) আউটপুট। এই প্রতিপক্ষের সাথে পূর্ববর্তী রাউন্ডগুলির ইতিহাস কমান্ড-লাইন আর্গুমেন্ট হিসাবে উপস্থাপিত হবে।
  • আউটপুট হয় "সি" ( বাছাইয়ের জন্য ) বা "টি" ( সমস্ত বলার জন্য )।
  • ইতিহাসটি হ'ল অক্ষরের একক স্ট্রিং যা পূর্ববর্তী রাউন্ডগুলিকে প্রতিনিধিত্ব করে সর্বাধিক সাম্প্রতিক রাউন্ডগুলিতে স্ট্রিংয়ের প্রথম দিকে। চরিত্রগুলি হয়
    • "কে" ( বিশ্বাসের জন্য পারস্পরিক সহযোগিতা বোঝায়)
    • "আর" ( ইঁদুরের জন্য বি @ এসডি @ আরডি আমাকে বিক্রি করে দিয়েছে! )
    • "এস" ( চুষার জন্য ! এর অর্থ আপনি বিশ্বাসঘাতকতায় উপকৃত হয়েছেন)
    • "ই" ( প্রত্যেকে পারস্পরিক বিশ্বাসঘাতকতার জন্য প্রথম এক সন্ধান করছে)

বন্ধনী

চারজন খেলোয়াড় লেখক সরবরাহ করবেন

  • দেবদূত - সর্বদা সহযোগিতা করে
  • শয়তান - সর্বদা কথা
  • টিটফোর্ড্যাট - প্রথম রাউন্ডে সহযোগিতা করে তারপরে সর্বদা সর্বশেষ রাউন্ডে যেমন হয়েছিল
  • এলোমেলো - 50/50

যাতে আমি যে সমস্ত এন্ট্রি চালাতে পারি তা যুক্ত করব।

মোট স্কোর হ'ল সমস্ত প্রতিপক্ষের বিরুদ্ধে মোট স্কোর (শুধুমাত্র একবারে স্ব-খেলানো এবং গড় স্কোর ব্যবহার সহ)।

সমাগম

(বর্তমান ২ মে ২০১১ সন্ধ্যা :00:০০)

সিক্রেট হ্যান্ডশেক | অ্যান্টি-টি 42 টি মিসাইল | অবিশ্বাস (রূপ) | অ্যান্টি হ্যান্ডশেক | ছোট্ট লিস্পার | রূপান্তর | হাঙর | প্রোবাবিমেটিক | পাভলভ - উইন স্টে, লস স্যুইচ | চোরদের মধ্যে সম্মান | সহায়তা ভ্যাম্পায়ার | দ্রুড | ছোট স্কিমার | বাইগোনস | টু টু ট্যাট | সিম্পলটন |

গোল-দাতা

#! /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, ডিএমেকে; ধন্যবাদ জোশ)

প্রাথমিক যোদ্ধা

উদাহরণস্বরূপ, এবং যাতে ফলাফল যাচাই করা যায়

ফেরেশতা

#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;
}

নোট করুন যে স্কোরার যোদ্ধাকে এক সেকেন্ডে অনেকবার পুনরায় আবেদন করতে পারে, তাই পিআরএনজি বীজ করার জন্য যদি সময় ব্যবহার করা হয় তবে ফলাফলের এলোমেলোতার জন্য বীমা করার জন্য একটি গুরুতর প্রচেষ্টা করতে হবে।

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

2
যদি আমার সেলমেট নিপ্পো-আইরিশ-ইউক্রেনীয় হয় তবে তার নামটি কেন হিবার্নো-চীন-রাশিয়ান দেখাচ্ছে?
পিটার টেলর

2
@ পিটার: এলএল। সত্যটি? ঠিক আছে, (1) বংশসূত্রগুলি পরিষ্কার নয়, তবে আমি সম্ভবত স্কচ-আইরিশ দিয়ে আমার mic'edness দ্বারা এসেছি ; (২) আমি "নিপ্পো" লেখার পরে আমি আমার বন্ধুদের নামগুলির বিভিন্ন বিটগুলি উঠতি সূর্যের দেশ থেকে চেষ্টা করেছি এবং তারা যেভাবে স্ক্যান করেছিল তা পছন্দ করে না, তাই আমি এগিয়ে গিয়ে একটি চীনা নাম ব্যবহার করলাম যা শব্দ পরিবর্তে ভাল, এবং (3) তারা যদি টায়ার লোকেদের দিয়ে আমাকে মারধর করে তবে আমি পার্থক্যটি জানতাম না। যা পরিস্থিতিতে সম্ভবত মনে হয়।
dmckee

1
@ জোশ: [ শেষের পরিবর্তে নোট ] এ পরিবর্তন return (s1, L1+h1), (s2, L2+h1)করা কি সহজ হবে ? // কাট-এন-পেস্ট ভুল বা সমান বোকামি কিছু। Sheesh! return (s1, L1+h1), (s2, L2+h2)L2+h2L2+h1
dmckee

2
আমি পরীক্ষার স্ক্রিপ্টে কিছু সময় ব্যয় করেছি এবং আমি এখানে একটি আপডেট ঘোষণা করে খুশি হয়েছি । এই আপডেটটি পরীক্ষার স্ক্রিপ্টে একটি সাধারণ শেল যুক্ত করে, যা ব্যবহারকারীকে এই বটটিকে বনাম এই বটকে ম্যানুয়ালি চালাতে, সীমাবদ্ধ ক্ষেত্র এবং কিছু অন্যান্য দুর্দান্ত জিনিস দিয়ে টুর্নামেন্ট চালাতে সহায়তা করে। নির্দ্বিধায় পরামর্শ দিতে! উহু. এবং বট-বনাম-বোট ধারণার জন্য আমি @ জোশকে .ণী। এটি সত্যই তার "প্রশিক্ষক" স্ক্রিপ্টটির একটি অনুরাগী বাস্তবায়ন।
এআরডিডেম

2
আকর্ষণীয়: 23 টি প্রতিযোগী ছিল, তাই প্রত্যেকে 22 টি রাউন্ড খেলেছে। প্রত্যেকে "অ্যাঞ্জেল" খেলে প্রতিটি স্কোর 4400 হত, তবে 4167 এর সেরা স্কোরও এর সাথে মেলে না। কেবলমাত্র যদি আমরা একটি নিখুঁত বিশ্বে বাস করতাম ... :)
ব্রিগেয় 37

উত্তর:


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 রাউন্ডের বলিদান আমাকে ডিভিলকে বের করে দেওয়ার অনুমতি দেবে কিনা তা নিজেই দৃ depends়ভাবে নির্ভর করে যে সেখানে কতগুলি প্রবেশ রয়েছে on ক্ষতি কমাতে, কেবলমাত্র 3 জন সহযোগিতা হ্যান্ডশেকটিতে দেখায় show

সম্পাদনা করুন: মূ errors় ত্রুটিগুলির মধ্যে কেবল একটির পরিবর্তনের মতো প্রতিরোধ করার জন্য TAGMATCH এখন গতিশীল এবং যাতে আমি ভবিষ্যতে কোনও সময়ে TAG গতিশীল করতে পারি।

সম্পাদনা 2: এখন এলোমেলোভাবে প্রথম রানটিতে ট্যাগ উত্পন্ন করে এটি দ্বারা নির্দিষ্ট করা ফাইলে সংরক্ষণ করে sys.argv[0](এটি .pycপ্রতিস্থাপন করে .pyএটি কোডে যায়, বাইটকোড নয়, ফাইল)। আমি মনে করি আমার সমস্ত দৃষ্টান্তের মধ্যে এটিই একমাত্র তথ্য যা অন্য কারও কাছে নেই তাই এটি পরজীবী এড়ানোর একমাত্র বিকল্প বলে মনে হয়।


তবে কীভাবে আপনার ডপেলগান্জার নিজেকে শয়তান করতে জানে?
arrdem

1
(আমি তোতাবানের মতো মনে করি, সারাক্ষণ "ট্যাট ফর ট্যাট" বলছি ...) নোট করুন যে T4T আপনার কৌশলটিকে পরাজিত করবে বিপরীতে: T4T (পূর্বে সহযোগিতা করে) এবং ডেভিল (কম ইঁদুর ফলাফল), এবং আপনার সাথে জোট বাঁধবে কৌশল। অবশ্যই, জুটিবদ্ধ মোট নয়, শেষ পর্যন্ত গণনা করা মোট। আপনি যেমন বলেছিলেন, জনসংখ্যা গুরুত্বপূর্ণ।
জোশ ক্যাসওয়েল

1
ওহ, না, আপনি তাতের বাইরে টাইটের বাইরে একটি অতিরিক্ত এস পান। খুশী হলাম। আমি বুঝতে পারিনি যে TAGপিছন দিকে খেলছে। তবে, আপনার TAGMATCH'KEEEKEEEEE' হওয়া উচিত নয় ?"".join({('c', 'c'):'K', ('t', 't'): 'E'}[moves] for moves in zip(TAG, TAG))
জোশ ক্যাসওয়েল

@ জন ভালো পয়েন্ট - আমার মূলত অন্যরকম ট্যাগ ছিল এবং আমি যখন এটিকে সহযোগিতা হ্রাস করতে পরিবর্তন করেছি তখন আমি TAGMATCH আপডেট করতে ভুলে গিয়েছিলাম। @ আরর্ডেমের ধারণাটি হ'ল আমি যদি নিজের বিপক্ষে খেলি তবে সবচেয়ে ভাল কাজ হ'ল উভয়ের পক্ষে সর্বকালের সহযোগিতা করা তাদের স্কোরগুলির যোগফলকে আরও বাড়িয়ে তোলার জন্য।
হারুন ডুফর

1
ওহ, এটা খারাপ। সুতরাং এখন আমাকে .pyআপনার কোডের জন্য সমস্ত ফাইল সন্ধান করতে হবে এবং ট্যাগটি বের করতে হবে। আমি সি তে এটি করব না, যদিও ...
জো

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 এবং পি 1 জিন 1

ধরে নিই যে পি 2 শয়তান, শয়তান যে বিন্দুটি শিথিল করতে পারে তার কোনও উপায় নেই, বাস্তবে সবচেয়ে খারাপ যে সে করতে পারে তা কেবল একটি পয়েন্ট অর্জন করা। নিখুঁতভাবে এলোমেলো প্রতিপক্ষের বিরুদ্ধে, শয়তানের সবচেয়ে খারাপ সম্ভাব্য স্কোরটি ঠিক (5/2) * n হবে যেখানে n "গেমস" খেলেছে। তার নিখুঁত সবচেয়ে খারাপ ঘটনাটি তার বিরুদ্ধে, যেখানে তার স্কোর হবে এন, এবং তার সেরা কেসটি কোনও দেবদূতের বিরুদ্ধে, যা 4 * এন হবে

জোর দেওয়া: অনুকূল_ স্ট্র্যাট = শয়তান

এটি একটি ভ্রমণ। আমার সেল-সাথিকে ব্যাকস্ট্যাব করা সহযোগিতার চেয়ে অনেক ভাল কৌশল কারণ এটি আমার স্কোরকে আরও (+4) সহায়তা করে। বোনাস - সে গালি দেয় (-1)! যদি আমি তার জন্য আমার ঘাড় আটকে রাখি তবে আমি (+২) এবং আলগা (-1) পাওয়ার পক্ষে দাঁড়িয়ে আছি। এর জন্য পরিসংখ্যানগতভাবে ব্যাকস্টাব পুরষ্কার দেওয়া হয়।

তবে এটি কি সর্বোত্তম?

EVER (এই স্কোরিং সিস্টেমের অধীনে) সহযোগিতা করার কোনও কারণ নেই।

  • আপনি যদি চাপ পেতে ভুল সময় বেছে নিয়ে থাকেন তবে আপনি ছেড়ে চলে যান।
  • আপনি যদি ইঁদুর করেন, তবে কমপক্ষে আপনি কোনও কিছুই ছাড়বেন না।
  • যদি আপনি ইঁদুর করেন এবং সে বোবা হয়, আপনি যদি ভাল মস্তিষ্কের চেয়ে বেশি হন তবে আপনি 2x বেশি লাভ করেন।

KOTH পদ্ধতিতে, রিটার্ন সর্বাধিকীকরণ প্রয়োজনীয় is আপনার কাছে এমন দুটি বট রয়েছে যা পুরোপুরি সিঙ্ক হয়ে যায় এবং সহযোগিতা করে, তাদের ব্যক্তির স্কোরগুলি এখনও তাদের স্পোর্টসম্যানশিপের জন্য 200 পয়েন্ট বাড়িয়ে তুলবে। অন্যদিকে একটি শয়তান কমপক্ষে 100 পয়েন্ট অর্জন করবে, যার গড় 200 এবং সর্বোচ্চ 400 কেস রয়েছে এবং প্রতিদ্বন্দ্বীদের প্রতি 100 পয়েন্ট পর্যন্ত ব্যয় করতে হবে! সুতরাং ব্যবহারিকভাবে, শয়তানটি সত্যিই গড়ে 500 টি স্পিক করে গড়ে গড়ে 300 টি স্কোর করে।

নীচের লাইন - সময় বলতে হবে

আমার কাছে, দেখে মনে হচ্ছে স্কোরিংটি পুনরায় বিবেচনা করা উচিত যাতে পাছে শয়তান দিনটি না নেয়। কো-অপারেশন স্কোর 3 এ বাড়িয়ে দেওয়া সবই এটি করতে পারে। পাভলভ এবং স্পাইট শো হিসাবে শয়তানগুলি সনাক্ত করা এবং তাদের পূর্ণ 400 স্কোর করা থেকে তাদের রোধ করা সম্ভব। আমি কি প্রমাণ করতে পারি যে কেউই তাদের বিশ্বাসকে ন্যায্যতা জানাতে তাদের সহযোগিতার জন্য পর্যাপ্ত পয়েন্ট তুলবে? কোন। এগুলি সবই প্রার্থীদের চূড়ান্ত মাঠে নির্ভর করে।

জিএল, এইচএফ!

এবং এই পোস্টে আপনার খারাপ কাজ করুন। সব বলার পরে এবং হয়ে গেলে আমি এটিতে আমার সিনিয়র পেপার লিখতে চাই।

সংস্করণ ইতিহাস

  1. মার্জিন ভেরিয়েবল যুক্ত করা হয়েছে যা এলোমেলোভাবে ডুচেবাগেরির জন্য লিস্পারের সহনশীলতার পরিবর্তন করে।
  2. সমবায় বিরোধীদের সাথে ডান পাতে নামার জন্য প্রথম দুটি রাউন্ডের ক্ল্যামে হালকা আপডেট করা হয়েছে
  3. একটি জেনেটিক অ্যালগরিদম ব্যবহার করে র্যান্ডম থ্রেশহোল্ড জেনারেটরের বিরোধীদের একটি মানক সংখ্যার বিরুদ্ধে তাদের সর্বাধিক সংখ্যক স্কোরের ভিত্তিতে সর্বাধিক শক্তিশালী মানগুলি খুঁজে পেতে। তাদের সহ আপডেট আপডেট।

লিস্টার অফিসিয়াল সংস্করণ

লিবারের ডেভেল ভার্সন


স্কোরিং গেমের বিভিন্ন রূপে পরিবর্তিত হয়। আমি হয়নি সহযোগিতা উদ্দীপক বেড়ে চারপাশে খেলা, এবং আমি সম্মত হন যে এটা কৌশল মনোনীত উপর একটি প্রভাব ফেলবে না। সুসংবাদ: আপনি স্কোরারকে দখল করতে পারেন, নিজের নিয়মগুলি সেট করতে পারেন এবং চেষ্টা করতে পারেন। নীতিগতভাবে আপনি কোনও অনুগ্রহও দিতে পারেন।
dmckee

fink install clisp :: বার বার আঙ্গুলগুলি আলতো
চাপুন

1
@ জোশ - লিঙ্কটির জন্য ধন্যবাদ। আমি এই দ্বিধা নিয়ে আরও কিছু উইকিপিডিয়া পৃষ্ঠাগুলি পড়েছি, তবে আমি এই বিভাগটি মিস করেছি। একটি নিয়ম বাগ আমি কেবল লক্ষ্য করেছি, ফাইল সিস্টেম ব্যবহার করে প্রবেশের বিরুদ্ধে কোনও নিয়ম নেই। এটি হ্যান্ডশেকের লাইন ধরে অনেক বেশি দক্ষ সহযোগিতার সম্ভাবনা তৈরি করে।
26 এ অ্যারেডেম

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

অবিশ্বাস (বৈকল্পিক)

এই এক বছর আগে আমার নিজের পরীক্ষায় প্রথম প্রকাশিত হয়েছিল (তারপরে আমি একাদশ শ্রেণিতে পড়েছিলাম এবং ঠিক এই বিষয়ে একটি ছোট্ট থিসিসও করেছিলাম, অন্যান্য শিক্ষার্থীরাও কৌশলগুলি ব্যবহার করে)। এটি সিক্যুয়েন্স দিয়ে শুরু হয় 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

আহ, সত্য। প্রথম রাউন্ডটি কীভাবে সনাক্ত করা যায় তা আমি নিশ্চিত ছিলাম না, যদিও খালি প্রথম যুক্তি (ইতিহাস) আছে বা কেবল কিছুই নেই whether
জোয়ি

আমি নিশ্চিত নই. অজগর Popen(p+" "+h,stdout=subprocess.PIPE,shell=True)যখন যা করে তা এটি h = ''। আমি অনুমান করছি argc=1
dmckee

1
এই প্রাথমিক ক্রমটি বেশ ভাল ধারণা, এটি লক্ষ্য করে টাইটের দুর্বলতার জন্য টাইটকে লক্ষ্য করে। আপনি এটির উপর একটি ছোট সীসা পান, তারপরে তারপরে খেলুন।
জোশ ক্যাসওয়েল

1
@ জোশ, ছোট্ট সীসা কোথায়? টি 4 টি এর বিপরীতে এটি এসআরকে শুরু হয় এবং তারপরে কে দিয়ে চালিয়ে যায় তবে এসআর প্রতিটি প্লেয়ারের জন্য 3 পয়েন্টের মূল্যবান।
পিটার টেলর

5

অ্যান্টি-টি 42 টি মিসাইল

#!/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'

বেস রোস্টার বিরুদ্ধে বেশ ভাল।


... বাজে বাজে?
আরেডেমি

:) বোকাদের ধরে ফেলো।
জোশ ক্যাসওয়েল

বর্তমান ক্ষেত্রে নিয়মিত 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 পিটিস।
আরেডেমি

বর্তমান মাঠের ট্যুরনে রান সবচেয়ে শক্তিশালী বলে মনে হচ্ছে।
পিটার টেলর

আসলে, না, ড্রুয়েড এখন আমি স্কোরারের মধ্যে বাগটি স্থির করেছি।
পিটার টেলর

@ আরমকেনজি, @ পিটার: গীজ, সত্যি? আমি শুধু ব্যক্তিত্বের জন্য যাচ্ছিলাম।
জোশ ক্যাসওয়েল

@ জোশ - আর নেই .... নতুন স্কোরিং কোডে @ কেসির স্কোরিং কোড লিস্পার ফিরে এসেছে তারপরে শার্কের পরে।
আরেডেমি

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;তবে জিসিসি এটি সি 99 মোডে রাখার দরকার নেই অভিযোগ করে এটি সঙ্কলন করবে।
পিটার টেলর

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')]

আমার চ্যালেঞ্জার ফাংশনে ভাঁজ দেওয়ার জন্য @ আরমেকেনজিকে ধন্যবাদ।


কেবল স্টাইলের বিষয় ....। জাভা ফাইলটি "উত্স" হিসাবে বিবেচনা করা উচিত এবং ./src ডিরেক্টরিতে এবং .c ফাইলগুলিতে একই সাবস্ক্রিপ্ট দ্বারা ./warriors ফোল্ডারে রাখা চূড়ান্ত। ক্লাসে স্থানান্তরিত করা উচিত, বা জাভা কি ব্যাখ্যা করা যায় এবং যেমন জাভা এবং .ক্লাস একসাথে থাকে? স্কোরারের যে কোনও ক্ষেত্রে দুর্দান্ত পরিবর্তন ... রেপো স্ট্যাটে সেগুলি থাকবে।
এয়ারডেমি

@ আরমেকেনজি, ভালো কথা: হ্যাঁ, প্রযুক্তিগতভাবে এটি সংকলিত হয়েছে। যোদ্ধাদের ডিরেক্টরিতে আমার উত্স ফাইলটি থাকার কারণটি হ'ল অজগর ফাইলগুলিও সেখানে রয়েছে - এবং সেগুলি সংকলিত। আপনি যদি চান তবে আমি এটি পরীক্ষা করে দেখতে পারি যে এটিগুলি ./src থেকে ./warriors- র মধ্যে সংকলনের জন্য প্রয়োজনীয় - তবে এটি কয়েকটি সংকলক আর্গুমেন্টের প্রয়োজন হতে পারে, কারণ জাভা ডিফল্টরূপে ধরে নেওয়া হয় যে ডিরেক্টরি কাঠামোটি প্যাকেজ (নেমস্পেস) প্রতিবিম্বিত করে।
পিটার টেলর 21

@ ইপিটার, আমি কেবল ভাবছিলাম ... যোদ্ধারা ইনস / ওয়ারিয়র্সগুলিকে * নিক্স 77 being7, বা অন্যথায় কার্যকর করার যোগ্যতার সাথে পাওয়া যায়। পাইথন এবং লিস্প স্ক্রিপ্টগুলি পারফরম্যান্সের জন্য সাধারণভাবে সংকলিত হয়, তবে তাদের প্রাকৃতিক (উত্স) অবস্থায় কার্যকর হয়। অ-জাভা পার্সন হিসাবে আমার জানার জন্য। জাভা ফাইলগুলিতে সেই অনুমতি নেই এবং তাই প্রদর্শিত হবে না। এর জন্য সি হ্যাক বিদ্যমান ... কারণ সংকলন একটি পৃথক পদক্ষেপ। তাই হ্যা. আপনি যদি এই পরিবর্তনটি দেখেন তবে আমি এটির প্রশংসা করব।
রেপো

আপনার কোড এবং একটি 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)
শে

@ আরএমকেনজি, এটি অদ্ভুত। যাইহোক, আমি মনে করি খুব শীঘ্রই আপনার জন্য আমার একটি প্যাচ হবে। আমাকে লোডিং কোডটি হ্যাক করতে হয়েছিল, কারণ শ্রেণি ফাইলগুলি কার্যকরযোগ্য নয়। এবং অন্য কোনও জাভা এন্ট্রি যদি অভ্যন্তরীণ ক্লাসগুলি ব্যবহার করে তবে এটি ভেঙে যাবে।
পিটার টেলর 22

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');
    }
}

আপনার কোডটি নরম_মজো তবে আপনার বিবরণটি হার্ড_ম্যাজো।
পিটার টেলর

পিটার: এেক, সরি; স্থির করেছি।
জো

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;
}

হাইপারেশনালওয়াস্পের বিরুদ্ধে এটি সাধারণত শয়তানের বিরুদ্ধে প্রায় কাজ করে। এটি কেবল সর্বদা সহযোগিতা করা শুরু করে, তাই আমি ধরে নিলাম এটি দেবদূত এবং আক্রমণ চালিয়ে যান। তারপরে এটি যখন প্রান্তে আঘাত করবে আপনি শয়তান মোডে স্যুইচ করবেন এবং আমি টি 4 টিতে স্যুইচ করব। যদি এটি প্রথম 6 টি পদক্ষেপে এলোমেলোভাবে পিছনে যায় তবে আমি শয়তানে স্যুইচ করার আগে আমি টি 4 টি তে স্যুইচ করব, তবে এর প্রতিকূলগুলি বেশি নয়।
পিটার টেলর

1
পিটার: ঠিক আছে, আমি খুব কমই একে অপরের বিরুদ্ধে কৌশলগুলি খুব কমই পরীক্ষা করে দেখি, কারণ সামগ্রিক ক্ষেত্রে কৌশলগত সম্পাদনের ক্ষেত্রে কিছুটা প্রভাব রয়েছে। বর্তমানে এটি বেশিরভাগ আমার পরীক্ষায় প্রথম স্থানের জন্য ধীরে ধীরে এবং ড্রুয়েডের সাথে লড়াই করে।
জয়ে 12

ধীরে ধীরে এবং ড্রুয়েড উভয়ই বেতার বিপরীতে প্রায় 200 স্কোর করে; এলোমেলো sucker প্রায় 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

Druid ব্যবহার

#!/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'

বেস সেট বিরুদ্ধে খারাপভাবে না, কিন্তু তার লক্ষ্য বিরুদ্ধে বেশ ভাল। স্পষ্টতই, স্কিমে লিখিত নেই।


আমি কেন চ্যালেঞ্জ অনুভব করব?
আরেডেমি

এই ব্যাগারকে পরাস্ত করে .... লিস্পারের প্রান্তিক র্যান্ডমাইজ করে।
আরেডেমি

@ আরমকেনজি: তবে কীভাবে এটি বাকি মাঠের বিরুদ্ধে আপনার খেলার উপর প্রভাব ফেলবে? পর্যাপ্ত সহযোগী একে অপরের সাথে কাজ করার সাথে, ভৌতিক বা হিংসা কৌশলগুলি আরও খারাপ হতে শুরু করবে। আপনি এখনও একটি স্থির উপরের সীমা পেয়েছেন, যা শোষণ করা যেতে পারে।
জোশ ক্যাসওয়েল

আপনি যদি বর্তমান লিস্পারটি পড়ে থাকেন তবে enর্ষার চেয়ে এটি বেশি প্রতিরক্ষামূলক। এটি এমন প্রতিপক্ষকে সনাক্ত করার চেষ্টা করে যারা এই জাতীয় পরিসংখ্যানগতভাবে বিশ্বাসঘাতক স্ট্র্যাটগুলি অনুসরণ করে এবং কেবল তখনই আগুন দেয়। এটির সিসি উদ্বোধনটি চোরদের সাথে ডান পায়ে নামার জন্য ডিজাইন করা হয়েছে এবং বেশিরভাগ সহযোগী স্ট্রেটকে পাশাপাশি খেলতে দৃ conv়প্রত্যয় করার অতিরিক্ত সুবিধা রয়েছে।
আরেডেমি

@ আরএমকেনজি: খুব ভালো! আমি এটি একটি স্পিন দেব।
জোশ ক্যাসওয়েল

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

@ কেসি @ ডিএমকেকে বাগ সংশোধন করার জন্য আপনাকে ধন্যবাদ। returnবিশেষ করে আমার জন্য "দুহ" !
জোশ ক্যাসওয়েল

@ ডিএমকে: এটি আরও জটিল জিনিসের অংশ হিসাবে শুরু হয়েছিল, এবং তখন আমি বুঝতে পারি যে আমি দুটি তাত্ত্বিকের জন্য আবারও টাইট লিখলাম এবং তাতে প্রবেশ করার সিদ্ধান্ত নিয়েছি। অনুলিপি-ব্যবহারকারীর ত্রুটি।
জোশ ক্যাসওয়েল

@ জোশ: আমি আপনার বাইগোনস এন্ট্রি সংক্ষেপে দেখেছি, আপনি কি এটি মুছে ফেলেছেন? এটি আগ্রহী লাগছিল।
কেসি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.