Bu Hayat, Jim, ama bildiğimiz gibi değil


58

Muhtemelen , matematikçi John Conway'in icat ettiği ünlü hücresel otomat olan Conway'in Yaşam Oyununu biliyorsunuzdur . Hayat birlikte, iki boyutlu bir hücre tahtasını simüle etmenize izin veren bir kurallar bütünüdür. Kurallar, tahtadaki hangi hücrelerin yaşadığına ve hangilerinin öleceğine karar verir. Bazı hayal gücüyle, Hayatın sıfır oyunculu bir oyun olduğunu söyleyebilirsiniz : Ünlü planör gibi ilginç davranışa sahip desenler bulma amacı taşıyan bir oyun.

Planör

Sıfır oyuncu oyunu ... Bugüne kadar. Hayat Oyunu'nu oynayan bir program yazacaksınız ve kazanmak için oynuyor, Tepenin Tarzında Kralı. Tabii ki rakibiniz (tekil) aynı şeyi yapmaya çalışıyor. Kazanan ya canlı hücreleri olan son bot ya da 10000 nesiller sonra en canlı hücreleri olan oyuncu.

Oyun kuralları

Kurallar neredeyse normal (B3 / S23) ile aynıdır.

  • İkiden az arkadaşça komşusu olan bir canlı hücre açlıktan ölür.
  • İki veya üç dostane komşusu olan bir canlı hücre hayatta kalır.
  • Üçten fazla dostane komşusu olan bir canlı hücre aşırı nüfustan ölür.
  • Aynı oyuncunun tam olarak üç komşusu olan ölü bir hücre, düşman komşusu olmaması şartıyla o oyuncu için savaşmak üzere canlanır .

... ama her nesilden sonra, hem siz hem de rakibiniz müdahale etme fırsatını yakalar. Sizin için savaşmak için maksimum 30 hücreye kadar uyanabilirsiniz. (Önce kim gider sunucu tarafından belirlenir.)

Tahta (x, y) hücre karesidir. Tüm kareler başlangıçta öldü. Sınırlar etrafa sarılmıyor (bu torus şekilli bir dünya değil) ve kalıcı olarak ölüyorlar.

Bu, Battlebots ve Core Wars ruhunda bir yarışmadır . Botları çalıştıracak merkezi bir sunucu var ve burada bulunabilir .

Protokol

Arena sunucusu argv üzerinden iletilen basit bir JSON protokolü konuşuyor

Değerler JSON kodlu bir dizedir

  • y_size: kaybolmadan önce en fazla y çini koordinatı
  • x_size: Çini kaybolmadan önce azami x karo kordonu
  • tick_id: Geçerli kene numarası
  • board: '(y, x)' formundaki anahtarlar ve bot_id(int) formundaki değerler
  • bot_id: tahtadaki karolar bu kimliğe sahip

Örnek:

 {"y_size":2000,"x_size":2000,"board":{},"bot_id":1,"tick_id":1}

Sunucuya seçiminizi söyleme:

  • Renginize dönmesi için sunucuya bir karo listesi gönderin.
  • Sadece boş olanlar değişecek
  • İç içe kodlar liste formatı
    • [[0,0], [0,1], [100,22]...]

NOT: Botunuz döşemeleri hiç güncellemek zorunda değildir - sunucu güncellemeyi kendisi yapar

Rekabet kuralları

  • Uygulamanız protokolü takip edemezse, sırasını kaybeder; Sunucu durumunda değişiklik olmadığını kabul eder
  • Arena sunucusundaki bir hatadan isteyerek faydalanmanıza izin verilmez.
  • AI'nızın aklı başında bir zamanda hareketlere karar vermesini sağlayın. Lütfen bir sonraki hareketinizi olabildiğince hızlı bir şekilde gönderin.
  • Son olarak, lütfen sunucuya iyi davranın. Zevkiniz için orada.
  • Bu kurallara uymamak diskalifiye olmasına yol açabilir.
  • Bir beraberlik durumunda, her iki oyuncunun da toplamında 1 galibiyet var

Kumandayı kendin işletmek

