कैदी की दुविधा v.2 - बैटल रॉयल


15

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

में इस सवाल का , मैं कई लोगों को एक ही समय में एक दूसरे के खिलाफ कैदियों 'दुविधा खेलने के लिए के लिए एक तरह से तैयार की। इस भिन्नता में, पेऑफ मैट्रिक्स अनावश्यक है, दो खिलाड़ियों के प्रत्येक जोड़ी के बीच प्रत्येक परिणाम के साथ दो कार्यात्मक स्वतंत्र निर्णय का योग है।

आपका कार्य मल्टीप्लेयर कैदी की दुविधा के इस सममित, सामान्यीकृत संस्करण को चलाने के लिए एक एआई का निर्माण करना है जो उच्चतम स्कोर को प्राप्त करेगा।


खेल के नियम

इस मल्टीप्लेयर के प्रत्येक दौर में, मल्टी-राउंड कैदी की दुविधा, एक खिलाड़ी Aकिसी अन्य खिलाड़ी से "1" लेने का फैसला कर सकता है B। इस परिस्थिति में, Aस्कोर 1 से बढ़ जाता है, जबकि Bस्कोर 2 से कम हो जाता है। इस निर्णय को खिलाड़ियों की प्रत्येक जोड़ी के बीच होने की अनुमति है।

प्रत्येक खिलाड़ी के लिए यह एकमात्र निर्णय है - या तो "1" लेने के लिए या एक-दूसरे खिलाड़ी से "1" लेने के लिए नहीं, जो क्रमशः दलबदल और सहयोग के लिए अनुकूल हैं। दो खिलाड़ियों के बीच प्रभावी अदायगी मैट्रिक्स P1और P2इस प्रकार है:

  P1/P2     P1 Take1   P1 Don't
P2 Take1     -1/-1      -2/+1
P2 Don't     +1/-2       0/ 0

टूर्नामेंट प्रक्रिया

खेल में P * 25राउंड शामिल होंगे , जहां Pभाग लेने वाले खिलाड़ियों की संख्या है। सभी खिलाड़ियों के स्कोर के साथ शुरू करते हैं 0। प्रत्येक दौर में निम्नलिखित प्रक्रिया शामिल होगी:

एक दौर की शुरुआत में, प्रत्येक कार्यक्रम को निम्न इनपुट में मानक इनपुट से पिछले दौर का इतिहास दिया जाएगा :

  • 3 संख्या से युक्त एक पंक्ति, P, D, और N

    • Pखेल में खिलाड़ियों की कुल संख्या है। प्रत्येक खिलाड़ी को बेतरतीब ढंग से से एक आईडी नंबर दिया जाता है 1करने के लिए Pखेल की शुरुआत में।

    • D वर्तमान खिलाड़ी की आईडी है।

    • N जितने राउंड खेले गए हैं।

  • Nरेखाएँ, प्रत्येक रेखा एक दौर के परिणामों का प्रतिनिधित्व करती है। लाइन पर kकी N, वहाँ कुछ नंबर होगा n_kआदेश दिया जोड़े की (a, b), रिक्त स्थान है, जो यह दर्शाते हैं कि आईडी के साथ खिलाड़ी द्वारा अलग aआईडी के साथ खिलाड़ी से "1 ले लिया" bउस दौर में।

  • एक समान रूप से यादृच्छिक संख्या Rसे 0करने के लिए 18446744073709551615(2 64 - 1), एक कूट-यादृच्छिक बीज के रूप में कार्य करने के लिए। इन नंबरों को एक पूर्व-निर्मित फ़ाइल से पढ़ा जाएगा, जो टूर्नामेंट के अंत में जारी किया जाएगा ताकि लोग अपने लिए परिणामों को सत्यापित कर सकें।

  • एक अतिरिक्त रेखा जो आपके कार्यक्रम में पढ़ने के लिए राज्य के कुछ रूप का प्रतिनिधित्व करती है, अगर आपके कार्यक्रम ने पिछले दौर में ऐसा उत्पादन किया था। खेल की शुरुआत में, यह रेखा हमेशा खाली रहेगी। इस लाइन को स्कोरिंग कोड या अन्य कार्यक्रमों द्वारा संशोधित नहीं किया जाएगा।

प्रत्येक कार्यक्रम तब मानक उत्पादन के लिए निम्नलिखित उत्पादन करने के लिए अपनी रणनीति का उपयोग करेगा :

  • Kसंख्याओं की एक सूची , जो इस दौर से "1 लेगी" कार्यक्रमों की आईडी हैं। एक खाली आउटपुट का मतलब है कि यह कुछ नहीं करेगा।

  • वैकल्पिक रूप से, एक अतिरिक्त रेखा बाद के दौरों को पारित करने के लिए राज्य के कुछ रूप का प्रतिनिधित्व करती है। यह सटीक रेखा अगले दौर में कार्यक्रम में वापस आ जाएगी।

नीचे 3एक 4-प्लेयर गेम में ID के एक खिलाड़ी के लिए खेल की शुरुआत के लिए एक उदाहरण इनपुट है :

