Mahkum İkilemi v.2 - Battle Royale


15

Gelen bu soruya bir oyun oyuncuları, tutsak ikilemi içinde çifti tarafından çifti kapalı birbirlerine karşılaşacağı diğerlerine karşı en yüksek puanı iteratif hangi stratejinin belirlenmesi için hangi icat edildi.

Gelen bu soruya , ben birden fazla kişi aynı anda birbirlerine karşı Tutsaklar Dilemma oynamak için bir yolunu buldular. Bu varyasyonda, getiri matrisi gereksizdir, her iki oyuncu çifti arasındaki her sonuç fonksiyonel olarak bağımsız iki kararın toplamıdır.

Göreviniz, çok oyunculu Mahkum'un İkileminin mümkün olan en yüksek puanı elde edecek bu simetrik, genelleştirilmiş versiyonunu oynamak için bir yapay zeka inşa etmektir.


Oyunun kuralları

Bu çok oyunculu, çok turlu Mahkum'un İkileminin her turunda, bir oyuncu Abaşka bir oyuncudan "1" almaya karar verebilir B. Bu durumda, Apuanı 1 artarken puanı 2 artar B. Bu kararın sipariş edilen her bir oyuncu çifti arasında olmasına izin verilir.

Bu, her oyuncu için, sırasıyla kaçma ve işbirliğine homolog olan "1 almak" veya birbirinden "1 almak" için verilen tek karardır. İki oyuncu arasında etkili ödeme matrisi P1ve P2görünüm şöyle:

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

Turnuva Prosedürü

Oyun , katılan oyuncuların sayısı olan P * 25turlardan oluşacaktır P. Tüm oyuncular bir puanla başlar 0. Her tur aşağıdaki prosedürden oluşacaktır:

Bir turun başlangıcında, her programa standart girdiden önceki formatta aşağıdaki formatta bir geçmiş verilecektir :

  • 3 Sayı içeren bir satır, P, D, ve N.

    • Poyundaki toplam oyuncu sayısıdır. Her oyuncu rastgele bir kimlik numarası atanır 1için Poyunun başında.

    • D geçerli oynatıcının kimliği.

    • N oynanan turların sayısıdır.

  • Nher tur bir turun sonuçlarını temsil eder. Hatta k, boşluklarla ayrılmış, kimliğine sahip oyuncunun o turda kimliğine sahip oyuncudan "1" aldığını gösteren bir Ndizi n_ksıralı çift olacaktır .(a, b)ab

  • Bir homojen rasgele sayı Rgelen 0için 18446744073709551615(2 64 - 1), bir yalancı rasgele tohum olarak işlev görmek için. Bu numaralar, insanların sonuçları kendileri için doğrulayabilmeleri için turnuvanın sonunda yayınlanacak olan önceden oluşturulmuş bir dosyadan okunacaktır.

  • Programınız önceki turda böyle bir çıktı ürettiyse, programınıza okunacak bir durum biçimini temsil eden ekstra bir satır. Oyunun başında, bu çizgi her zaman boş olacaktır. Bu satır, puanlama kodu veya diğer programlar tarafından değiştirilmez.

Her program daha sonra standart çıktıya aşağıdakileri üretmek için stratejisini kullanır :

  • KBu turdan "alacağı" programların kimlikleri olan bir sayı listesi . Boş bir çıktı hiçbir şey yapmayacağı anlamına gelir.

  • İsteğe bağlı olarak, sonraki turlara geçecek bir durum biçimini temsil eden ekstra bir satır. Bu kesin çizgi bir sonraki turda programa geri beslenecektir.

Aşağıda, 34 kişilik bir oyunda bir kimlik oyuncusu için oyunun başlangıcı için örnek bir giriş bulunmaktadır :

4 3 0
4696634734863777023

Aşağıda, aynı oyun için birkaç tur daha önce oynanmış bir örnek giriş verilmiştir:

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

Her program için Dbenzersiz olan kimlik numarası haricinde , her program bir raunt için aynı girişle beslenir .

Aşağıda, oyuncunun 3diğer herkesten 1 aldığı örnek bir çıktı yer almaktadır:

1 2 4

Gerekli tüm turların sonunda, en yüksek final skoruna sahip oyuncu kazanır.


Zaman çizelgesi

