বন্দীর দ্বিধা v.2 - যুদ্ধ রয়্যাল


15

ভিতরে এই প্রশ্নের , কোনো গেম উদ্ভাবন করেন যা প্লেয়ার, বন্দীদের দূর্দশা মধ্যে যুগল দ্বারা যুগল বন্ধ একে অপরের মুখোমুখি, যা নির্ধারণ পুনরাবৃত্ত কৌশল অন্যদের বিরুদ্ধে সর্বোচ্চ রান হবে।

ভিতরে এই প্রশ্নের আমি একাধিক ব্যক্তি সব একই সময়ে একে অপরের বিরুদ্ধে প্রিজনার্স 'উভয়সঙ্কট খেলার জন্য একটি উপায় উদ্ভাবন। এই প্রকরণে, পেওফ ম্যাট্রিক্স অপ্রয়োজনীয়, উভয় খেলোয়াড়ের প্রতিটি জুটির মধ্যে প্রতিটি ফলাফল দুটি কার্যত স্বাধীন সিদ্ধান্তের যোগফল।

আপনার কাজটি হ'ল মাল্টিপ্লেয়ার প্রিজনারের দ্বিমাটির এই প্রতিসামিত, সাধারণ সংস্করণটি খেলতে একটি এআই তৈরি করা যা সর্বোচ্চ স্কোর অর্জন করবে।


খেলার নিয়ম

এই মাল্টিপ্লেয়ারের প্রতিটি রাউন্ডে, বহু-রাউন্ড প্রিজনারের দ্বিমা, কোনও খেলোয়াড় Aঅন্য কোনও খেলোয়াড়ের কাছ থেকে "1" নেওয়ার সিদ্ধান্ত নিতে পারেন B। এই পরিস্থিতিতে, Aএর স্কোর 1 দ্বারা বৃদ্ধি পায়, যখন Bএর স্কোর 2 হ্রাস পায় ordered এই সিদ্ধান্তটি প্রতিটি আদেশযুক্ত খেলোয়াড়ের মধ্যে হওয়ার অনুমতি দেওয়া হয় allowed

প্রতিটি খেলোয়াড়ের জন্য এটিই একমাত্র সিদ্ধান্ত - একে অপরের খেলোয়াড়ের কাছ থেকে "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), একটি সিউডোরান্ডম বীজ হিসাবে কাজ করতে। এই সংখ্যাগুলি একটি প্রাক-উত্পন্ন ফাইল থেকে পড়া হবে, যা টুর্নামেন্টের শেষে প্রকাশ করা হবে যাতে লোকেরা নিজেরাই ফলাফলগুলি যাচাই করতে পারে।

  • আপনার প্রোগ্রামটি যদি পূর্ববর্তী রাউন্ডে এরকম আউটপুট তৈরি করে তবে আপনার প্রোগ্রামে পড়তে হবে এমন একটি অতিরিক্ত লাইন যা কিছু প্রোগ্রামের প্রতিনিধিত্ব করে program গেমের শুরুতে, এই লাইনটি সর্বদা খালি থাকবে। এই লাইনটি স্কোরিং কোড বা অন্য প্রোগ্রামগুলির দ্বারা কোনও সংশোধন করা হবে না।

প্রতিটি প্রোগ্রাম তারপরে স্ট্যান্ডার্ড আউটপুট থেকে নিম্নলিখিত উত্পাদন করতে তার কৌশল ব্যবহার করবে :

  • Kসংখ্যার একটি তালিকা , যা প্রোগ্রামগুলির আইডি এটি এই রাউন্ড থেকে "1 নেবে"। একটি খালি আউটপুট মানে এটি কিছুই করবে না।

  • Allyচ্ছিকভাবে, পরবর্তী রাউন্ডগুলিতে প্রেরণে একরকম অতিরিক্ত লাইন যা রাষ্ট্রের কিছু রূপকে উপস্থাপন করে। এই সঠিক লাইনটি পরবর্তী রাউন্ডে প্রোগ্রামে ফিরে দেওয়া হবে।