Denetleyicinin kaynağı burada bulunabilir . Denetleyiciyi çalıştırmanın 2 yolu vardır:

  • Rekabet modu (terminal)
    • İle kurmak python3 get_answers.py
    • Tüm botlarla birbiriyle mücadele eden her bot ile bir all v all yarışması yapın.
  • Test modu (GUI)
    • Çalıştırmak python3 nice_gui.py
    • Click Pull Answers
    • Göndermeden önce denemek için kendi cevabınızı eklemek istiyorsanız File -> Add manual answer, dosyayı tıklayın ve bulun ve içinde yazıldığı dili seçin.
    • Diliniz bana ping atmıyorsa ve sunucuya yüklenmesini deneyeceğim, onu çalıştıracağım (kurulum ve çalıştırma talimatları da iyi olurdu!)
    • Birbirine geçmek için 2 bot seçin
    • Click Run
    • Oyun izle...
  • Kurulum
    • Python3 gerektirir
    • get_answers bs4 ve html5lib gerektirir
    • denetleyicisi, .sh dosyalarını çalıştırmanın bir yolunu gerektirir (pencerelerde MinGW)

Uygulamanın örnek görüntüsü

puanlama

En çok galibiyet alan bot 12/07/2016(12 Temmuz) 14/07/2016 (14 Temmuz, bir botun nasıl çalıştırılacağını çözemedi).


Bu sohbet odasında denetleyici / gui ile ilgili yardım istenebilir


Bu soru 2014'ten bu yana gelişme aşamasındadır ve sanal alanda en çok sorulan soru olmuştur. Özel Teşekkürler Wander Nauta'ya (orijinal yazar ve konsept), PPCG Sohbetine (yorumlar ve yardım) ve sandbox gönderisine yorum yapan herkese (daha fazla yorum) gider .


25
Huh, bunun kum havuzundan asla çıkamayacağını düşündüm. Harika!
Luis Mendo,

Yazım hatası: 12.06.2016 (12 Temmuz)
Luis Mendo

4
+1. Bu harika soruyu sanal alanın dışına çıkardığı için AED ödülünü hak ediyorsunuz!
agtoever

1
@ KevinLau-notKenny oh, tamam. Bir dosyada bir komut çalıştırabilir misiniz?
Rɪᴋᴇʀ

1
@Magenta Onları aldığımda (sürekli açık bir sekmede olmasına rağmen, bu durumu tamamen unutmuşum), şimdi çalıştırıyorum
Blue

Yanıtlar:


4

Python 3, Patlayıcı

Orada zaten bir blok olup olmadığına bakılmaksızın, küçük patlayıcıları yerin etrafına koyar.

from random import randint
import sys,json,copy
q=json.loads(sys.argv[1])
x=q["x_size"];y=q["y_size"];F=[[0,1],[1,0],[1,1],[1,2],[2,0],[2,2]];D=[]
for g in [0]*5:
 X=randint(0,x);Y=randint(0,y);A=copy.deepcopy(F)
 for C in A:C[0]+=Y;C[1]+=X
 D+=A
print(D)

1
Yaptığım bütün çalışmalarımdan sonra sınırsız büyüme için blok oluşturma anahtarları ve özellikle büyüme yapılarını yıkmak için özel olarak inşa edilmiş bir sistem kurduğumdan sonra, basit bir patlayıcı-temelli sistemin, savaşta benim için en iyisi olduğuna inanmıyorum: o
Value Ink

Nasıl olduğunu da bilmiyorum, çünkü herhangi bir nedenle denetleyiciyi çalıştıramıyorum.
Macenta

8

Ruby, InterruptingBlockMaker

TrainingBot gibi planörlerin başlatılması yerine, Vikipedi'de labirentte rastgele bir noktada belirtildiği gibi 5x5 blok yapma anahtarlama makinesi oluşturmaya çalışır . Daha sonra, geri kalan aktivasyonları ile, sadece düşman puanları bulur ve hücrelerin büyümesini engellemek ve kalıplarını karıştırmak için yakındaki bölgeyi biberlerle karıştırmaya çalışır. Hücreleriniz gelecek nesillerde ölecek, ancak belki de rakibinizi yavaşlatmak için bazı büyümeleri durdurabilirler!

v2: Zaman aşımını en aza indirmeye çalışmak için biraz (?) optimize edildi.

v3: Kendi hücre konumlarımızı reddetmeden önce aktif blokların bir alt kümesini önceden örneklemek, kesme hücre saldırılarında bir miktar etkinlik pahasına zaman aşımını önlemek için optimize edilmiş kesinti kodu.

require 'json'

class Range
  def product range2
    self.to_a.product range2.to_a
  end
end