4 3 0
4696634734863777023

नीचे दिए गए कुछ राउंड के साथ उसी गेम के लिए एक उदाहरण इनपुट नीचे दिया गया है:

4 3 2
(1, 2) (1, 3) (1, 4) (4, 2)
(1, 3) (2, 1) (2, 4) (3, 1) (4, 1)
4675881156406346380

प्रत्येक प्रोग्राम को आईडी नंबर को छोड़कर एक राउंड के लिए बिल्कुल वही इनपुट दिया जाएगा Dजो प्रत्येक प्रोग्राम के लिए अद्वितीय है।

नीचे एक उदाहरण आउटपुट है जिसमें खिलाड़ी 3अन्य सभी से 1 लेता है:

1 2 4

सभी आवश्यक राउंड के अंत में, उच्चतम अंतिम स्कोर वाला खिलाड़ी विजेता होगा।


समय

इस टूर्नामेंट के लिए कोडिंग कुल 7 दिनों तक चलेगी। प्रस्तुतियाँ के लिए समय सीमा है 2014-05-09 00:00 UTC

इस तिथि से पहले वास्तविक कार्यक्रम पोस्ट न करें - अपने कार्यक्रम के स्रोत कोड के SHA256 हैश को एक प्रतिबद्धता के रूप में पोस्ट करें। आप समय सीमा से पहले किसी भी समय इस हैश को बदल सकते हैं, लेकिन समय सीमा के बाद पोस्ट किए गए प्रतिबद्धताओं को निर्णय के लिए स्वीकार नहीं किया जाएगा। (कृपया अपने हैश के लिए बेस 64 नोटेशन का उपयोग करें, क्योंकि मेरा सत्यापन कार्यक्रम बेस 64 से बाहर निकलता है और यह अधिक कॉम्पैक्ट नोटेशन है।)

समय सीमा समाप्त होने के बाद, आपके पास 2014-05-10 00:00 UTCआपके प्रस्तुत करने के लिए अपने कार्यक्रम के वास्तविक स्रोत कोड को पोस्ट करने के लिए 1 दिन (जब तक ) होगा। यदि आपके पोस्ट किए गए स्रोत कोड का SHA256 हैश किसी भी हैश से मेल नहीं खाता है जो आपने समय सीमा से पहले पोस्ट किया है, तो आपका कोड टूर्नामेंट में स्वीकार नहीं किया जाएगा।

इसके बाद, मैं अपने कंप्यूटर पर सभी प्रस्तुतियाँ डाउनलोड करूंगा, और इस लड़ाई रॉयले में सभी टूर्नामेंट प्रविष्टियों को चलाऊंगा, उम्मीद है कि तब से 2 दिनों के भीतर परिणाम पोस्ट करें 2014-05-12 00:00 UTC

मैं उच्चतम स्कोर के साथ उत्तर को स्वीकार करूंगा, और उस उत्तर को +100 का इनाम दे सकता हूं यदि उसका अंतिम स्कोर इससे अधिक है 0

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

द होस्ट मशीन

मैं अपने कंप्यूटर पर वर्चुअल मशीन पर इन समाधानों को चला रहा हूं। यह वर्चुअल मशीन 2 गीगाबाइट रैम के साथ उबंटू लिनक्स 14.04 चलाएगी। मेरी बेस मशीन में 3.40 गीगाहर्ट्ज़ पर चलने वाला इंटेल i7-2600K प्रोसेसर है।

आवश्यकताएँ

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

आपके प्रोग्राम को 2.000 secondsप्रत्येक राउंड को चलाने के लिए अधिक से अधिक नहीं लेना चाहिए । यदि आपका कार्यक्रम समय से बाहर चला जाता है या कोई त्रुटि उत्पन्न करता है, तो इसका उत्पादन उस दौर के लिए खाली माना जाएगा।

आपका कार्यक्रम निर्धारक होना चाहिए; यही है, इसे हमेशा एक ही इनपुट के लिए एक ही आउटपुट वापस करना होगा। छद्म आयामी समाधान की अनुमति है; हालाँकि, उनकी यादृच्छिकता इनपुट के रूप में दिए गए यादृच्छिक बीज पर निर्भर होनी चाहिए और कुछ नहीं। पायथन की मदद से बीज फाइल तैयार की गई os.urandom। इसमें कुल 500 लाइनें शामिल हैं (यदि आवश्यक हो तो अधिक उत्पन्न होगी), और इसका SHA256 हैश है K+ics+sFq82lgiLanEnL/PABQKnn7rDAGmO48oiYxZk=। टूर्नामेंट खत्म होने के बाद इसे यहां अपलोड किया जाएगा।


पौधे

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

प्रत्येक पौधे की फ़ाइल के हैश की गणना करने के लिए, 4 स्थानों के प्रत्येक समूह को एक टैब से बदलें, क्योंकि यहाँ फ़ॉर्मेटर टैब वर्णों को पसंद नहीं करता है।