নীচে 34 খেলোয়াড়ের খেলায় আইডি প্লেয়ারের জন্য গেমের শুরুর জন্য একটি উদাহরণ ইনপুট রয়েছে :

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 হ্যাশ পোস্ট করুন। আপনি সময়সীমার আগে যে কোনও সময় এই হ্যাশটি পরিবর্তন করতে পারেন তবে সময়সীমার পরে পোস্ট করা প্রতিশ্রুতি রায় দেওয়ার জন্য গ্রহণ করা হবে না। (দয়া করে আপনার হ্যাশগুলির জন্য বেস not৪ স্বরলিপিটি ব্যবহার করুন, কারণ আমার যাচাইকরণের প্রোগ্রামটি বেস 64৪ কে আলাদা করে দেয় এবং এটি আরও কমপ্যাক্ট স্বরলিপি।

সময়সীমা শেষ হওয়ার পরে, 2014-05-10 00:00 UTCআপনার জমা দেওয়ার জন্য আপনার প্রোগ্রামের আসল উত্স কোড পোস্ট করতে আপনার 1 দিন (অবধি ) সময় থাকবে । আপনার পোস্ট করা সোর্স কোডের SHA256 হ্যাশ যদি আপনার সময়সীমার আগে পোস্ট করা কোনও হ্যাশের সাথে মেলে না, তবে আপনার কোডটি টুর্নামেন্টে স্বীকৃত হবে না।

এর পরে, আমি আমার কম্পিউটারে সমস্ত জমাগুলি ডাউনলোড করব, এবং এই যুদ্ধের সমস্ত টুর্নামেন্টের এন্ট্রি চালাবো রোয়ালে, আশা করছি এরপরে 2 দিনের মধ্যে ফলাফল পোস্ট করে 2014-05-12 00:00 UTC

আমি উত্তরটি সর্বোচ্চ স্কোর সহ গ্রহণ করব এবং এর উত্তরের স্কোর যদি এর চেয়ে বেশি হয় তবে +১০০ এর উত্তরে পুরস্কার দেব 0

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

হোস্ট মেশিন

আমি এই সমাধানগুলি আমার কম্পিউটারে ভার্চুয়াল মেশিনে চালাচ্ছি। এই ভার্চুয়াল মেশিনটি 2 গিগাবাইট র‍্যাম সহ উবুন্টু লিনাক্স 14.04 চালাবে। আমার বেস মেশিনে একটি ইনটেল আই 7-2600 কে প্রসেসর রয়েছে 3.40 গিগাহার্টজ এ চালিত।

আবশ্যকতা

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

আপনার প্রোগ্রাম অবশ্যই 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

Enর্ষাপ্রাপ্ত ব্যক্তি - বর্তমানের সর্বোচ্চ স্কোরকে বাদ দিয়ে 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

বিচারক প্রোগ্রাম

আমি বিচারকের প্রোগ্রাম পোস্ট করেছি আমি গিথুব এ ব্যবহার করব । এটি ডাউনলোড করুন এবং এটি পরীক্ষা করে দেখুন। (এবং আপনি যদি একটি খুঁজে পান তবে একটি বাগ বা দুটি ঠিক করতে পারেন: P)

এই মুহুর্তে পাইথন ব্যতীত অন্য কোনও কিছুর সংকলনের বিকল্প নেই। আমি পরে সেগুলি অন্তর্ভুক্ত করব - লোকেরা যদি অন্য ভাষার জন্য সংকলন বা ব্যাখ্যা স্ক্রিপ্টগুলিতে অবদান রাখতে পারে তবে আমি অনেক বেশি বাধ্য থাকব।


দ্বিতীয় পর্যায়: উত্স কোড জমা দেওয়া

আমি tournamentপ্রতিযোগিতার জন্য গিথুব সংগ্রহস্থলে একটি নতুন শাখা পোস্ট করেছি , এতে পিডি_র্যান্ড ফাইল এবং অন্যান্য উদ্ভিদ এন্ট্রি রয়েছে। আপনি হয় এখানে আপনার উত্স কোড পোস্ট করতে পারেন বা একটি শাখার কাছে একটি অনুরোধ হিসাবে জমা দিতে পারেন।

প্রতিযোগীদের ক্রম নিম্নরূপ হবে:

'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 জন নিয়েছে যার উপরের একটি গড়-গড় সংখ্যার বার ছিল) তার পরিবর্তে উচ্চতর স্কোরিং শেষ হয়েছিল, যখন সিমুলেশন পরীক্ষায় এটি আসলে বরং কম স্কোর পেতে।

এবং অন্যেরা যে (আমি ভেবেছিলাম) এত অবাক হয় নি:

  • রোগী রেটফুলের চেয়ে পূর্ণ 484 পয়েন্ট বেশি রান করেছে scored এটি প্রথমবারের মতো সহযোগিতা করার জন্য অর্থ প্রদান করে।

  • এক শতাংশে খুব তাড়াতাড়ি নীচে নেমে প্রায় কেউই লাথি মারেনি। দেখে মনে হচ্ছে যে 1% কেবল সেই পথেই থাকতে সক্ষম কারণ তাদের খেলায় আরও খেলোয়াড় রয়েছে।

যাইহোক, এখন টুর্নামেন্টটি শেষ হয়ে গেছে, আপনার পছন্দমতো অতিরিক্ত খেলোয়াড় পোস্ট করুন এবং বিচারক প্রোগ্রামটি ব্যবহার করে তাদের সাথে চারপাশে পরীক্ষা করুন around


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

2
আমি বুঝতে পারছি না। সারা সময় 1 জন করে প্রত্যেকের জন্য কি কোনও ধরণের জরিমানা রয়েছে? সর্বদা 1 নেওয়া কি সবচেয়ে বেশি সুবিধাজনক হবে না?
ড্যাঙ্কমিমেস

1
লোভী কীভাবে সর্বোচ্চ ক্ষতি করতে পারে না? আমরা যদি অন্য খেলোয়াড়ের কাছ থেকে নিই, অন্য খেলোয়াড়টি কেবল -1 বা -2 পাবে, যখন আমরা না নিই, অন্য খেলোয়াড় 1 বা 0 পেতে পারে vious স্পষ্টতই অন্য খেলোয়াড়ের কাছ থেকে 1 নেওয়ার ফলে ক্ষতিটি সর্বাধিক বৃদ্ধি পাবে। এবং তাই লোভী কখনই হারাবে না। এবং এটি সবসময়ই জিতবে, যতক্ষণ না সমস্ত প্রতিদ্বন্দ্বী লোভী না হয়, যেমনটি আপনি বলেছেন।
justhalf

1
@ ট্রিমস্টি যখন চ্যালেঞ্জটি প্রথম উঠেছিল তখন গাছগুলির জন্য কোডটি প্রদর্শিত হয়নি। পুরো কোডিং পর্বের মধ্য দিয়ে আমরা অন্যান্য উত্তর দেখতে পেলাম না। ডুপস খুব স্পষ্ট লোভী কৌশল বেছে নিয়ে দুর্ঘটনার দ্বারা খাঁটিভাবে ঘটতে পারে ।
জিওবিটস

2
@ জাজাফাল্ফ যদি আপনি পুনরুক্তি হওয়া বন্দির দ্বিধাদ্বন্দ্বের কৌশলগুলি নিয়ে বাস্তবে কোনও পুনর্বারচনা পড়ে থাকেন তবে আপনি কি জানতেন যে আপনি মিথ্যা বলছেন। Wikipedia নিবন্ধটি শুরু একটি ভাল জায়গা হয়।
জো জেড।

উত্তর:


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

তিনি যে নীচে বন্দীদের বিবেচনা করেন সেগুলি দেখুন।


কেবল নিজের থেকে কম বা সমান পয়েন্ট থাকা প্রত্যেকের কাছ থেকে নেওয়া। ধারণাটি হ'ল সেই বন্দীদের বদলে নেওয়ার সম্ভাবনা কম (বা তাদের আরও বেশি হবে)। আমি জানি না যে এটি অনুমানের কতটা ভাল , তবে তিনি এটি পরিচালনা করছেন।

সর্বশেষ রাউন্ডের প্রত্যেকের কাছ থেকেও নেয় । আক্ষরিকভাবে এর কোনও খারাপ দিক নেই, যেহেতু কেউ এর পরে প্রতিশোধ-চুরি করতে পারে না।

পেস্ট কোড থেকে ট্যাব / স্পেসের কারণে যদি আপনার হ্যাশ পেতে সমস্যা হয় তবে ফাইলটি নিজেই এখানে একটি লিঙ্ক's

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। অন্যরা কী করবে তা জানার সাথে, অবশ্যই;) অজানা এন্ট্রিগুলির বিরুদ্ধে, আমি খুব নির্ভরযোগ্য কৌশল দেখতে পাচ্ছি না । আমার ধারণা, আউটলিয়াররা আউটলিয়ার হবে।
জিওবিটস 21

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

