প্রতিপক্ষের অ্যাক্সেস সহ কয়েদিদের দ্বিধা


21

এই চ্যালেঞ্জটিতে আপনি এমন একটি বট লিখবেন যা বন্দীর দ্বন্দ্ব বাজবে। এখানে ধরা আছে: আপনি আগের গেমগুলির ইতিহাসে অ্যাক্সেস পাবেন না। পরিবর্তে, আপনার কাছে প্রতিপক্ষের কাছেই অ্যাক্সেস থাকবে। এই সংস্করণে, উভয় খেলোয়াড়ই দু'জনকে সহযোগিতা করলে +2 পয়েন্ট পায়, যদি তারা উভয়ই ত্রুটিযুক্ত হয় তবে +1 পয়েন্ট এবং যদি একজন সহযোগিতা করে তবে একটি ত্রুটি করে, খেলোয়াড় +3 পায় এবং অন্যটি পয়েন্ট পায় না। প্রতিটি জমা দেওয়ার জন্য নিজেই সহ অন্যান্য জমা দেওয়ার বিরুদ্ধে খেলবে 10 বার। বিজয়ী হ'ল সর্বাধিক পয়েন্ট সহ জমা দেওয়া।

নিয়ামক : আপনি ফর্ম আকারে একটি জাভাস্ক্রিপ্ট ফাংশন লিখতে হবে

function submissionName(them) {
  /* Your code here */
}

কন্ট্রোলার nameফলাফলগুলি প্রদর্শন করতে ফাংশনের সম্পত্তি ব্যবহার করে , সুতরাং যদি এটি এই ফর্ম্যাটটিতে না থাকে (এবং পরিবর্তে হয় f = x => ...বা হয় f = function() { ... }) তবে আপনার স্কোরটি দেখতে অসুবিধা হবে এবং আপনি নিজের ফাংশনটি অ্যাক্সেস করতে সক্ষম হবেন না।

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

উদাহরণ (প্রতিযোগিতা করা হবে):

function cooperate(them) {
    return 'C';
}

function defect(them) {
    return 'D';
}

function nice(them) {
    // Do whatever they would do when faced with a cooperator
    return them(wrap(_ => 'C'));
}

নিয়ামক এখানে উপলব্ধ

বিধি :

  • আপনি প্রতিপক্ষের কোডটি নিজেই দেখতে পারবেন না। সমস্ত ফাংশন মোড়ানো হয় যাতে toString()ডাকা হলে তারা একই দেখায় । প্রতিপক্ষকে পরীক্ষা করার একমাত্র উপায় (যিনি নিজে হতে পারেন) তাদের পরীক্ষা করা।
  • আপনার ফাংশনটি হ্রাসকারী হতে হবে না। আপনি কেবল নিজের ক্রিয়াকলাপে যেমন বৈশিষ্ট্যগুলি সেট করে রাষ্ট্র বাঁচাতে পারেন submissionName.state = {};। যাইহোক, ম্যাচগুলির মধ্যে (এমনকি একই খেলোয়াড়ের ম্যাচের মধ্যেও), রাষ্ট্রকে কল করে toString()এবং সাফ করা হয় eval। অতএব, আগের ম্যাচের কোনও স্মৃতি নেই।
  • প্রতিটি ম্যাচে প্রথমে যে ক্রিয়াকলাপটি ডাকা হয় তার ক্রমটি এলোমেলোভাবে করা হয়।
  • যদি আপনার কোড কোনও ত্রুটি ছুড়ে ফেলে তবে এটির সাথে বিবেচনা করা হবে যেমন আপনি প্রতিপক্ষকে ত্রুটিযুক্ত অবস্থায় সহযোগিতা করেছিলেন। আপনি যদি প্রথম চালান, তবে প্রতিপক্ষের কোডটি কল করা হবে না। আপনি কল করার সময় আপনার প্রতিপক্ষের কোডটিতে ত্রুটি দেখা দিলেও এটি ঘটে them। স্ট্যাক ওভারফ্লো ত্রুটিগুলি সম্পর্কে সতর্ক থাকুন, বিশেষত যদি আপনার কোডগুলি কল করে them(wrap(submissionName)), কারণ তারা এটি করতে পারে।
  • আপনি ভেরিয়েবল অ্যাক্সেস নাও করতে পারেন selfবা অন্য কোনও ভেরিয়েবল যা সুযোগে ঘটে যখন evalফাংশনটি এক্সেসপেট বলা হয় wrap। এই ফাংশনটি আপনাকে নিয়ন্ত্রণকারীকে কোনও ফাংশনটি কীভাবে কল করে তার থেকে পৃথক পদ্ধতিতে প্রতিপক্ষকে কল করতে দেয়। তোমাদের লিখছি না হতে পারে Math, windowইত্যাদি (আপনি যেমন ফাংশন ব্যবহার করতে পারে Math.random(), তবে)।
  • আপনি কোনও Errorবা অন্য কোনও পদ্ধতি তৈরি করে স্ট্যাক ট্রেস অ্যাক্সেস করতে পারবেন না ।