आलसी - कभी कुछ नहीं करता है।

n1bnYdeb/bNDBKASWGywTRa0Ne9hMAkal3AuVZJgovI=

pass

लालची - हमेशा हर किसी से 1 लेता है।

+k0L8NF27b8+Xf50quRaZFFuflZhZuTCQOR5t5b0nMI=

import sys

line1 = sys.stdin.readline()
n = [int(i) for i in line1.split()]
for i in range(n[0]):
    if i+1 != n[1]:
        print i+1,
print

क्रोधी - पहले दौर के बाकी सभी लोगों से 1 लेता है, और हर एक से 1 लेता है, जिसने उससे पिछले दौर में 1 लिया।

Ya2dIv8TCh0zWzRfzUIdFKWj1DF9GXWhbq/uN7+CzrY=

import sys
import re

line1 = [int(i) for i in sys.stdin.readline().split()]

players = line1[0]
pid = line1[1]
rounds = line1[2]

lines = []

if rounds == 0:
    for i in range(players):
        if i+1 != pid:
            print i+1,
    print
else:
    for i in range(rounds):
        lines.append(sys.stdin.readline())
    lastline = lines[-1]
    takes = re.findall(r'\([0-9]+, [0-9]+\)', lastline)
    for take in takes:
        sides = [int(i) for i in re.findall(r'[0-9]+', take)]
        if sides[1] == pid:
            print sides[0],
    print

ईर्ष्या - वर्तमान उच्चतम स्कोर के साथ 50% खिलाड़ियों में से 1 को ही छोड़ देता है, नीचे चक्कर लगाता है।

YhLgqrz1Cm2pEcFlsiIL4b4MX9QiTxuIOBJF+wvukNk=

import sys
import re

line1 = [int(i) for i in sys.stdin.readline().split()]

players = line1[0]
pid = line1[1]
rounds = line1[2]

lines = []
scores = [0] * players

if rounds == 0:
    for i in range(players):
        if i+1 != pid:
            print i+1,
    print
else:
    for i in range(rounds):
        takes = re.findall(r'\([0-9]+, [0-9]+\)', sys.stdin.readline())
        for take in takes:
            sides = [int(i) for i in re.findall(r'[0-9]+', take)]
            scores[sides[0] - 1] += 1
            scores[sides[1] - 1] -= 2
    score_pairs = [(i+1, scores[i]) for i in range(players)]
    score_pairs.sort(key=lambda x:(x[1], x[0]))
    score_pairs.reverse()
    taken = 0
    j = 0
    while taken < (players) / 2:
        if score_pairs[j][0] != pid:
            print score_pairs[j][0],
            taken += 1
        j += 1

इन चार में से केवल 100 राउंड के टूर्नामेंट में, उन्हें स्कोर प्राप्त होता है:

Lazy: -204
Greedy: -100
Wrathful: -199
Envious: -199

कार्यक्रम को देखते हुए

मैंने जज प्रोग्राम पोस्ट किया है जिसका उपयोग मैं गितुब में करूंगा । इसे डाउनलोड करें और इसका परीक्षण करें। (और शायद एक बग या दो को ठीक करें यदि आप एक पाते हैं।: पी)

इसके पास फिलहाल पायथन के अलावा किसी अन्य चीज के लिए संकलन विकल्प नहीं हैं। मैं बाद में उन लोगों में शामिल हो जाऊंगा - यदि लोग अन्य भाषाओं के संकलन या व्याख्या लिपियों में योगदान दे सकते हैं, तो मैं बहुत अधिक बाध्य होऊंगा।


चरण 2: स्रोत कोड सबमिशन

मैंने tournamentप्रतियोगिता के लिए Github रिपॉजिटरी में एक नई शाखा पोस्ट की है , जिसमें pd_rand फ़ाइल और अन्य प्लांट प्रविष्टियाँ हैं। आप या तो अपने स्रोत कोड को यहां पोस्ट कर सकते हैं या पुल शाखा के रूप में उस शाखा में जमा कर सकते हैं।

प्रतियोगियों का क्रम निम्नानुसार होगा:

'begrudger'
'regular'
'patient'
'lazy'
'backstab'
'bully'
'lunatic'
'envious'
'titfortat'
'greedy'
'wrathful'
'judge'
'onepercent'

अंतिम स्कोर

मेरे परीक्षण कार्यक्रम का उत्पादन:

Final scores:
begrudger -2862
regular -204
patient -994
lazy -2886
backstab -1311
bully -1393
lunatic -1539
envious -2448
titfortat -985
greedy -724
wrathful -1478
judge -365
onepercent -1921

रैंकिंग:

 1. regular      -204
 2. judge        -365
 3. greedy       -724
 4. titfortat    -985
 5. patient      -994
 6. backstab    -1311
 7. bully       -1393
 8. wrathful    -1478
 9. lunatic     -1539
10. onepercent  -1921
11. envious     -2448
12. begrudger   -2862
13. lazy        -2886