1

এখানে আরও কয়েকটি গাছ রয়েছে যা খেলায় অংশ নিবে। এগুলি আরও উন্নত এবং কোডিং পর্বের সমাপ্তি অবধি তাদের উত্স কোডটি প্রকাশিত হবে না।

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


বুলি

29AGVpvJmDEDI5Efe/afmMJRLaJ+TpjwVcz1GkxgYZs=

মানুষের উপর বাছাই।


বিচারক

yjdCQ3uQ4YKe7xAKxdTFLF4d72fD4ACYpDLwkbzdISI=

অন্যায়কারীদের শাস্তি দেয়।


পাগল

m3FsRPocekCcK6GDswgnobV2CYOxX8LquChnKxrx1Wo=

কোন ধারণা আছে কি তা করছেন।


রোগী

nd7Pt3bVpFnuvDVeHQ5T9EPTq7KjNraVzp/KGtI73Vo=

প্রথম পদক্ষেপ কখনও না।


এগুলি যদি কেবল উদ্ভিদ হয় তবে আমি তাদের অনুমতি না দেওয়ার কোনও কারণ দেখতে পাচ্ছি না। যদি তারা জিততে পারে এমন প্রতিযোগী হয় তবে আমি মনে করি এটি কেবলমাত্র উপযুক্ত যে আপনি উপরের মন্তব্যে
জিওবিটস

