Rakibe erişimi olan mahkumun ikilemi


21

Bu mücadelede, oyunun mahkumun ikilemi olduğu bir bot yazacaksınız. İşte yakalamak: önceki oyunların geçmişine erişiminiz olmayacak. Bunun yerine, rakibin kendisine erişiminiz olacak. Bu versiyonda, her iki oyuncu da işbirliği yaparlarsa +2 puan alırlar, her ikisi de arızalanırsa +1 puan alırlar, biri işbirliği yaparsa ancak biri arızalanırsa +1 puan alır, diğeri ise puan alamaz. Her bir gönderi, kendisi de dahil olmak üzere, diğer tüm gönderilere karşı 10 defa oynanacaktır. Kazanan, en çok puan alan sunum.

Denetleyici : Bir javascript işlevi yazmalısınız.

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

Denetleyici name, sonuçları görüntülemek için işlevin özelliğini kullanır , bu nedenle bu biçimde değilse (ve bunun yerine f = x => ...ya da f = function() { ... }) puanınızı görmek zorlaşır ve kendi işlevinize erişemezsiniz.

İşlev bir parametreyi kabul eder: themRakibin işlevi budur. Ardından, rakibin tepkisine girdi olarak belirli işlevler verileceğini görmek için bu işlevi çağırabilir. Bu verilere dayanarak, sırasıyla işbirliği veya kusur için 'C' veya 'D' döndürmelisiniz.

Örnekler (yarışacak):

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

Kontrolör burada mevcuttur

Kurallar :

  • Rakibin kodunu göremezsiniz. Tüm işlevler toString(), çağrıldığında aynı görünmeleri için sarılır . Rakibi incelemenin tek yolu (kendin olabilir) onları test etmektir.
  • İşleviniz deterministik olmak zorunda değildir. Durumu yalnızca kendi işlevinizde olan özellikleri ayarlayarak kaydedebilirsiniz submissionName.state = {};. Ancak, maçlar arasında (aynı oyuncuların maçları arasında bile), toString()ve aranarak durum temizlenir eval. Bu nedenle önceki maçların hatırası yok.
  • Her bir maçta hangi fonksiyonun ilk olarak çağrıldığı sıra rastgeledir.
  • Kodunuz bir hata atarsa, rakibiniz kusurluyken kooperasyon yapmış gibi ele alınacaktır. İlk koşan sizseniz, rakibin kodu bile aranmaz. Bu, siz arama sırasında hata, rakibinizin kodunda meydana gelse bile olur them. Yığın taşması hatalarına karşı dikkatli olun, özellikle de kodunuz çağırırsa them(wrap(submissionName)), aynısını yapabilir.
  • Değişkeye veya işleve EXCEPT denildiğinde selfkapsam dahilinde olan başka bir değişkene erişemezsiniz . Bu fonksiyon, rakibi kontrolörün bir fonksiyonu nasıl çağırdığından ayırt edilemeyecek şekilde çağırmanıza izin verir. Sen hiç yazamayabilir , vb (Sen gibi işlevleri kullanabilir ancak,).evalwrapMathwindowMath.random()
  • Bir Errorveya başka bir yöntem kullanarak yığın izlemesine erişemezsiniz .

Çok uzun süren bir not: lütfen içinde sıkışıp kalmaktan kaçının whileSonsuza dek döngü. Her iki yarışmacının birleşik süresi, belirli bir turda 1 saniyeyi geçmemelidir. Bunu zorlamak için 1000 ms ile 2000 ms arasında rastgele bir zaman aşımı seçilir (bu, bilerek belirli bir süre bekleyerek oyun oynamaktan kaçınmaktır) ve çalışanın yürütmek için daha uzun sürmesi durumunda bir hata atılır. Bu durumda, hatanın nedeni şu şekilde belirlenir: yürütme, 1000 ms sonra rastgele bir anda duraklatılır ve o anda arama yığını denetlenir. Şu anda bir döngüde olan (veya bir yığın taşması hatasını önlemek için ayarlanmış bir özyineleme anlamında döngü benzeri özyineleme) olarak adlandırılan rakip olarak suçlanacak. Aynı yarışmacı birkaç defa "çok uzun süren" bir hataya neden olduğu için suçlanırsa, o yarışmacı diskalifiye edilir.


Bu zorluk bana Dolarlık Fatura Açık Artırmasını hatırlatıyor .
Alion