तो यह पता चला है कि विजेता वास्तव में एक खिलाड़ी है - यह नियमित है, जिसमें -204 अंक हैं!

दुर्भाग्य से, इसका स्कोर सकारात्मक नहीं था, लेकिन हम शायद ही कभी कैदी की दुविधा के एक सिमुलेशन में उम्मीद कर सकते हैं कि हर कोई जीतने के लिए खेल रहा है।

कुछ आश्चर्यजनक परिणाम (कम से कम मुझे लगा कि आश्चर्यचकित थे):

  • टेट के लिए लालची ने अधिक से अधिक स्कोर किया, और वास्तव में, आमतौर पर सभी स्कोररों की तुलना में अधिक था।

  • न्यायाधीश, जो "नैतिकता प्रवर्तक" चरित्र का एक प्रकार होना चाहिए था (यह मूल रूप से 1 लिया जिसने भी किसी से 1 लिया है, जो उपरोक्त औसत संख्या से 1 बार लिया गया) बल्कि उच्च स्कोरिंग स्कोरिंग समाप्त हो गया, जबकि सिमुलेशन परीक्षण में, यह वास्तव में था। बल्कि कम स्कोर प्राप्त करें।

और अन्य (जो मुझे लगा) इतने आश्चर्य की बात नहीं थी:

  • रोगी ने द क्रोधी से अधिक 484 अंक पूरे किए। यह वास्तव में उस पहली बार सहयोग करने के लिए भुगतान करता है।

  • एक प्रतिशत बहुत जल्दी लगभग किसी के पास नहीं था जबकि वे नीचे थे। लगता है कि 1% केवल इस तरह से रह सकते हैं क्योंकि उनके पास खेल में अधिक खिलाड़ी हैं।

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


3
नियंत्रण कार्यक्रम और / या पौधों को स्रोत को पोस्ट करने से कुछ भी चोट लगी होगी? हम जानते हैं कि वे वैसे भी क्या करते हैं, और मैं पाँच अतिरिक्त कार्यक्रमों को लिखने के बिना कुछ के खिलाफ परीक्षण करने में सक्षम होना पसंद करूंगा ।
जियोबिट्स

2
मुझे समझ नहीं आ रहा है। क्या हर समय 1 हर किसी के लिए कुछ दंड है? यह हमेशा 1 लेने के लिए सबसे अधिक फायदेमंद नहीं होगा?
DankMemes

1
लालची नुकसान को अधिकतम कैसे नहीं कर सकता है? यदि हम अन्य खिलाड़ी से लेते हैं, तो दूसरा खिलाड़ी केवल -1 या -2 प्राप्त कर सकता है, जबकि यदि हम नहीं लेते हैं, तो अन्य खिलाड़ी को 1 या 0. मिल सकता है। जाहिर है कि अन्य खिलाड़ी से 1 लेने से नुकसान अधिकतम होगा। और इसलिए लालची कभी नहीं हारेंगे। और यह लगभग हमेशा जीत जाएगा, जब तक कि सभी प्रतिद्वंद्वी भी लालची न हों, जैसे आपने कहा।
प्रातः

1
@Trimsty जब पहली बार चुनौती बढ़ी, पौधों के लिए कोड नहीं दिखाया गया था। पूरे कोडिंग चरण के माध्यम से, हम अन्य उत्तर नहीं देख पाए। बहुत स्पष्ट लालची रणनीति का चयन करके डुप्लीकेट दुर्घटना से हो सकता है ।
नौ

2
@ अन्याय अगर आपने वास्तव में पुनरावृत्त कैदी की दुविधा में रणनीतियों पर कोई पुनरावर्तक पढ़ा है, तो आप जानेंगे कि आप जो कह रहे हैं वह गलत है। विकिपीडिया लेख एक अच्छी जगह शुरू करने के लिए है।
जो जेड

जवाबों:


3

द रेगुलर

इस प्रविष्टि के संस्करण को मैंने टूर्नामेंट (SHA-256:) के लिए चुना है, जोए की " रैंडम चूसने वाला " रणनीति ggeo+G2psAnLAevepmUlGIX6uqD0MbD1aQxkcys64oc=का उपयोग करता है (यद्यपि एक मामूली और संभावनाहीन परिवर्तन के साथ), जो पिछले प्रतियोगिता में दूसरे स्थान पर आया था। दुर्भाग्य से, समय सीमा से पहले एक नया, अधिक प्रभावी संस्करण केवल 3 मिनट 25 सेकंड में प्रस्तुत किया गया है जिसमें एक गंभीर बग है, इसलिए इसका उपयोग नहीं किया जा सकता है। फिर भी, यह संस्करण अभी भी अपेक्षाकृत अच्छी तरह से किराए पर है।

<?php

$secretKey = '95CFE71F76CF4CD2';
$hashOutput = '';
$hashSeq = 0;
$hashIndex = 64;