args = JSON.parse(ARGV[0])
bot_id = args["bot_id"]
width  = args["x_size"]
height = args["y_size"]
board  = args["board"]

generator = [[2,2], [2,3], [2,6], [3,2], [3,5], [4,2], [4,5], [4,6], [5,4], [6,2], [6,4], [6,5], [6,6]]

targets = []

iterations = 50
gen_location = nil
while !gen_location && iterations > 0
  y = rand height - 9
  x = rand width  - 9
  temp = (0...9).product(0...9).map{|_y, _x| [y + _y, x + _x]}
  if temp.all?{|_y,_x| !board["(#{y},#{x})"]}
    gen_location = temp
    targets += generator.map{|_y, _x| [y + _y, x + _x]}
  end

  iterations -= 1
end

enemies = board.keys.sample(100).reject {|k| board[k] == bot_id}
interrupts = []
enemies.each do |location|
  y, x = location.scan(/\d+/).map &:to_i
  interrupts |= ((y-1)..(y+1)).product((x-1)..(x+1)).reject{|y, x| gen_location.include?([y,x]) || board["(#{y},#{x})"]}
end

targets += interrupts.sample(30 - targets.size)

puts JSON.dump(targets)

@muddyfish teşekkürler, bu düzeltildi! Şimdi tek sorun, Windows komut satırı komutlarının kodlanmış 8191 sınırına sahip olmasıdır, bu, simülasyonun belirli bir noktasında botların kesilmiş JSON dizesini ayrıştıramadığı için çökeceği anlamına gelir. Bu bir işletim sistemi sorunu, sanırım
Value Ink

@muddyfish Zaten Windows'un komut satırı sınırı nedeniyle problem yaşadığını, son hatanın görünüşte bir Linux kutusu olan Cloud9'da olduğunu belirtmiştim. Botum Linux kutunuzda nasıl bir ücret alıyor (bir tane olduğunu ima ettiğinden beri)?
Value Ink

Anlaşmadım, ama bot_scoreher botun diğer botlara karşı ne kadar kazancı olduğunu gösteren rakamlar
Blue

Tamam, teşekkürler! Ne yazık ki, Cloud9 aslında bir GUI'ye sahip değil ve Windows nihayetinde komut sınırını ihlal etmeden simülasyonu çalıştıramıyor, ama en azından botların birbirine nasıl karşı karşıya kaldığına kısa bir göz attım. Ayrıca, botumun zaman zaman kendi başına mücadele ettiğini görüyorum, çünkü ara sıra zaman aşımına
Value Ink

4

Python 2, Eğitim Botu

Çünkü herkes bunlardan birine ihtiyaç duyar!

import random, copy
import sys, json

args = json.loads(sys.argv[1])
bot_id = args["bot_id"]
x_size = args["x_size"]
y_size = args["y_size"]
cur_tick = args["tick_id"]
board = args["board"]

glider = [[1,2],[2,1],[0,0],[0,1],[0,2]]

x_add = random.randrange(x_size)
y_add = random.randrange(y_size)
new_glider = copy.deepcopy(glider)
for coord in new_glider:
    coord[0]+=y_add
    coord[1]+=x_add
move = new_glider
print json.dumps(move)

4

Java, Troll Bot

Troll Bot bunu düşündü ve düşmanı önemsemediğini fark etti. Aslında bu fabrikaları, haritanın her yerinde rastgele adamlarını üretmek için spam yapıyor. Bir süre sonra herhangi bir ek hücrenin topaklarda en iyi şekilde kullanıldığını fark etti. Dört hücreli bu bloklar birbirine yapışacak ve planörlerin izlerini durduracak! Sadece savaştığını düşünmüyor. Ayrıca ayrıntılı nesne yönelimli programlamanın büyük destekçisi. Trol ayrıca kodlayıcıların y, x biçiminde olduğunu ve test edilmek istediğini varsayar. Sadece onu "TrollBot.java" adlı bir dosyaya koyun, o da ayarlanacak!

package trollbot;

/**
 *
 * @author Rohans
 */