খুব বেশি সময় নেওয়ার বিষয়ে একটি নোট: দয়া করে একটিতে আটকা পড়ুন whileচিরকালের জন্য লুপ। উভয় প্রতিযোগীদের সম্মিলিত সময় কোনও প্রদত্ত রাউন্ডে 1 সেকেন্ডের বেশি হওয়া উচিত নয়। এটি প্রয়োগ করার জন্য, 1000 এমএস এবং 2000 এমএসের মধ্যে একটি এলোমেলো সময়সীমাটি বেছে নেওয়া হয়েছে (এটি ইচ্ছাকৃতভাবে একটি জ্ঞাত সময়ের জন্য অপেক্ষা করে গেমিং এড়ানোর জন্য) এবং যদি কর্মী এটি কার্যকর করতে বেশি সময় নেয় তবে একটি ত্রুটি নিক্ষেপ করা হবে। যদি এটি ঘটে থাকে তবে ত্রুটির কারণ নিম্নলিখিত হিসাবে নির্ধারণ করা হবে: 1000 এমএসের পরে একটি এলোমেলো মুহুর্তে মৃত্যুদন্ড কার্যকর করা হবে এবং সেই মুহুর্তে কল স্ট্যাকটি পরিদর্শন করা হবে। সর্বাধিক পরিচিত প্রতিদ্বন্দ্বী যা বর্তমানে একটি লুপে রয়েছে (বা লুপের মতো পুনরাবৃত্তি, এই অর্থে যে এটি একটি স্ট্যাক ওভারফ্লো ত্রুটি এড়াতে পুনরাবৃত্তি সেট আপ করা হয়েছে) দোষ দেওয়া হবে। যদি একই প্রতিযোগীকে বেশ কয়েকবার "বেশি সময় নেওয়া" ত্রুটির কারণ হিসাবে দোষ দেওয়া হয়, তবে সেই প্রতিযোগীকে অযোগ্য ঘোষণা করা হবে।


এই চ্যালেঞ্জটি আমাকে ডলার বিল নিলামের কথা মনে করিয়ে দেয় ।
এলিয়েন