function psRand($min = null, $max = null) {
    global $secretKey, $state, $hashOutput, $hashSeq, $hashIndex;
    if ($hashIndex > 56) {
        $hashOutput = hash_hmac('sha256', ++$hashSeq . ' ' . $state['rand'], $secretKey);
        $hashIndex = 0;
    }

    $num = (int)(hexdec(substr($hashOutput, $hashIndex, 8)) / 2);
    $hashIndex += 8;

    return $min === null ? $num : (int)($min + $num * ($max - $min + 1) / 2147483648);
}

$line = fgets(STDIN);
sscanf($line, "%d %d %d", $numPlayers, $myPlayerId, $roundsPlayed);
$roundsCount = 25 * $numPlayers;
$roundsRemaining = $roundsCount - $roundsPlayed - 1;

$betrayalCount = array_fill(1, $numPlayers, 0);
for ($round = 0; $round < $roundsPlayed; ++$round) {
    $line = fgets(STDIN);
    preg_match_all('/\((\d+), (\d+)\)/', $line, $matches, PREG_SET_ORDER);
    foreach ($matches as $m) {
        $defector = (int)$m[1];
        $victim = (int)$m[2];
        if ($victim === $myPlayerId) {
            ++$betrayalCount[$defector];
        }
    }
}

$hashOutput = rtrim(fgets(STDIN), "\n");
$state = unserialize(rtrim(fgets(STDIN), "\n"));
if (!$state) {
    $state = ['rand' => ''];
}

$state['rand'] = hash_hmac('sha256', $state['rand'] . $line, $secretKey);
$victims = [];

if ($roundsPlayed > 1) {
    for ($other = 1; $other <= $numPlayers; ++$other) {
        if ( $other === $myPlayerId) {
            continue;
        }

        if ($betrayalCount[$other] > 7 || psRand() % 1024 < 32 || !$roundsRemaining ) {
            $victims[] = $other;
        }
    }
}

echo implode(' ', $victims), "\n", serialize($state), "\n";

छोटी गाड़ी संस्करण में SHA-256 हैश है 2hNVloFt9W7/uA5aQXg+naG9o6WNmrZzRf9VsQNTMwo=:

<?php

$secretKey = '95CFE71F76CF4CD2';
$hashOutput = '';
$hashSeq = 0;
$hashIndex = 64;

function psRand($min = null, $max = null) {
    global $secretKey, $state, $hashOutput, $hashSeq, $hashIndex;
    if ($hashIndex > 56) {
        $hashOutput = hash_hmac('sha256', ++$hashSeq . ' ' . $state['rand'], $secretKey);
        $hashIndex = 0;
    }

    $num = (int)(hexdec(substr($hashOutput, $hashIndex, 8)) / 2);
    $hashIndex += 8;

    return $min === null ? $num : (int)($min + $num * ($max - $min + 1) / 2147483648);
}

$line = fgets(STDIN);
sscanf($line, "%d %d %d", $numPlayers, $myPlayerId, $roundsPlayed);
$roundsCount = 25 * $numPlayers;
$roundsRemaining = $roundsCount - $roundsPlayed - 1;

$betrayalCount = array_fill(1, $numPlayers, 0);
$scoreWindow = array_fill(1, $numPlayers, array_fill(1, $numPlayers, 0));
$lastMove = array_fill(1, $numPlayers, array_fill(1, $numPlayers, false));
for ($round = 0; $round < $roundsPlayed; ++$round) {
    $line = fgets(STDIN);
    preg_match_all('/\((\d+), (\d+)\)/', $line, $matches, PREG_SET_ORDER);
    foreach ($matches as $m) {
        $defector = (int)$m[1];
        $victim = (int)$m[2];
        if ($victim === $myPlayerId) {
            ++$betrayalCount[$defector];
        }
TAB>TAB>if ($round >= $roundsPlayed - 10) {
TAB>TAB>TAB>$scoreWindow[$defector][$victim] -= 2;
TAB>TAB>TAB>$scoreWindow[$victim][$defector] += 1;
TAB>TAB>}
TAB>TAB>if ($round === $roundsPlayed - 1) {
TAB>TAB>TAB>$lastMove[$defector][$victim] = true;
TAB>TAB>}
    }
}

$line .= fgets(STDIN);
$state = unserialize(rtrim(fgets(STDIN), "\n"));
if (!$state) {
    $state = ['rand' => '', 'copying' => array_fill(1, $numPlayers, 0)];
}

$state['rand'] = hash_hmac('sha256', $state['rand'] . $line, $secretKey);
$victims = [];

if ($roundsPlayed > 1) {
    for ($other = 1; $other <= $numPlayers; ++$other) {
        if ($other === $myPlayerId) {
            continue;
        }

TAB>TAB>if ($roundsPlayed >= 10) {
TAB>TAB>TAB>$myScore = $scoreWindow[$other][$myPlayerId];
TAB>TAB>TAB>foreach ($scoreWindow[$other] as $betterPlayer => $betterScore) {
TAB>TAB>TAB>TAB>if ($betterScore >= 0.5 * $myScore && !psRand(0, $betterPlayer)) {
TAB>TAB>TAB>TAB>TAB>$state['copying'][$other] = $betterPlayer;
TAB>TAB>TAB>TAB>}
TAB>TAB>TAB>}
TAB>TAB>}

TAB>TAB>if ($state['copying'][$other]) {
TAB>TAB>TAB>if ($lastMove[$state['copying'][$other]][$other]) {
TAB>TAB>TAB>TAB>$victims[] = $other;
TAB>TAB>TAB>}
        } elseif ($betrayalCount[$other] > 7 || psRand() % 1024 < 32 || !$roundsRemaining ) {
            $victims[] = $other;
        }
    }
}