Test etmek themiçin kullanılan fonksiyon deterministik olmalı mı / kuralları takip etmeli mi? Örneğin function me(them){let log=0;them(x=>{++log;return 'C';}); günlük
döndür

2
Her iki işlev de onları çağırırsa (sarın (bir şey)), özyinelemeyi nasıl önleyebilirsiniz? Bir şey mi eksik?
Quintec

@ Quintec size özyineleme ve döngüler kullanabilirsiniz. Bu sadece özyinelemenin bir StackOverflowhataya neden olması gerektiği ve asla bitmeyen sonsuz bir döngüye yol açması gerektiğidir. Bir sonuç verebilirse StackOverflow, bir try-catch ifadesi eklediğinizden emin olun. 1 saniye içinde bir
yığın akışı akışına

1
@ Quintec mutlaka değil. Örneğin, them(() => 'C')bir hatayla sonuçlanmayacaktır, çünkü rakip aradığında them, () => 'C'işlevi çağırır . İhtiyaçlar sarılı olan tek şey try-catcheğer arama olurdu thembazı fonksiyonun bir parametre olduğunu aramaları ile thembazı fonksiyonun bir parametre ile bu çağrılar themvb (sonsuz). Örneğin them(t => t(() => 'C')), rakip oynadıklarını düşünürse, rakibin oynayacağı her şeyi oynardı nice. stackoverflowHata olasılığı yoktur .
soktinpk

Yanıtlar:


14

Boombot

function boom(them) {
  throw 1;
}

Eğer rakip önce koşarsa ve bunu olmadan çağırırsa try..catch, bu bot otomatik olarak 3 puan kazanır. Başka bir durumda sıfır puan.


Eğer rakip önce koşulursa ve bunu aramazsa, 3 puan kaybeder, değil mi?
user202729

1
@ user202729 Daha doğrusu, rakip 3 puan alacak. Bu oyunda hiç kaybetme puanı yok.
Bubbler

10

Archaeopteryx

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';
}
  • Eğer rakip ile işbirliği yaparsa cooperate, rakibin karşı hamlesini taklit eder defect.
  • Aksi takdirde, rakip ile defectveya ile işbirliği yaparsa nice, o zaman kusur.
  • Başka, işbirliği yap.

Bunu iyi bir strateji yapan nedir? Hiç bir fikrim yok. Kısmen mevcut gönderiler konusunda eğitilmiş, evrimsel bir algoritma kullanarak oluşturdum.

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'));
}
  • Rakip karşı atarsa, rakibin karşı cooperatehareketini ters çevirin defect.
  • Aksi takdirde, rakip aleyhte defectarızalanırsa, o zaman arızalı.
  • Aksi taktirde rakibin aleyhine hareket eder notNice.

Bir başka evrimsel olarak oluşturulan strateji.


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

WhatWouldBotDoBot oldukça basittir; sadece istikrarlı bir devlet programına karşı yapacağı şey için rakibini test ediyor. Eğer bir bot mümkünse işbirliğini tercih ederse, WWBDB ayrıca işbirliğini de tercih edecektir (bu yüzden güzel bot ile işbirliği yapacaktır). WWBDB kendisi işbirliğini tercih etmiyor.


5

Durum bilgisi denetle

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

Eğer beni çağırdılarsa, o zaman muhtemelen gerçekten onlar olurlar. Defektör olarak hareket ediyoruz. Beni çağırmazlarsa, muhtemelen sarılmış bir test cihazı olurlar. Daha iyi davranırdık.


Yukarıdaki orijinal cevap. Belki daha fazla puan kazanmak için kendimi işbirliği yapmalıyım.

Kendinden coop ile durumunuzu kontrol edin

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

Çünkü neden olmasın.


3

karmaşa

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

Karmaşıklık testleri botun İşbirliği veya Hata olup olmadığını görmek için. Öyleyse, işbirliği yapar, ancak değilse, kusurludur. Rakiplerini test eden tüm mevcut botlar cevapları test etmek için basit fonksiyonlar kullanıyor, bu yüzden Karmaşıklık bu durumlarda İşbirliği yapıyormuş gibi davranacak.


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

Bunun çalışmasını istediğim, kendime karşı oynadığınız durumlar dışında daima kusurlu olmaktır. Bunu kendilerine sarılmayan bir "test cihazı" fonksiyonunu geçerek yapmaya çalışır ve "onlar" test edicisinin isimlendirilip seçilmediğini tespit etmeye çalışır. Eğer bu test edilmişse, aktif olan statik değişkeni true olarak değiştirir, sonra işbirliğine döner. Fakat işe yaramıyor. Javascript ile aşina değilim ve muhtemelen biraz daha değişiklik yapacağım.


zekice bir fikir, ama başka bir kardeş bir testerişlev yaptığında ne olur : D
V. Courtois

2

İyi değil

function NotNice(them) {
  return them(wrap(_ => "D"))
}

Rakibin sapma tepkisini taklit eder



2

Sağduyu

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

Yasal Uyarı: Ben javascript bilmiyorum.

İyi bir kişiden kâr edersen, yap. Aksi takdirde, işbirliği yaparak karşılaştıkları takdirde geri döneceklerini iade edin (en azından öyle olduğunu düşünüyorum ).


2

Ve sen nereye gitmek istiyorsun? (Orman kitabındaki hacimlerden esinlenerek)

    Kendini işlevlendir (onları) {
      Deneyin{
        onları geri döndür (bunu);
      } Catch (e) {
        "D" döndür;
      }
    }

   işlevi yourself_no_this (onları) {
      Deneyin{
        onları geri döndürün (yourself_no_this);
      } Catch (e) {
        "D" döndür;
      }
    }