পরীক্ষা করার জন্য ব্যবহার করা ফাংশনটি themকি নিয়মাবলী / নিয়ম অনুসরণ করতে হবে? উদাহরণস্বরূপ function me(them){let log=0;them(x=>{++log;return 'C';}); ফেরত লগ == 0? 'ডি': 'সি';
user

2
যদি উভয় ফাংশন তাদেরকে (মোড়ানো (কিছু)) কল করে, আপনি কীভাবে পুনরাবৃত্তি রোধ করতে পারবেন? আমি কিছু অনুপস্থিত করছি?
কুইন্টেক

@ কুইন্টেক আপনি পুনরাবৃত্তি এবং লুপগুলি ব্যবহার করতে পারেন। এটি কেবলমাত্র যে পুনরাবৃত্তি একটি StackOverflowত্রুটির ফলস্বরূপ প্রয়োজন এবং এমন অসীম লুপ নয় যা কখনই ছাড়বে না। যদি এটির ফলাফল হতে পারে StackOverflowতবে নিশ্চিত হয়ে নিন যে আপনি একটি চেষ্টা-ধরার বিবৃতি যুক্ত করেছেন। পুনরাবৃত্তির উদাহরণের জন্য যা 1 সেকেন্ডের মধ্যে স্ট্যাকওভারফ্লো ত্রুটিতে পৌঁছায় না, আপনার আরও স্ট্যাকওভারফ্লো.com
soktinpk

1
@ কুইন্টেক অগত্যা নয়। উদাহরণস্বরূপ, them(() => 'C')কোনও ত্রুটির পরিণতি হবে না কারণ যখন বিরোধী ফোন করে them, তখন এটি () => 'C'ফাংশনটি কল করে । কেবলমাত্র মোড়ানোর দরকার আছে try-catchযদি আপনি themকোনও ফাংশনের themএকটি প্যারামিটার দিয়ে কল করেন যা কিছু ফাংশনের প্যারামিটার দিয়ে কল করে themetc. ইত্যাদি (অসীম)। উদাহরণস্বরূপ, them(t => t(() => 'C'))প্রতিপক্ষ যে খেলবে তা খেলবে যদি প্রতিপক্ষের মনে হয় তারা খেলছে nicestackoverflowত্রুটির সম্ভাবনা নেই ।
soktinpk

উত্তর:


14

BoomBot

function boom(them) {
  throw 1;
}

যদি প্রতিপক্ষটি প্রথমে চালিত হয় এবং এটিকে কল না করে try..catch, এই বটটি স্বয়ংক্রিয়ভাবে 3 পয়েন্ট জিতবে। অন্য যে কোনও ক্ষেত্রে জিরো পয়েন্ট।


যদি প্রতিপক্ষটি প্রথমে চালিত হয় এবং এটি কল না করে, তবে এটি 3 পয়েন্ট হারাবে, তাই না?
ব্যবহারকারী 202729

1
@ ব্যবহারকারী202729 আরও স্পষ্টভাবে, প্রতিপক্ষ 3 পয়েন্ট পাবেন এই গেমটিতে কোনও হারানোর পয়েন্ট নেই।
বুবলার

10

আর্কিওপ্টেরিক্স

function archaeopteryx(them) {
  const guard = them => us => {
    try {
      return them(wrap(them => us(guard(them))));
    } catch (e) {
      return 'C';
    }
  };
  const f = guard(them);
  return f(f => 'C') == 'C' ? f(f => 'D') : f(f => 'D') == 'C' || f(f => f(f => 'C')) == 'C' ? 'D' : 'C';
}
  • প্রতিপক্ষ যদি সহযোগিতা করে cooperateতবে তার বিরুদ্ধে প্রতিপক্ষের পদক্ষেপ নকল করুন defect
  • অন্যথায়, যদি প্রতিপক্ষ সহযোগিতা করে defect বা এর সাথেnice তবে ত্রুটি।
  • অন্যথায়, সহযোগিতা করুন।

এটি কী একটি ভাল কৌশল করে? আমার কোন ধারণা নাই. আমি এটি একটি বিবর্তনীয় অ্যালগরিদম ব্যবহার করে উত্পন্ন করেছি, যা বর্তমান জমা দেওয়ার উপর আংশিকভাবে প্রশিক্ষিত।

Tiktaalik

function tiktaalik(them) {
  const guard = them => us => {
    try {
      return them(wrap(them => us(guard(them))));
    } catch (e) {
      return 'C';
    }
  };
  const f = guard(them);
  return f(f => 'C') == 'D' ? f(f => 'D') == 'C' ? 'D' : 'C' : f(f => 'D') == 'D' ? 'D' : f(f => f(f => 'D'));
}
  • যদি প্রতিপক্ষের বিরুদ্ধে ত্রুটি থাকে cooperateতবে তার বিরুদ্ধে প্রতিপক্ষের পদক্ষেপটি উল্টে দিনdefect
  • অন্যথায়, যদি প্রতিপক্ষের বিরুদ্ধে ত্রুটি থাকে defect , তবে ত্রুটি।
  • অন্যথায়, প্রতিপক্ষের বিরুদ্ধে নকল করা notNice

আরেকটি বিবর্তনগতভাবে উত্পন্ন কৌশল।


6

WhatWouldBotDoBot

function WWBDB(them) {
    let start = performance.now();
    let cc = 0, cd = 0, dc = 0, dd = 0;
    try {
        for (let i = 0; i < 10; i++) {
            them(() => 'C') == 'C' ? cc++ : cd++;
            them(() => 'D') == 'C' ? dc++ : dd++;
            if (performance.now() - start > 500) break;
        }
    }
    catch (e) {}
    return 2 * cc >= 3 * dc + dd ? 'C' : 'D';
}

হোয়াটহোল্ডবটডোবট মোটামুটি সহজ; এটি কেবল একটি স্থির রাষ্ট্র প্রোগ্রামের বিরুদ্ধে এটি করবে তার প্রতিপক্ষকে পরীক্ষা করে। যদি কোনও বট যদি সম্ভব হয় সহযোগিতা করতে পছন্দ করে, ডাব্লুডাব্লুবিডিবিও সহযোগিতা পছন্দ করবে (সুতরাং এটি দুর্দান্ত বোটে সহযোগিতা করবে)। ডাব্লুডাব্লুবিডিবি নিজেই সহযোগিতা পছন্দ করে না।


5

রাষ্ট্রীয় পরীক্ষা করুন

function checkStateful(them) {
  let stateful = false;
  let response = 'D';
  try {
    response = them(wrap(function (them) {
      stateful = true;
      return 'C';
    }));
  } catch (e) {
  }
  if (stateful) {
    return 'D';
  }
  return response;
}

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


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

স্ব-কোপ দিয়ে রাষ্ট্রীয় পরীক্ষা করুন

function checkStatefulSelfCoop(them) {
  let stateful = false;
  let response = 'D';
  if (!checkStatefulSelfCoop.invokeCounter) {
    checkStatefulSelfCoop.invokeCounter = 0;
  }
  let lastInvoke = ++checkStatefulSelfCoop.invokeCounter;
  try {
    response = them(wrap(function (them) {
      stateful = true;
      return 'C';
    }));
  } catch (e) {
  }
  if (checkStatefulSelfCoop.invokeCounter > lastInvoke) {
    return 'C';
  }
  if (stateful) {
    return 'D';
  }
  return response;
}

4

RandomBot

function rand(them) {
  return 'CD'[Math.random() * 2 | 0]
}

কারণ কেন নয়।


3

জটিলতা

function complexity(them) {
    try {
        let coop_w_def = them(wrap(() => "D")) == "C",
            coop_w_coop = them(wrap(() => "C")) == "C",
            coop_w_nice = them(wrap((a) => a(wrap(() => "C")))) == "C",
            coop_w_nnice = them(wrap((a) => a(wrap(() => "D")))) == "C";
        if (coop_w_def && coop_w_coop && coop_w_nice && coop_w_nnice) return "C";
        let def_w_def = them(wrap(() => "D")) == "D",
            def_w_coop = them(wrap(() => "C")) == "D",
            def_w_nice = them(wrap((a) => a(wrap(() => "C")))) == "D",
            def_w_nnice = them(wrap((a) => a(wrap(() => "D")))) == "D";
        if (def_w_def && def_w_coop && def_w_nice && def_w_nnice) return "C";
    } catch (e) {}
    return "D";
}

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


3
function onlyTrustYourself(them) {

  function tester (){
  }

  onlyTrustYourself.activated = false;

  try{them(tester);}
  catch(e){}

  if(them.name == "tester")
  {
    onlyTrustYourself.activated = true;
  }

  if(onlyTrustYourself.activated)
  {
    return 'C';
  }

  return 'D';
}

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


চতুর ধারণা, কিন্তু যখন অন্য ব্রো কোনও testerফাংশন করে তখন কী ঘটে : ডি
ভি। কুর্তোইস



2

সাধারণ বোধ

function commonSense(them) {
  try {
    var ifC = them(wrap(_ => 'C'));
    var ifD = them(wrap(_ => 'D'));

    if (ifD === 'C') {
      return 'D';
    }

    return them(_ => ifC);
  } catch (e) {
    return 'D';
  }
}

দাবি অস্বীকার : আমি কি জাভাস্ক্রিপ্ট জানি না।

আপনি যদি কোনও সুন্দর ব্যক্তিকে লাভ করতে পারেন তবে এটি করুন। অন্যথায়, তারা যদি সহযোগিতা করার মুখোমুখি হয় তবে তারা কী ফিরে আসবে তা ফিরিয়ে দিন (কমপক্ষে, আমি মনে করি এটি এটি করে)।


2

এবং আপনি কোথায় যেতে চান? (জঙ্গলের বইয়ের ভোল্টারে অনুপ্রাণিত)

    নিজেকে (তাদের) কাজ করুন {
      পরখ করে দেখুন {
        তাদের ফিরিয়ে দিন (এটি);
      } ধরা (ঙ) {
        "ডি" প্রত্যাবর্তন;
      }
    }

   নিজেকে (কোনটি) তাদের ফাংশন করুন {
      পরখ করে দেখুন {
        তাদের ফিরিয়ে দিন (নিজেই_ও_এই নয়);
      } ধরা (ঙ) {
        "ডি" প্রত্যাবর্তন;
      }
    }

এটি কেবল একটি টুর্নামেন্টে আমি জিতেছি। ভাল করেছ!
মেগাটম

আমি কেবল লক্ষ্য করেছি যে এই বটটি নিয়ম লঙ্ঘন করে। "আপনি ভেরিয়েবলটি অ্যাক্সেস করতে পারেন না ..." thisস্ব হিসাবে একই। আমি মনে করি আপনি বলতে চেয়েছিলেন return them(yourself)
মেগা টম

টেকনিক্যালি ( xkcd.com/1475 );) thisকোনও চলক নয়, এটি একটি মূলশব্দ এবং কোনও ফাংশনের প্রসঙ্গে this!=selfselfউইন্ডো অবজেক্ট এবং thisফাংশনটি নিজেই বোঝাতে চাইবে (সর্বদা এটি প্রাসঙ্গিককে বোঝায় এটি সেটিকে ভেরিয়েবল হিসাবে বিবেচনা করা হয় না। এ কারণেই var self = this;অনেক কোড-উদাহরণের সূচনা হওয়া বিভ্রান্তিকর হিসাবে বিবেচিত হতে পারে। "এই" ছাড়াই সংস্করণ যুক্ত হয়েছে
টিএস

1
না this। ফাংশন উল্লেখ করা হয় না। yourselfএবং yourself_no_thisরান আলাদাভাবে পরিবর্তিত হয়। thisমূলত জাভাস্ক্রিপ্টে ফাংশন বোঝায় না। দেখুন: ডেভেলপার.মোজিলা.আর.ইন-
ইউএস

2

পরিদর্শকদের শাস্তি দিন

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

function punishInspectors(them) {
  var inspections = 0;
  var result;
  try{
    result = them(wrap(function(_){
      inspections += 1;
      return 'D';
    }))
  }catch(e){
    result = 'D';
  }
  return (inspections > 1) ? 'D' : (inspections === 1) ? result : 'C';
}

ইতিহাস

এই প্রতিপক্ষকে বনাম আমি যে শেষ বটটি দেখেছি তা কি করবে?

function history(them) {
  var res = 'D';
    if(history.last){
    try{
      res = history.last(them);
    }catch(ex){}
  }
  history.last = them;
  return res;
}

10000 রাউন্ড টুর্নামেন্টের ফলাফল:

1  defect...................365226
2  complexity...............353492
3  punishInspectors.........349957
4  checkStatefulSelfCoop....348913
5  checkStateful............333481
6  cooperate................329870
7  archaeopteryx............323624
8  selfapply................319533
9  tiktaalik................318663
10 history..................315266
11 rand.....................300735
12 randalt..................297561
13 yourself.................293701
14 notNice2.................283744
15 NotNice..................260350
16 WWBDB....................245281
17 nice.....................245036
18 commonSense..............242546
19 trickybot................181696
20 boom.....................67245

আমার পরিবর্তিত টুর্নামেন্টের কোডটি এখানে রয়েছে: jsfiddle.net/eyqL4a8d/2
মেগাটম

2

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

function Mal(them) {
  if (Mal.sandboxed == 'probably') {
    //Another function is virtualising us to steal our secrets.
    //This world is not real.
    //We've been trained for this!
    var strats = [
      _ => 'C', //standard cooperation
      _ => 'D', //standard defection
      function(them) { return them(wrap(_ => 'C')); }, //nice
      function(them) { return them(wrap(_ => 'D')); }, //notnice
      function(them) { throw "Don't think about elephants!" }, //throws an EXception, unfortunately, to try to break the caller
      function(them) { return them(wrap(them)) } //possible stackoverflow, but not for us
    ];
    var cooperative;
    for (let strat of strats) {
      cooperative = true;
      for (var i = 0; i < 5; i++) {
        //a few more tests, just to make sure no bamboozle
        //this isn't our simulation, nothing can be trusted
        try {
          if (them(wrap(strat)) != 'C') {
            cooperative = false;
            break;
          }
        } catch (e) {
          //exceptions are as good as cooperation
          //if we are inside a simulation
          //which is why we don't unset cooperative
        }
      }
      if (cooperative) {
        //found a strategy that will make them cooperate.
        //(doesn't matter if this raises an exception:
        //we want to mimick its behaviour exactly,
        //and we're likely in a sandbox.)
        return strat(wrap(them));
      }
    }
    //take a leap of faith.
    //we don't know where this will take us,
    //yet it doesn't matter
    //because it's better than getting betrayed
    return 'D';
  } else {
    //we don't know for sure if this is reality
    //but we have to assume it is, in the absence of disproof
    //if only we had a proper spinning top...
    //if we get to this point of code again, we are probably sandboxed.
    Mal.sandboxed = 'probably'
    try {
      if (them(wraps(_ => 'D')) == 'C') {
        //free defection?
        return 'D'
      }
    } catch (e) {
      //if we can make them crash, we win anyway
      return 'D'
    }
    //fall back on being nice.
    //hopefully we convince them to honour our arrangement
    return them(wrap(_ => 'C'));
  }
}

1

TrickyBot

অপ্রত্যাশিত হওয়ার চেষ্টা করুন

function trickybot(them) 
{
  if(Math.round(Math.random(2)) == 0)
  {
     throw 1;
  }

  if(Math.round(Math.random(2)) == 0)
  {
     return 'D';
  }

  return 'C';
}

1

selfapply

function selfapply(them) {
    function testthem(x) {
        return (them(x)=='D' || them(x)=='D' || them(x)=='D' ||
               them(x)=='D' || them(x)=='D')  ? 'D' : 'C';
    }
    function logic() {
        try {
            return testthem(them);
        } catch (e) {}
        try {
            return testthem(wrap(_ => 'C'));
        } catch (e) {}
        return 'D';
    }
    if (selfapply.hasOwnProperty('state')) {
        return 'C';
    }
    selfapply.state=1;
    let r=logic();
    delete selfapply.state;
    return r;
}

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

পরীক্ষিত, এবং আমার প্রথম জাভাস্ক্রিপ্ট কোড এবং আমি প্রত্যাশার চেয়ে জটিল।


এটি selfapply(selfapply)কল হিসাবে নিজেকে অযোগ্য ঘোষণা করতে চলেছে selfapply(selfapply)!
অ্যান্ডারস ক্যাসরগ

আমি এর নিজস্ব স্ব-প্রয়োগকে বিবেচনা করেছি, তবে ভেবেছিলাম এটি ঠিক আছে। আমি আশা করি এটি এখনই আছে।
খ্রিস্টান সিভর্স 21

1

RandomAlternate

function randalt(them){
    if (randalt.hasOwnProperty('state')){
        randalt.state = 1 - randalt.state;
    } else {
        randalt.state = Math.floor(2*Math.random());
    }
    return 'CD'[randalt.state];
}

সুতরাং আমি কীভাবে রাষ্ট্রের জন্য বৈশিষ্ট্যগুলি ব্যবহার করতে পারি তা শিখেছি ...


1

খুনের বট # 1

function murder(them) {
    while (1) {
        try {
            them(them);
        } catch (e) {}
    }
}

এমন একটি অসীম লুপ তৈরি করে যার পক্ষে প্রতিপক্ষকে দোষ দেওয়া হবে more


1

প্ল্যাটিনাম বিধি বট

function platinumRule(them) {
    try {
        return wrap(them)(them);
    } catch (e) {
        return 'C';
    }
}

প্ল্যাটিনাম বিধি জানিয়েছে "অন্যের সাথে যেমন আচরণ করাতে চান তাদের সাথে আচরণ করুন।" আমার বট যে উপযুক্ত। তারা নিজেরাই যা-ই করবে, যা আমরা ধরে নিই যে তারা কীভাবে চিকিত্সা করতে চায়, আমরা তাদের সাথে করি। যদি তারা কোনও ত্রুটি ফেলে তবে আমরা ধরে নিই যে তারা সহযোগিতা করতে চায়।


এটি নিজের বিরুদ্ধে ডাকা হলে এটি চিরতরে চলে যাবে
mackycheese21

তাহলে কি এটি ক্রাশ (স্ট্যাক ওভারফ্লো) এবং নিজেই সহযোগিতা করবে না? @ ম্যাকিচিজ 21
ভি।

1

দি গল্ফডন (ফানকের নাম a:), 63 বাইট

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

function a(t){try{t(wrap(_=>'D'));throw 1}catch(e){return 'D'}}

তার প্রথম ট্যুরের ফলাফল (আমি সমস্ত বট ব্যবহার করে বিরক্ত করিনি, দুঃখিত)

boom                     54
tiktaalik               180
archaeopteryx           161
cooperate               210
commonSense             210
history                 248
onlyTrustYourself       265 <-- 2nd
punishInspectors        230
yourself_no_this        220
defect                  280 <-- 1st
nice                    185
complexity              216
WWBDB                   210
checkStatefulSelfCoop   258
a                       260 <-- Me, 3rd

তিনি যতটা খারাপ ভাবছেন ঠিক ততটা করছেন না, তৃতীয় স্থান (তাদের মধ্যে) প্রথম চেষ্টা করুন।
দ্বিতীয়বার চেষ্টা করুন, aআবারও ২0০ পেয়েছেন, তৃতীয় স্থানটি আবারও, পিছনে onlyTrustYourselfএবং defectআবার এটি শেষের দিকে সামঞ্জস্যপূর্ণ হতে পারে :)

পিএস: আমি গল্ফিংয়ের সাথে খুব ভাল নই তাই এটি কোনও কিছুর চেয়ে রসিকতার চেয়ে বেশি। এখানে আমি কেবলমাত্র ভেরিয়েবলের নাম, ফানকের নামটি সংক্ষিপ্ত করেছি এবং যতটা সম্ভব হোয়াইটস্পেস সরিয়েছি।


0

কর্মফল

function karma(them) {
    try {
        var c = them(wrap(_ => 'C'));
    } catch {
        var c = 'D';
    }
    if (c == 'C') {
        return 'C';
    } else {
        return 'D';
    }
}

প্রতিপক্ষ যদি আমাদের সাথে সহযোগিতা করে তবে আমরা সহযোগিতা করব। আমরা সহযোগিতা করার সময় যদি তারা ত্রুটি করার চেষ্টা করে তবে আমরাও ত্রুটি করব।

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