echo implode(' ', $victims), "\n", serialize($state), "\n";

इसे ठीक करने के लिए, ये प्रतिस्थापन करें:

  • के $hashOutput = rtrim(fgets(STDIN), "\n");साथ बदलें $line .= fgets(STDIN);(ऐसा नहीं है कि वास्तव में मायने रखता है)।
  • के if ($betterScore >= 3 * $myScore) {साथ बदलें if ($betterScore >= 0.5 * $myScore && !psRand(0, $betterPlayer)) {(यह वही है जो इसे मार दिया है)।

1
समय सीमा से पहले 3 मिनट और 25 सेकंड। मैं प्रसन्न हूँ।
जो जेड

बस एक अनुकूल अनुस्मारक: कोडिंग चरण खत्म हो गया है; आपको अपना स्रोत कोड पोस्ट करने के लिए एक दिन मिल गया है। (प्रक्रिया प्रश्न के निचले भाग पर है।)
जो जेड

चाहे मैं आपके पुराने संस्करण का उपयोग करूं या आपके नए संस्करण का, आपका कार्यक्रम अभी भी पहले ही सामने आता है। बधाई हो!
जो जेड

2

एक प्रतिशत

b61189399ae9494b333df8a71e36039f64f1d2932b838d354c688593d8f09477

उन कैदियों पर नज़र डालता है जिन्हें वह अपने से कम समझता है।


बस उन सभी से लेता है जिनके पास अंक कम या खुद के बराबर हैं। धारणा यह है कि उन कैदियों को बदले में लेने की संभावना कम है (या उनके पास अधिक होगा)। मैं नहीं जानता कि यह धारणा कितनी अच्छी है, लेकिन यही वह काम कर रहा है।

अंतिम दौर में भी सभी से लेता है । इसका शाब्दिक अर्थ नहीं है, क्योंकि उसके बाद कोई भी चोरी-चोरी नहीं कर सकता।

यदि आपको चिपकाया गया है क्योंकि चिपके हुए / रिक्त स्थान चिपके हुए कोड के कारण, यहाँ फ़ाइल का लिंक दिया गया है।

import java.io.BufferedReader;
import java.io.InputStreamReader;

class OnePercent {

    static int numPlayers;
    static int me;
    static int turn;
    static int[] values;

    public static void main(String[] args) {
        if(!readInput())
            return;
        String out = "";
        for(int i=1;i<values.length;i++){
            if(i != me && (values[i] <= values[me] || turn > (numPlayers*25-2)))
                out += i + " ";
        }
        out.trim();
        System.out.print(out);
    }

    static boolean readInput(){
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
            String line = reader.readLine();
            if(line == null)
                return false;
            String[] tokens = line.split(" ");
            if(tokens.length < 3)
                return false;
            numPlayers = Integer.valueOf(tokens[0]);
            me = Integer.valueOf(tokens[1]);
            turn = Integer.valueOf(tokens[2]);
            values = new int[numPlayers+1];
            for(int i=0;i<values.length;i++)
                values[i]=0;

            for(int i=0;i<turn;i++){
                line = reader.readLine();
                line = line.replaceAll("[)]",",");
                line = line.replaceAll("[( ]", "");
                tokens = line.split(",");
                for(int j=0;j<tokens.length-1;j+=2){
                    int thief = Integer.valueOf(tokens[j]);
                    int poor = Integer.valueOf(tokens[j+1]);
                    if(thief<1||poor<1||thief>numPlayers||poor>numPlayers)
                        continue;
                    values[thief]++;
                    values[poor] -= 2;
                }
            }
            reader.close();
        } catch(Exception e) {
            return false;
        }
        return true;
    }

}

याद रखें आप लोग 05-09 00:00समय सीमा तक अपने समाधानों में सुधार जारी रख सकते हैं ।
जो जेड

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

हाँ, मैं किसी को वास्तव में उस इनाम तक पहुँचने की उम्मीद नहीं करता। यह वास्तव में काफी गेम-थ्योरी-डिफाइडिंग सिद्धि होगी, शायद शोध की संभावनाओं में वास्तविक धन के लायक हो (एक ऐसा समाधान जो हमेशा सहयोग करने वाले दो लोगों की तुलना में बेहतर काम करता है! कल्पना कीजिए कि!) स्टैक एक्सचेंज पर सिर्फ एक खसरा 100 प्रतिष्ठा के बजाय।
जो जेड

1
@JoeZ। अज्ञात प्रविष्टियों के खिलाफ अन्य क्या करेंगे, यह सुनिश्चित करने के ज्ञान के साथ; मैं बहुत विश्वसनीय रणनीति नहीं देख सकता । आउटलेयर आउटलेयर होगा, मुझे लगता है।
जियोबिट्स

1
मुझे लगता है कि मैं अभी भी इसे इस समय के आसपास स्वीकार करूंगा, क्योंकि आपके कोड की रणनीति कुछ भी दुर्भावनापूर्ण नहीं दिखती है और वैसे भी इसके लिए बहुत कम प्रवेशकर्ता हैं।
जो जेड

1

यहाँ कुछ और पौधे हैं जो खेल में भाग लेंगे। ये अधिक उन्नत हैं, और कोडिंग चरण के अंत तक उनके स्रोत कोड का खुलासा नहीं किया जाएगा।

प्रश्न में चार पौधों की तरह, यदि वे अन्य सभी खिलाड़ियों की तुलना में अधिक स्कोर करने का प्रबंधन करते हैं, तो केवल एक वास्तविक प्रतियोगी द्वारा प्राप्त किए गए उच्चतम स्कोर को विजेता माना जाएगा।


धौंस दिखानेवाला

29AGVpvJmDEDI5Efe/afmMJRLaJ+TpjwVcz1GkxgYZs=

लोगों पर फिदा है।


न्यायाधीश

yjdCQ3uQ4YKe7xAKxdTFLF4d72fD4ACYpDLwkbzdISI=

गलत काम करने वालों को सजा देता है।


द लुनाटिक

m3FsRPocekCcK6GDswgnobV2CYOxX8LquChnKxrx1Wo=

पता नहीं क्या कर रहा है।


रोगी

nd7Pt3bVpFnuvDVeHQ5T9EPTq7KjNraVzp/KGtI73Vo=

कभी पहली चाल नहीं बनाता।


यदि ये केवल पौधे हैं, तो मुझे उन्हें अनुमति नहीं देने का कोई कारण नहीं दिखता है। यदि वे प्रतियोगी हैं जो जीत सकते हैं , मुझे लगता है कि यह केवल उचित है कि आपको उपरोक्त टिप्पणियों के
ज्योबिट्स

मैंने संक्षेप में अपनी प्रविष्टि पर विचार किया, फिर फैसला किया कि यह एक अनुचित प्रस्ताव है, भले ही मैं केवल एक ही बार प्रवेश करूं, क्योंकि खेल के कई अन्य तत्व मेरे नियंत्रण में हैं। इसलिए जो भी प्रविष्टियां मैं यहां करूंगा, वे सभी सिर्फ पौधे होंगी।
जो जेड

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

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

1

जैसे को तैसा

9GkjtTDD2jrnMYg/LSs2osiVWxDDoSOgLCpWvuqVmSM=

कुछ (उम्मीद के साथ) प्रदर्शन बढ़ाने वाले परिवर्तनों के साथ, क्रोधी के समान।

import sys
import re

line1 = [int(i) for i in sys.stdin.readline().split()]

players = line1[0]
pid = line1[1]
rounds = line1[2]

lines = []

if rounds == 0:
    print
elif rounds == 25 * players - 1:
    for i in range(players):
        if i+1 != pid:
            print i+1,
    print
else:
    for i in range(rounds):
        lines.append(sys.stdin.readline())
    lastline = lines[-1]
    takes = re.findall(r'\([0-9]+, [0-9]+\)', lastline)
    for take in takes:
        sides = [int(i) for i in re.findall(r'[0-9]+', take)]
        if sides[1] == pid:
            print sides[0],
    print

क्या आपको मेरा ईमेल पता मिला है?
जो जेड

@Joe; हाँ; धन्यवाद। (मुझे यकीन नहीं है कि मुझे इसकी आवश्यकता होगी, लेकिन मिलनसार होने के लिए धन्यवाद।)
यपनिप

ठीक है, मैं सिर्फ यह जानना चाहता था ताकि मैं इसे हटा सकूं।
जो जेड

1
@luserdroog लोग प्रोग्राम के बजाय अपने प्रोग्राम के सोर्स कोड की हैश पोस्ट कर रहे हैं। कोड लिखने के लिए 7 दिन का समय बीतने के बाद, लोग परीक्षण के लिए अपने वास्तविक कार्यक्रमों को प्रकट करेंगे।
जो जे।

1
हाँ यह सच है। एक सबमिशन में संभवतः एक शीर्षक होना चाहिए और कम से कम एक टैगलाइन जैसे कि जियोबाइट्स एक वहाँ होना चाहिए।
जो जेड

1

Backstab

अजगर ३

नाम के बावजूद, यह बॉट वास्तव में काफी दयालु है। लेकिन इसे बंद मत करो।

import sys, math

inp = [int(i) for i in sys.stdin.readline().split()]
inp.append([])
for i in range(inp[2]):
    inp[3].append(
        [eval(i+')') for i in sys.stdin.readline().split(')')[:-1]]
    )
inp += sys.stdin.readline()

# inp is [P, D, N, [M1, M2...], R]

dat = [[], inp[2] % 2] # average runlength take and don't per player, parity of round

lastatk = []

for i in range(inp[0]):
    dat[0].append([])
    lastatk.append(0)

for i,r in enumerate(inp[3]): # each round
    for m in r: # each move
        if m[1] == inp[1]:
            dat[0][m[0]-1].append(i) # round num they attacked
            lastatk[m[0]-1] = i # keep track of last attack

# now that we know who attacked me when, i can do some stats

nav = []
rl = []

for i in range(inp[0]):
    nav.append([[0], False])
    rl.append([[], []]) # attack, don't

for i in range(inp[2]): # each round
    for p in range(1, inp[0]+1): # each player
        if p != inp[1]: # let's not judge ourselves
            if i in dat[0][p-1]: # p attacked me in round i
                if nav[p-1][1]: # attack chain?
                    nav[p-1][0][-1] += 1
                else: # start attack chain!
                    rl[p-1][1] += [nav[p-1][0][-1]] # copy peace chain
                    nav[p-1][0].append(1)
                    nav[p-1][1] = True
            else: # peace!
                if not nav[p-1][1]: # peace chain?
                    nav[p-1][0][-1] += 1
                else: # peace to all!
                    rl[p-1][0] += [nav[p-1][0][-1]] # copy atk chain
                    nav[p-1][0].append(1)
                    nav[p-1][1] = False

print(nav)

print(inp[3])

# now, rl has runlengths for each player.

print(rl)

rl = [[sum(i[0])/len(i[0]+[0]), sum(i[1])/len(i[1]+[0])] for i in rl]

# rl now contains the averages w/ added zero.

# So, now we have average runtime and last attack. Let's quickly make some descisions.

out = []

for p in range(1, inp[0]+1): # each player
    if p != inp[1]: # again, let's not judge ourselves
        if lastatk[p-1] == inp[0]-1: # they attacked us!
            out.append(p)
        else: # whew, we can recover
            if inp[0] - lastatk[p-1] > rl[p-1][0]: # they're due to defend!
                out.append(p)
            elif int(__import__('binascii').b2a_hex(inp[-1].encode()), 16) % 4 == 0: # 1 in 4 chance of doing this
                out.append(p) # backstab!!1!!1one!!!1!!

print(*out)

संपादित 2 : स्रोत प्रकाशित किया गया था। वाह।

संपादित करें : कुछ परीक्षण के बाद मुझे कुछ खामियां मिलीं जो मैंने पाईं। वे एल्गोरिथम नहीं हैं, बस इनपुट पढ़ने वाले कुछ मुद्दे।


बस एक अनुकूल अनुस्मारक: कोडिंग चरण खत्म हो गया है; आपको अपना स्रोत कोड पोस्ट करने के लिए एक दिन मिल गया है। (प्रक्रिया प्रश्न के निचले भाग पर है।)
जो जेड

@JoeZ। की तैनाती। मुझे उम्मीद है कि मैं समय में हूं। : पी
cjfaure

P, D, N, R की तरह लगता है कि ड्राइव एक कार में शिफ्ट हो सकती है।
जो जेड

1
@JoeZ। xD वे आपके पद से हैं, इसलिए; 3
cjfaure

मेरी गलती है। क्षमा करें: एस
जो जेड

1

बीगरुगर

g1TXBu2EfVz/uM/RS24VeJuYMKLOaRatLxsA+DN1Mto=

कोड

मैं स्वीकार करूंगा कि मैंने इस पर ज्यादा समय नहीं दिया ...

import sys
p, d, n, o = input().split(' ') + ['']
p, d, n = int(p), int(d), int(n)
for i in range(n):
    r = input()
    r = r[1:len(r)-1].split(') (')
    for a in r:
        if int(a.split(', ')[1]) == d and not a.split(', ')[0] in o:
            o += a.split(', ')[0] + " "

input()
print(o)

बस एक अनुकूल अनुस्मारक: कोडिंग चरण खत्म हो गया है; आपको अपना स्रोत कोड पोस्ट करने के लिए एक दिन मिल गया है। (प्रक्रिया प्रश्न के निचले भाग में है।)
जो जेड

मैंने इसे चलाने की कोशिश की और निम्नलिखित बग में भाग गया: o += a.split(', ')[0]संख्याओं के बीच जगह नहीं छोड़ता है।
कृपया

@PleaseStand मैंने यह तय कर दिया है, लेकिन मुझे लगता है कि परीक्षण संस्करण बग के साथ समाप्त हो जाएगा क्योंकि प्रतियोगिता खत्म हो गई है।
किटकॉनर २२

हाँ, जब भी मैंने इसे चलाया, आपके कोड ने एक बग का निर्माण किया, और मैं यह पता नहीं लगा सका कि इसे कैसे ठीक किया जाए। यह आलसी की तुलना में थोड़ा बेहतर था, हालांकि।
जो जेड।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.