Bu turnuvanın kodlaması toplam 7 gün sürecek. Başvurular için son tarih 2014-05-09 00:00 UTC.

Bu tarihten önce gerçek programları yayınlamayın - programınızın kaynak kodunun SHA256 karmasını taahhüt olarak gönderin. Bu karmayı son tarihten önce istediğiniz zaman değiştirebilirsiniz, ancak son tarihten sonra gönderilen taahhütler yargı için kabul edilmeyecektir. (Doğrulama programım 64 tabanını tükettiğinden ve daha kompakt bir gösterim olduğundan, lütfen karmalarınız için taban 64 gösterimini kullanın.)

Son başvuru tarihi geçtikten sonra, 2014-05-10 00:00 UTCgönderiminiz için programınızın gerçek kaynak kodunu yayınlamak için 1 gününüz ( sonrasına) sahip olacaksınız . Gönderilen kaynak kodunuzun SHA256 karma değeri, son başvuru tarihinden önce gönderdiğiniz hiçbir karma ile eşleşmezse, kodunuz turnuvaya kabul edilmez.

Bundan sonra, tüm başvuruları kendi bilgisayarıma indireceğim ve bu savaş rotasında tüm turnuva girişlerini çalıştıracağım, umarım sonuçları 2 gün içinde o zamana kadar gönderirim 2014-05-12 00:00 UTC.

En yüksek puana sahip cevabı kabul edeceğim ve final skoru daha büyükse bu cevaba +100 ödül vereceğim 0.

Turnuva bittikten sonra, yarışmayı yürütmek için kullanılan rastgele tohum dosyasını yayınlayacağım ve insanlar turnuvada kullanılanların üstesinden gelmek için başka çözümler yayınlamaya başlayabilirler. Ancak, kabul veya lütuf için sayılmazlar.

Ana Makine

Bu çözümleri bilgisayarımdaki bir sanal makinede çalıştıracağım. Bu sanal makine, 2 gigabayt RAM ile Ubuntu Linux 14.04'ü çalıştıracak. Temel makinemde 3.40 GHz hızında çalışan bir Intel i7-2600K işlemci var.

Gereksinimler

Programınız, derleyiciyi veya programınızı derleyecek bir tercümanın mevcut olduğu ve Ubuntu Linux'un en son sürümü için hazır olduğu bir dilde yazılmalıdır, böylece tüm gönderimleri çalıştırabilir ve sanal bir makinede yargılayabilirim.

Programınızın 2.000 secondsher turu çalıştırmaktan fazlasını almaması gerekir . Programınız zaman aşımına uğrarsa veya bir hata üretirse, çıktısı o tur için boş sayılacaktır.

Programınız deterministik olmalıdır; yani, aynı girdi için her zaman aynı çıktıyı döndürmelidir. Yalancı çözümlere izin verilir; ancak, rastgelelikleri girdi olarak verilen rastgele tohuma bağlı olmalı ve başka bir şey olmamalıdır. Tohum dosyası Python'lar kullanılarak oluşturuldu os.urandom. Toplam 500 satır içerir (gerekirse daha fazla üretilecektir) ve SHA256 karmasıdır K+ics+sFq82lgiLanEnL/PABQKnn7rDAGmO48oiYxZk=. Turnuva bittikten sonra buraya yüklenecek.


Bitkiler

İşleri başlatmak için ilk naif stratejileri temsil eden dört "bitki" olacaktır. Bunlar, gönderilerinizle birlikte turnuvada oynanacak. Ancak, bunlardan birinin kazanması durumunda, bir tesis dışında bir oyuncunun aldığı en yüksek puan kazanan sayılır.

Her bitkinin dosyasının karmasını hesaplamak için, buradaki biçimlendirici sekme karakterlerini beğenmediği için 4 boşluktan oluşan her grubu bir sekme ile değiştirin.

Tembel - hiçbir şey yapmaz.

n1bnYdeb/bNDBKASWGywTRa0Ne9hMAkal3AuVZJgovI=

pass

Açgözlü - her zaman herkesten 1 alır.

+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

Öfkeli - ilk turda diğer herkesten 1 alır ve daha sonra bir önceki turda 1 alan herkesten 1 alır.

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

Kıskanç - yuvarlama yaparak kendisi hariç mevcut en yüksek puanı alan oyuncuların% 50'sinden 1 alır.

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