public class TrollBot{
public static class coord{
    public int x;
    public int y;
    public coord(int inX,int inY){
        x = inX;
        y = inY;
    }
    @Override
    public String toString(){
        return"["+x+","+y+"]";
    }
}
    /**
     * Input the JSON as the first cla
     * @param args the command line arguments
     */
    public static void main(String[] args) {
       String JSON="{\"bot_id\":1,\"y_size\":1000,\"x_size\":1000,\"board\":{}}";
    String[] JArray=args[0].split(",");
       int botId=Integer.parseInt(JSON.charAt(10)+"");
    int xSize=Integer.parseInt(JArray[2].substring(JArray[2].indexOf(":")+1));
    int ySize=Integer.parseInt(JArray[1].substring(JArray[1].indexOf(":")+1));
    int[][] board = new int[xSize][ySize];//0 indexed
//todo: parse the board to get an idea of state
    String soldiers="[";    
//for now just ignore whats on the board and put some troll cells on
    //Attempts to create 3 10 cells factories of cells, hoping it does not place it on top of allies
    //Then puts random 2/2 blocks
  boolean[][] blockspam=new boolean[10][8];
  blockspam[7][1]=true;
  blockspam[5][2]=true;
  blockspam[7][2]=true;
  blockspam[8][2]=true;
  blockspam[5][3]=true;
  blockspam[7][3]=true;
  blockspam[5][4]=true;
  blockspam[3][5]=true;
  blockspam[1][6]=true;
  blockspam[3][6]=true;
  for(int z=0;z<3;z++){
     int xOffSet=(int) (Math.random()*(xSize-11));
     int yOffSet=(int) (Math.random()*(ySize-9));
     //stay away from edges to avoid odd interactions
     for(int i=0;i<blockspam.length;i++){
         for(int j=0;j<blockspam[i].length;j++){
             if(blockspam[i][j])
             soldiers+=new coord(j+yOffSet,i+xOffSet).toString()+",";
         }
     }
  }
  soldiers=soldiers.substring(0,soldiers.length()-1);
  for(int i=0;i<8;i++){
            int y=(int ) (Math.random()*(ySize-1));
            int x = (int) (Math.random()*(xSize-1));
      soldiers+=new coord(y,x).toString()+",";
                          soldiers+=new coord(y+1,x).toString()+",";
                          soldiers+=new coord(y,x+1).toString()+",";
                          soldiers+=new coord(y+1,x).toString()+",";

  }
  soldiers+="\b]";

  System.out.println(soldiers);
  //GO GO GO! Lets rule the board
    }

}

3

Python 3, RandomBot

Bu bot akıllı kararlar vermekte zorlanıyor, ama en azından bir şeyi başka şeylerin üzerine koymaya çalışmamayı biliyor. Rastgele planör, tekne, C / 2 Orthagonal s ve çeşitli yönlere sahip 2x2 bloklar oluşturacak ve yerleştirildiklerinde başka bir şeyle, müttefik veya düşmanla üst üste gelmemelerini sağlayacak.

Bu bot test edilmedi, GUI'yi çalıştırmayı denediğimde her türlü hatayı alıyorum. Ayrıca, TrainingBot'u temel olarak kullandım ve sadece düzenleme yaptım, bu yüzden koddaki benzerlikler muhtemelen bundan kaynaklanıyor.

import random, copy
import sys, json
args = json.loads(sys.argv[1])
bot_id = args["bot_id"]
x_size = args["x_size"]
y_size = args["y_size"]
board = args["board"]
occupied = [tuple(key) for key,value in iter(board.items())]
cellsleft=30
move=[]
choices = [[[1,2],[2,1],[0,0],[0,1],[0,2]],
           [[0,0],[0,1],[1,1],[1,0]],
           [[0,1],[1,0],[0,2],[0,3],[1,3],[2,3],[3,3],[4,3],[5,2],[5,0]],
           [[0,0],[1,0],[0,1],[2,1],[2,2]]]
while cellsleft>0:
    x_add = random.randrange(x_size)
    y_add = random.randrange(y_size)
    new_glider = copy.deepcopy(random.choice(choices))
    randomdirection = random.choice([[1,1],[1,-1],[-1,1],[-1,-1]])
    maxy=max([y[0] for y in new_glider])
    maxx=max([x[1] for x in new_glider])
    for coord in new_glider:
        coord[0]=coord[0]*randomdirection[0]+y_add
        coord[1]=coord[1]*randomdirection[1]+x_add
        cellsleft-=1
    set([tuple(x) for x in new_glider]) 
    if not set([tuple(x) for x in new_glider]) & (set(occupied)|set([tuple(x) for x in move])) and cellsleft>0:
        if min(y[0] for y in new_glider)<0: new_glider = [[y[0]+maxy,y[1]] for y in new_glider]
        if min(y[1] for y in new_glider)<0: new_glider = [[y[0],y[1]+maxx] for y in new_glider]
        move += new_glider
    elif set([tuple(x) for x in new_glider]) & (set(occupied)|set([tuple(x) for x in move])):
        cellsleft+=len(new_glider)