Bu sadece koştuğum bir turnuvada kazandı. Aferin!
MegaTom

Bu botun kuralları ihlal ettiğini fark ettim. “Kendini değişkene erişemeyebilirsiniz ...” öz thisile aynıdır. Söylemek istediğini düşünüyorum return them(yourself).
MegaTom

Technicaly ( xkcd.com/1475 );) thisbir değişken değildir, bir anahtar kelimedir ve bir fonksiyon bağlamındadır this!=self. selfpencere nesnesi ve thisişlevin kendisi anlamına gelir (her zaman içinde bulunduğu bağlamı ifade eder, bu yüzden değişken olarak kabul edilmez). Bu nedenle var self = this;birçok kod örneğinin başlangıcında yanıltıcı olarak kabul edilebilir. "Bu" olmadan eklenen sürüm
TS

1
Hayır this, fonksiyona atıfta bulunmuyor. yourselfve yourself_no_thiskoşmak farklı. thistemelde hiçbir zaman javascript'teki işlevi ifade etmez. Bakınız: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
MegaTom 16:18

2

Ceza Müfettişleri

Bot bazı kod verin ve çalışıp çalışmadığını görmek. Bir kereden fazla çalıştırıldıysa, bot kötü bir müfettiş ve biz de kusurlu olmalıyız! Tam olarak bir kez çalıştırıldıysa, hoş olmayan bot olarak oynayın. Hiç çalıştırılmadıysa, işbirliği yap.

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

Tarihçe

Gördüğüm son bot bu rakibe karşı ne yapardı?

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

10000 tur turnuvası sonuçları:

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

Değiştirilmiş turnuva kodum şurada
MegaTom

2

Mal, bir simülasyonun içinde olup olmadığını belirlemeye çalışır. Öyleyse, sonunda gerçek kodun geçileceğini varsayar themve onları işbirliği yapmaya ikna etmek için çeşitli stratejiler dener.
Kesin olarak bilmiyorsa, ücretsiz olarak kusurlu olup olmadığını kontrol eder, yoksa thembir işbirlikçi verildiğinde ne yapacağını kopyalamaya çalışır .

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

Tahmin edilemez olmaya çalış

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

Bir anlam ifade edip etmediğinden emin değilim, ama ilginç görünüyor! Kendinize yaptığınız gibi yapın, rastgele olmak için tekrarlayın. Bu işe yaramazsa, iyi ol.

Denenmemiş ve ilk javascript kodum ve beklediğimden daha karmaşık.


Bu kendini diskalifiye edecek çünkü selfapply(selfapply)çağrılar selfapply(selfapply)!
Anders Kaseorg

Kendi kendine başvurusunu düşündüm, ama iyi olacağını düşündüm. Umarım gerçekten şimdidir.
Christian Sievers,

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

Bu yüzden devlet için özelliklerin nasıl kullanılacağını öğrendim ...


1

Cinayet Botu # 1

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

Rakibin suçlanmasının daha muhtemel olduğu sonsuz bir döngüye neden olur.


1

Platin Kural Bot

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

Platin Kural, "Başkalarına tedavi edilmek istedikleri şekilde davranın" ifadesini kullanmaktadır. Botum buna uyuyor. Kendilerine ne yaparlarsa yapalım, varsaydıklarımız nasıl tedavi edilmek istediklerini, onlara yapıyoruz. Eğer bir hata yaparlarsa, işbirliği yapmak istediklerini varsayıyoruz.


Kendisine karşı çağrılırsa bu aslında sonsuza kadar
giderdi

o zaman çökmez (yığın taşması) ve kendisiyle işbirliği yapmaz mı? @ mackycheese21
V. Courtois

1

TheGolfedOne (func adı:) a, 63 bayt

Golf kodu okumak zor. Bu nedenle, themkıracak.
Bu KotH altındaki mekaniği tam olarak anlamadım, ama sanırım rakip vatansızsa, kusurlu olduğumda onları kırmam gerekiyor.

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

İlk turnuvasının sonucu (bütün botları kullanarak rahatsız etmedim, üzgünüm)

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

Düşündüğüm kadar kötü yapmıyor, ilk sırada üçüncüsü.
İkinci deneme, atekrar 260, 3. sırada, arkada onlyTrustYourselfve defecttekrar. Sonunda tutarlı olabilir :)

PS: Golf ile o kadar iyi değilim, bu yüzden şaka için her şeyden daha fazla. Burada sadece değişken isimlerini, func isimlerini kısalttım ve mümkün olduğunca fazla boşluk bıraktım.


0

Karma

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

Eğer rakip bizimle işbirliği yaparsa, o zaman işbirliği yaparız. İşbirliği yaptığımızda kusur almaya çalışırlarsa, biz de kusurluyuz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.