Bu dördü arasında 100 turluk bir turnuvada, puanları:

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

Değerlendirme Programı

Github'da kullanacağım hakim programını yayınladım . İndirin ve test edin. (Ve belki bir tane bulursanız bir veya iki hatayı düzeltin.: P)

Şu anda Python'dan başka bir şey için derleme seçenekleri yok. Bunları daha sonra dahil edeceğim - eğer insanlar diğer diller için derleme veya yorumlama senaryolarına katkıda bulunabilseydi, çok zorlanırdım.


Aşama 2: Kaynak Kod Gönderme

tournamentYarışma için Github deposuna pd_rand dosyasını ve diğer bitki girdilerini içeren yeni bir şube gönderdim . Kaynak kodunuzu buraya gönderebilir veya bir çekme isteği olarak bu şubeye gönderebilirsiniz.

Yarışmacıların sırası aşağıdaki gibi olacaktır:

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

Son Skorlar

Test programımın çıktısı:

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

sıralamalar:

 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

Yani kazanan gerçekten bir oyuncu - -204 puan ile The Regular!

Ne yazık ki, puanı olumlu değildi, ama yinelenen Tutuklu Mahkum'un İkileminin simülasyonunda herkesin kazanmak için oynadığını tahmin edemeyiz.

Bazı şaşırtıcı sonuçlar (en azından şaşırtıcı olduğunu düşündüm):

  • Açgözlü, Tat için Tit'den daha fazla puan aldı ve aslında çoğu skorerden genellikle daha yüksekti.

  • Bir çeşit "ahlak güçlendirme" karakteri olan Yargıç (temelde ortalamanın üzerinde bir sayıda kişiden 1'i almış olandan 1 aldı), simülasyon testinde, aslında oldukça düşük bir puan almak.

Ve diğerleri (düşündüm) o kadar şaşırtıcı değildi:

  • Hasta The Wrathful'dan 484 puan daha fazla puan aldı. İlk kez işbirliği yapmak gerçekten işe yarıyor.

  • Bir Yüzde çok hızlı bir şekilde, aşağıdayken tekmeleyecek kimse yoktu. Görünüşe göre% 1 sadece oyunda daha fazla oyuncuya sahip oldukları için bu şekilde kalabiliyor.

Her neyse, turnuva sona erdiğine göre, istediğiniz kadar fazla oyuncu yayınlamaktan çekinmeyin ve hakem programını kullanarak test edin.


3
Kaynağı kontrol programına ve / veya tesislere göndermek herhangi bir şeye zarar verir mi? Yine de ne yaptıklarını biliyoruz ve beş ekstra program yazmadan bir şeye karşı test etmeyi tercih ederim .
Geobits

2
Anlamıyorum. Her zaman 1 alan herkes için bir tür ceza var mı? Her zaman 1 almak en avantajlı olmaz mıydı?
DankMemes

1
Açgözlü nasıl zararı en üst düzeye çıkarmaz? Eğer başka bir oyuncudan alırsak, diğer oyuncu sadece -1 veya -2 alırken, diğer oyuncu 1 veya 0 alabilir. Açıkçası diğer oyuncudan 1 almak hasarı en üst düzeye çıkaracaktır. Ve böylece Açgözlü asla kaybetmez. Ve söylediğiniz gibi, tüm rakipler de açgözlü değilse, neredeyse her zaman kazanacaktır.
justhalf

1
@Trimsty Meydan ilk çıktığında, bitkilerin kodu gösterilmedi. Tüm kodlama aşaması boyunca başka cevaplar göremedik. Dupes, çok belirgin açgözlü stratejiyi seçerek tamamen kazara olabilirdi .
Geobits

2
@justhalf Yinelenen mahkumun ikilemindeki stratejiler hakkında herhangi bir araştırma okuduysanız, söylediğiniz şeyin yanlış olduğunu bilirsiniz. Wikipedia makalesi başlamak için iyi bir yerdir.
Joe Z.10

Yanıtlar:


3

Düzenli

Turnuva için seçtiğim bu girişin sürümü (SHA-256 :) , son yarışmada ikinci sırada yer alan Joey'nin " Rastgele enayi " stratejisini (küçük ve muhtemelen önemsiz bir değişiklik olsa da ggeo+G2psAnLAevepmUlGIX6uqD0MbD1aQxkcys64oc=) kullanıyor . Ne yazık ki, daha yeni ve daha etkili bir sürüm, son teslim tarihinden 25 dakika önce ciddi bir hataya sahip olduğundan, bu nedenle kullanılamadı. Bununla birlikte, bu sürüm hala nispeten iyi durumda.

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

Buggy sürümü bir SHA-256 karmasına sahiptir 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";

Düzeltmek için şu yedekleri yapın:

  • Değiştir $hashOutput = rtrim(fgets(STDIN), "\n");ile $line .= fgets(STDIN);(yani gerçekten önemli değil).
  • Değiştir if ($betterScore >= 3 * $myScore) {ile if ($betterScore >= 0.5 * $myScore && !psRand(0, $betterPlayer)) {(bu öldürdü budur).

1
Son başvuru tarihinden 3 dakika 25 saniye önce. Etkilendim.
Joe Z.

Sadece dostça bir hatırlatma: kodlama aşaması bitti; kaynak kodunuzu göndermek için bir gününüz var. (Prosedür sorunun
Joe Z.

Eski sürümünüzü veya yeni sürümünüzü kullansam da, programınız ilk olarak çıkıyor. Tebrikler!
Joe Z.

2

Yüzde bir

b61189399ae9494b333df8a71e36039f64f1d2932b838d354c688593d8f09477

Altında düşündüğü mahk prisonmlara bakıyor.


Kendisinden daha az veya ona eşit puanları olan herkesten alır. Varsayım, bu mahkumların karşılık alma olasılıklarının daha düşük (ya da daha fazlasına sahip olmaları). Ne kadar iyi bir varsayım olduğunu bilmiyorum , ama onun üzerinde çalıştığı şey bu.

Ayrıca son turda herkesten alır . Bunun tam anlamıyla bir dezavantajı yoktur, çünkü kimse bundan sonra intikam çalamaz.

Yapıştırılan koddan sekme / boşluk nedeniyle karmayı almada sorun yaşıyorsanız , dosyanın kendisine bir bağlantı.

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:00Son başvuru tarihine kadar çözümlerinizde iyileştirmeler yapmaya devam edebileceğinizi unutmayın .
Joe Z.

Evet. Başka bir şey düşünürsem, yapacağım. Yine de, kimsenin bu lütfu talep edeceğine inanmakta zorlanıyorum. Bu oyunda pozitif olmak olağandışı olurdu.
Geobits

Evet, kimsenin bu cömertliğe ulaşmasını beklemiyorum. Bu gerçekten bir oyun teorisine meydan okuyan bir başarı olurdu, muhtemelen araştırma olanaklarında gerçek paraya değecektir (Her zaman işbirliği yapan iki kişiden daha iyi çalışan bir çözüm! Bunu hayal edin!).
Joe Z.

1
@JoeZ. Diğerlerinin ne yapacağına dair bilgi ile, kesinlikle;) Bilinmeyen girişlere karşı, çok güvenilir bir strateji göremiyorum . Aykırı değerlerin aykırı değer olacağını düşünüyorum.
Geobits

1
Kodunuzun stratejisinin kötü niyetli bir şey olmadığı ve yine de önemli olması için çok az katılımcı olduğu için bu sefer hala kabul edeceğimi düşünüyorum.
Joe Z.

1

İşte oyuna katılacak birkaç bitki daha. Bunlar daha gelişmiş ve kaynak kodları kodlama aşamasının sonuna kadar açıklanmayacak.

Tıpkı sorudaki dört bitki gibi, diğer tüm oyunculardan daha yüksek puan almayı başarırlarsa, sadece gerçek bir yarışmacı tarafından elde edilen en yüksek puan kazanan olarak kabul edilir.


Zorba

29AGVpvJmDEDI5Efe/afmMJRLaJ+TpjwVcz1GkxgYZs=

İnsanlar alır.


Yargıç

yjdCQ3uQ4YKe7xAKxdTFLF4d72fD4ACYpDLwkbzdISI=

Yanlışları cezalandırır.


Lunatik

m3FsRPocekCcK6GDswgnobV2CYOxX8LquChnKxrx1Wo=

Ne yaptığı hakkında hiçbir fikri yok .


Hasta

nd7Pt3bVpFnuvDVeHQ5T9EPTq7KjNraVzp/KGtI73Vo=

Asla ilk hamleyi yapmaz.


Bunlar sadece bitki ise, onlara izin vermemek için hiçbir neden göremiyorum. Eğer kazanabilecek yarışmacılarsa, yukarıdaki yorum
Geobits

Kendi girişi olan kabul kısaca, o bile tamamen haksız bir önermeyi olduğuna karar eğer oyunun çok fazla diğer unsurları benim kontrol altında beri sadece, daha bir tane girdi. Buraya yaptığım tüm girişler sadece bitki olacak.
Joe Z.

İnsanların onları bitki olarak bile istemeyebileceğini düşündüğümün nedeni, oyunun başında mevcut olmayan mevcut (ve böylece temel stratejiler) temel oyuncularda oldukça radikal bir değişikliği temsil etmesidir. Ancak, bitki olarak yerleştirilen oyunculardan bağımsız olarak çözümlerin en iyi şekilde kodlanması gerektiği varsayımına gidersek, sanırım bunlara da girebilirim.
Joe Z.

Peki, katılımcılar sadece diğer cevapları göremediğimiz için, katılımcılar "burada" varsa (burada varsa) kodlanmalıdır. Bunların bitkiler ya da programın diğer cevapları olması fark etmez, ancak bunlar "kazanamaz". Kazanın en yüksek puana sahip bitki olmayan olarak tanımlandığını varsayarsak, bunun ne kadar önemli olacağını görmüyorum. Diyelim ki onları içeri al.
Geobits

1

Kısasa kısas

9GkjtTDD2jrnMYg/LSs2osiVWxDDoSOgLCpWvuqVmSM=

Wrathful'a benzer, birkaç (umarım) performans arttırıcı değişiklik.

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

E-posta adresimi aldın mı?
Joe Z.

@Joe; Evet; Teşekkürler. (İhtiyacım olacağından emin değilim, ama
konakladığınız

Tamam, sadece bilmek istedim, böylece silebilirdim.
Joe Z.

1
@luserdroog İnsanlar, programın kendisi yerine programlarının kaynak kodlarının karmalarını yayınlıyorlar. Kod yazmanın 7 günü dolduğunda, insanlar test için gerçek programlarını ortaya koyacaklardır.
Joe Z.

1
Evet doğru. Bir gönderimin muhtemelen bir başlığı ve en azından Geobits'inki gibi bir sloganı olmalıdır.
Joe Z.

1

Backstab

Python 3

İsme rağmen, bu bot aslında oldukça zarif. Ama bunu işaretlemeyin.

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)

EDIT 2 : Yayınlanan kaynak. Yaşasın.

DÜZENLEME : Bazı testlerden sonra bulduğum bazı hataları düzelttim. Algoritmik değil, sadece girdiyi okuyan bazı sorunlar.


Sadece dostça bir hatırlatma: kodlama aşaması bitti; kaynak kodunuzu göndermek için bir gününüz var. (Prosedür sorunun
Joe Z.

@JoeZ. Gönderildi. Umarım zamandayım. : P
cjfaure

P, D, N, R bir arabanın kayabileceği sürücüler gibi geliyor.
Joe Z.

1
@JoeZ. xD Onlar sizin yazınız, yani; 3
cjfaure

Ah benim hatam. Üzgünüz: S
Joe Z.

1

Begrudger

g1TXBu2EfVz/uM/RS24VeJuYMKLOaRatLxsA+DN1Mto=

kod

Buna fazla zaman harcamadığımı itiraf edeceğim ...

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)

Sadece dostça bir hatırlatma: kodlama aşaması bitti; kaynak kodunuzu göndermek için bir gününüz var. (Prosedür sorunun
Joe Z.

Bunu çalıştırmak için çalıştı ve aşağıdaki hataya koştu: o += a.split(', ')[0]sayılar arasında boşluk bırakmaz.
Lütfen

@PleaseStand Bunu düzelttim, ancak test edilen sürümün hata ile sonuçlanacağını düşünüyorum çünkü rekabet bitti.
kitcar2000

Evet, kodunuz her çalıştırdığımda bir hata üretti ve nasıl düzeltebileceğimi bilemedim. Yine de Lazy'den biraz daha iyi yaptı.
Joe Z.
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.