আমি সংক্ষেপে আমার নিজের এন্ট্রি থাকার বিবেচিত, তারপর সিদ্ধান্ত নিয়েছে যে একটি অন্যায্য প্রস্তাব পুরাপুরি এমনকি যদি আমি শুধুমাত্র আরো এক প্রবেশ, যেহেতু খেলা অনেক অন্যান্য উপাদান আমার নিয়ন্ত্রণের অধীনে আছে। সুতরাং আমি এখানে যে কোনও এন্ট্রি রাখি তা কেবল গাছপালা হবে be
জো জেড।

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

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

1

চামচিকা-জন্য-Tat

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; হ্যাঁ; ধন্যবাদ। (আমি নিশ্চিত এটি আমার প্রয়োজন হবে না, তবে থাকার জন্য ধন্যবাদ।)
Ypnypn

ঠিক আছে, আমি কেবল জানতে চেয়েছিলাম যাতে আমি এটি মুছতে পারি।
জো জেড।

1
@ লেজারড্রোগ লোকেরা প্রোগ্রামের পরিবর্তে তাদের প্রোগ্রামের সোর্স কোডের হ্যাশ পোস্ট করছে। কোড লেখার 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। পোস্ট. আমি আশা করি সময় মতো : P: P
সিজেফুরে

পি, ডি, এন, আর এর মতো শব্দগুলি গাড়ি চালাচ্ছে এমন ড্রাইভের মতো।
জো জেড।

1
@JoeZ। এক্সডি তারা আপনার পোস্ট থেকে, তাই 3
সিজেফায়ার

ওহ! আমার দুরবস্থা. দুঃখিত: এস
জো জেড।

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]সংখ্যার মধ্যে স্থান ছাড়বে না।
স্ট্যান্ড

@ প্লিজস্ট্যান্ড আমি এটি স্থির করেছি, তবে আমি মনে করি যে প্রতিযোগিতা শেষ হওয়ার কারণে পরীক্ষিত সংস্করণটি বাগের সাথে শেষ হবে।
kitcar2000

হ্যাঁ, আপনার কোডটি যখনই আমি এটিকে চালিত করেছি তখন একটি ত্রুটি তৈরি হয়েছিল এবং কীভাবে এটি ঠিক করব তা আমি বুঝতে পারি না। যদিও এটি অলসের চেয়ে কিছুটা ভাল করেছে।
জো জেড।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.