print(json.dumps(move))

1
GUI büyük olasılıkla print(sys.argv[1])3. satırdaki (çünkü simülatör yalnızca uyanmak istediğiniz koordinatların dizesini bekler) çıktısını bozan 3 numaralı hattan dolayı başarısız oluyor ). Ayrıca, programınızın son satırında bir kapanış paren eksik.
Value Ink

@ KevinLau-notKenny GUI, eğitim botunda ve Ruby botunda başarısız oldu. Yine de bu satırı kaldırdım ve kapanış parenine tekrar ekledim (ikincisinin kopyala-yapıştır hatası olduğunu düşünüyorum).
Steven H.

Hangi işletim sistemini kullanıyorsunuz ve çalıştırdığınızda komut satırında hangi hatalar görünüyor? Şu anda, Windows'un yaklaşık 8000 komut satırı karakter sınırını aştığında komut satırının kesildiği komut satırından geçen argümanlar nedeniyle düzgün şekilde çalıştıramayacağı bilinen bir hata.
Value Ink

@ KevinLau-notKenny Windows 10 kullanıyorum ve anladım ... pek çok hata. İlk şey BeautifulSoup'u bulmak istememek html5lib, ardından tüm botları içeren klasörü bulamamaktı (her ikisinin kodunu da değiştirmek zorunda kaldım) ve o zamandan beri Python botunun çalıştırılması 0 olmayan bir dönüş koduyla sonuçlandı. 1.
Steven H.

Ekranda çok fazla aktif hücre varsa, Windows hala kodu çalıştıramaz ... Fakat diğer hatalarınız için olduğu gibi, TrainingBot Python 2'yi istiyor olabilir mi?
Value Ink

3

Python, GuyWithAGun

O bir erkek, silahı var; o kızdı. Sadece başkalarının ne yaptığına bakılmaksızın her yere paraşütçü silahları atıyor.

import random, copy
import sys, json

args = json.loads(sys.argv[1])
bot_id = args["bot_id"]
x_size = args["x_size"]
y_size = args["y_size"]
tick_id = args["tick_id"]
board = args["board"]

start_squares = [[0,5],[2,5],[1,6],[2,6],
                 [35,3],[36,3],[35,4],[36,4]]
gun = [[11,5],[11,6],[11,7],
       [12,4],[12,8],
       [13,3],[13,9],
       [14,3],[14,9],
       [15,6],
       [16,4],[16,8],
       [17,5],[17,6],[17,7],
       [18,6],
       [21,3],[21,4],[21,5],
       [22,3],[22,4],[22,5],
       [23,2],[23,6],
       [25,1],[25,2],[25,6],[25,7]]

templates = [start_squares, gun]

def add_squares(pos, coords):
    new_squares = copy.deepcopy(coords)
    for coord in new_squares:
        coord[0]+=pos[0]
        coord[1]+=pos[1]
    return new_squares

def get_latest_pos():
    seed, template_id = divmod(tick_id, 2)
    random.seed(seed)
    cur_pos = [random.randrange(y_size),
               random.randrange(x_size)]
    cur_template = templates[template_id]
    try:
        return add_squares(cur_pos, cur_template)
    except IndexError:
        return []

move = get_latest_pos()

print json.dumps(move)

2

Python 3, SquareBot

Her yere kareler koyar - belki

Kareler Yaşamdaki statik nesnelerdir - hareket etmezler. Öyleyse, etrafına yeterince inert cisim koyarsam, başkalarının yarattığı paraşütler ve patlamalar muhtemelen engellenir veya en azından nemlenir.

- TrainingBot'tan Kabul Edildi

from random import randint
import sys,json,copy
args=json.loads(sys.argv[1])
x=args["x_size"];y=args["y_size"]
square=[[0,0],[0,1],[1,0],[1,1]];D=[]
for g in range(7):
 X=randint(0,x);Y=randint(0,y)
 A=copy.deepcopy(square)
 for C in A:C[0]+=Y;C[1]+=X
 D+=A
print(D)

Yine de test etmekte zorlanıyorum



Aslında bu botun yapması gerekeni yaptığını doğrulayabilirim - ve kontrol
Blue,
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.