Test Sürücüsü • Mücadele Tartışma • Göndermek Adventurer
( Resim Kaynağı )
Birkaç rakip maceracı, hazine için yıkıntıları yıkıyor, ancak bir seferde çok fazla taşıyabiliyorlar ve dayanıklılık sınırlarına sahipler. En değerli hazineyi almak ve devam edemeyecek kadar yorulmadan çıkmak istiyorlar. Yağma şenansanlarından olabildiğince zengin olmaya çalışıyorlar.
Oynanış
Her maceracı, zindanın ilk odasında, 1000 dayanıklılık puanı ve sırt çantasında 50kg alan ile başlar.
Oyun, sıra tabanlı bir şekilde çalışır ve tüm oyuncular sıralarını aynı anda çözer. Her seferinde aşağıdaki işlemlerden birini yapabilirsiniz:
- Bir sonraki odaya geçin.
- Önceki odaya geçin.
- Bir hazine almak için teklif dayanıklılık.
- Bir hazine bırak.
Odalar arasında geçiş yapmak için şu anda sırt çantanızda bulunan her 5 kg için 10 adet dayanıklılık artı 1 adet gerekir. Örneğin, 3 kg hazine taşıyan bir maceracının taşınması için 11 dayanıklılık ve bir 47kg taşıyan bir maceranın taşınması için 20 dayanıklılık gerekir.
Bırakılan hazine, bırakılan hazineden bağımsız olarak 1 dayanıklılık gerektirir.
Kalıntılardan çıktıktan sonra oyuncu tarafından daha fazla dönüş yapılmayacaktır.
Eğer bir oyuncu bu hareketlerden herhangi birini gerçekleştiremezse (dayanıklılık yetersizliği veya hazinelerin bulunmaması nedeniyle), maceracıları tükenmişlikten ölmekte ve hazinelerini o anda işgal edilen odaya dökmektedir. Benzer şekilde, bir oyuncu geçersiz bir işlem yapmaya çalışırsa, maceracıları bunun yerine bir tuzak tarafından öldürülecek ve aynı hazine dökülmesine neden olacaktır.
teklif verme
Bir hazine için asgari teklif, hazinenin ağırlığında olduğu 1 kg başına 1 dayanıklılıktır. Hazineyi edinme ihtimalinin daha yüksek olması için ek dayanıklılık puanları da teklif edebilirsiniz. Sonucu ne olursa olsun teklif edilen dayanıklılık tüketilir.
Birden fazla oyuncunun aynı hazineyi alma teklifi vermesi durumunda, en yüksek teklifi veren oyuncu hazineyi alır. Eğer birden fazla oyuncu en yüksek teklifi verdiyse, hiçbiri hazineyi alamaz.
Koşulu Kazan
Toplam en büyük hazineye sahip oyuncu kazanır. Olası bir bağlanma durumunda, bağlar en küçük toplam ağırlığa, daha sonra en az hazineye, ardından en değerli hazinenin değerine, ikinci en değerli, üçüncü ... bağlar kopana kadar gider. Bu noktada hala bir bağın olmadığı neredeyse imkansız durumda, test sürücüsü "vidala" diyor ve kazananı keyfi belirliyor.
Turnuva kapsamında, oyuncular ilk sırayı 10 puan, ikinci sırayı 9 puan, üçüncü sırayı 8 puan, vb ..., ölü oyuncularla ve maceracılarla 0 puan alan birincilikle sıralayacaktır.
Kalıntılar hakkında
- Her oda, başlangıçta arasında ihtiva vehazineler. (Oda numarası)
- Keyfi olarak birçok oda var, sadece maceracıların dayanıklılığı ve keşif isteği ile sınırlı.
- Her hazine parasal bir değere (bütün olarak $) ve bir ağırlığa (bütün kg olarak) sahip olacaktır.
- Hazineler daha da derinleştikçe hazineler daha değerli ve bol olma eğilimindedir.
- Hazineleri oluşturmak için spesifik formüller aşağıdaki gibidir: ( zar rulolarında gösterimi kullanılarak )
- Ağırlık önce formül (en az 1) kullanılarak üretilir.
- Hazine değeri daha sonra aracılığıyla üretilir (burada , oda sayısıdır ve , ağırlıktır)
Oyunculara Görünen Bilgiler
Her aşamada, oyuncular aşağıdaki bilgileri alır:
- Şu an içinde bulundukları oda sayısı. Bu 1 indeksli, yani kavramsal olarak çıkış "oda 0" da.
- Odadaki hazinelerin listesi
- Şu anda odada bulunan diğer oyuncuların listesi.
- Şu anki hazine envanteriniz
- Mevcut dayanıklılık seviyeniz
Kodlama
Test sürücüsü burada bulunabilir .
Bu Adventurer
sınıfın bir alt sınıfını uygulamalısınız :
class Adventurer:
def __init__(self, name, random):
self.name = name
self.random = random
def get_action(self, state):
raise NotImplementedError()
def enter_ruins(self):
pass
Sadece get_action
yöntemi geçersiz kılmanız gerekir . enter_ruins
Bir oyun başlamadan önce çalıştırılır ve oyuna hazırlanmak istediğiniz şeyi hazırlama şansınız olur. Geçersiz kılmanıza gerek yok __init__
ve gerçekten yapmamalısınız . Eğer __init__
çökerse, diskalifiye edilirsiniz.
get_action
namedtuple
aşağıdaki alanları içeren tek bir argüman alır (bu sıralamayı imha etmeyi tercih ediyorsanız):
room
: o anda bulunduğunuz odanın sayısıtreasures
: Odadaki hazinelerin listesiplayers
: Odadaki diğer oyuncuların listesi. Sadece oyuncu adını bu şekilde elde edersiniz, böylece hangi botun onları veya envanter / dayanıklılığını kontrol ettiğini bilmiyorsunuzdur.inventory
: sırt çantanızdaki hazinelerin listesistamina
: Mevcut dayanıklılık seviyeniz
Bu nesne ayrıca iki yardımcı özellik sağlar:
carry_weight
: Taşıdığınız tüm hazinelerin toplam ağırlığıtotal_value
: Taşıdığınız tüm hazinelerin toplam değeri
treasures
Ve inventory
listeleri ihtiva namedtuple
bu özelliklere sahip s:
name
: hazinenin adı (kozmetik amaçlar için)value
: Hazinenin parasal değeri $.weight
: hazinenin kg cinsinden ağırlığı
get_action
aşağıdaki değerlerden / kalıplardan birini döndürmelidir:
'next'
veya'previous'
önceki / sonraki odalara geçmek için'take', <treasure index>, <bid>
(evet, bir demet olarak, herhangi bir sıra teknik olarak da çalışacaktır), odanın hazine listesinde verilen endekste hazineye teklif vermek. Her iki argüman tamsayı olmalıdır. Şamandıralar yuvarlanır.'drop', <inventory index>
Verilen endekste bulunan taşınan hazineyi düşürmek. Endeks (doğal olarak) bir tamsayı olmalıdır.
Diğer Kısıtlamalar
- Sözde rasgelelık için sadece başlatma sırasında size verilen rastgele örneği kullanabilirsiniz.
- Davranışsal nondeterminizmi ortaya çıkarabilecek hiçbir şeye izin verilmez. Burada amaç, yeni botların test edilmesine yardımcı olmak için aynı tohum verildiğinde (ve test sürücüsündeki potansiyel böcekler) botların aynı şekilde davranmasını sağlamaktır. Sadece kozmik radyasyon herhangi bir sapma / nondeterminizme neden olabilir.
- Hash kodlarının Python 3'te rasgele olduğunu, bu nedenle
hash
herhangi bir karar verme için kullanmanın yasak olduğunu unutmayın.dict
Python 3.6'dan bu yana tutarlı bir şekilde garanti edildiğinden kararlar için yineleme emrini kullanırken bile gayet iyi.
- Test sürücüsünü
ctypes
hack veyainspect
stack voodoo (veya başka bir yöntem) atlatamazsınız. Bu modüller ile yapabileceğiniz etkileyici bazı korkutucu şeyler var. Lütfen yapma- Her bot savunma kopyaları ve doğal değişkenliği sayesinde oldukça iyi korunuyor
namedtuple
s'nin şekilde korunuyor, ancak bazı çizilemeyen boşluklar / istismarlar var. - Denetleyicinin işlevselliğini atlatmak için kullanılmadığı sürece, diğer işlevler
inspect
vectypes
bunlar da kullanılabilir. - Mevcut oyunda diğer botların kapma örneklerine hiçbir şekilde izin verilmemektedir.
- Her bot savunma kopyaları ve doğal değişkenliği sayesinde oldukça iyi korunuyor
- Botlar solo çalışmalı ve herhangi bir amaç için hiçbir şekilde başka botlarla koordine olmamalıdır. Bu, biri diğerinin başarısı için kendini feda edecek şekilde farklı hedeflere sahip iki bot yaratmayı içerir. 10'dan fazla rakip olduktan sonra, aynı oyunda iki botun olması garanti edilmez ve maceracı isimlerinin bot sınıfına dair herhangi bir belirti vermez, bu yüzden bu tür stratejiler zaten sınırlıdır.
- Halen yürütme süresinde herhangi bir kısıtlama yoktur, ancak turnuvalar çok uzun sürmeye başlarsa ileride kısıtlama hakkını saklı tutarım. Makul olun ve dönüş işleminizi 100ms altında tutmaya çalışın bu işlemi eşiğin altında sınırlamak zorunda öngörmediğim için . (Tüm botlar tur başına yaklaşık 100ms alırsa turnuvalar yaklaşık 2 saat sonra oynanır.)
- Bot sınıfınız tüm gönderiler arasında benzersiz olarak adlandırılmalıdır.
- Oyunlar arasında hiçbir şey hatırlamayabilirsin. (Ancak, olabilir arasındaki şeyleri hatırlamak dönüşler )
- Sys.modules dosyasını düzenleme. Dışarıdaki herhangi bir örnek değişken, sabit olarak değerlendirilmelidir.
- Kendiniz de dahil olmak üzere hiçbir botun kodunu programlı olarak değiştiremezsiniz.
- Bu, kodunuzun silinmesini ve geri yüklenmesini içerir. Bu hata ayıklama ve turnuvaları daha düzenli hale getirmektir.
- Denetleyicinin çökmesine neden olan herhangi bir kod derhal diskalifiye edilir. İstisnaların çoğu yakalanırken, bazıları kayabilir ve segfaults yakalanamaz. (Evet, sayesinde Python'da segfault yapabilirsiniz
ctypes
)
gönderimler
Cevabın kazınmasına yardım etmek için, cevabın en üstünde botunuzun adını a #Header1
ile belirtin ve cevabınızın en az bir kod bloğu içerdiğinden emin olun (cevabınızdaki ilk cevap kullanılacaktır). Sıyırıcı tarafından otomatik olarak ekleneceği için herhangi bir ithalat veya belge eklemeniz gerekmez.
Daha detaylı ve anlaşılır açıklamalarla cevapları yükseltmeye daha meyilli olacağım. Diğerlerinin de aynı şekilde davranması muhtemeldir.
Kabaca konuşursak, cevabınız şu şekilde biçimlendirilmelidir:
# Name of Bot
Optional blurb
#imports go here
class BotName(Adventurer):
#implementation
Explanation of bot algorithm, credits, etc...
(olarak işlendi)
Botun Adı
İsteğe bağlı bulanıklaştırma
#imports go here class BotName(Adventurer): #implementation
Bot algoritması, kredi vb. Açıklama
Test Sürücüsünü Yerel Olarak Çalıştırma
Python 3.7+ sürümüne ihtiyacınız olacak ve tabulate
pip ile yüklemenizi de tavsiye ederim . Gönderiler için bu sayfayı kazıma ek olarak lxml
ve gerektirir requests
. En iyi sonuç için ANSI renk çıkışları destekli bir terminal de kullanmalısınız. Bunu Windows 10'da nasıl ayarlayacağınızla ilgili bilgiler burada bulunabilir .
Botunuzu ruins.py
( ruins_bots
varsayılan olarak) aynı dizinde bulunan bir alt dizindeki bir dosyaya ekleyin from __main__ import Adventurer
ve modülün üstüne eklediğinizden emin olun . Bu, sıyırıcı gönderiminizi indirdiğinde modüllere eklenir ve kesinlikle hack olurken, botunuzun uygun şekilde erişebilmesini sağlamanın en kolay yoludur Adventurer
.
Bu dizindeki tüm botlar çalışma zamanında dinamik olarak yüklenir, bu nedenle başka bir değişiklik yapmak gerekmez.
Turnuva
Nihai victor, her oyunda 10 taneye kadar bot içeren bir dizi oyunda belirlenecek. Toplamda 10'dan fazla başvuru varsa, ilk 10 bot, her bot (tam olarak) 20 oyun oynayana kadar sistematik olarak 10'lu gruplara ayırarak belirlenir. Sıfırlama puanları olan ilk 10 bot bu gruptan seçilecek ve ilk yerdeki bot ikinci sıradaki bottan 50 puan kazanana veya 500 oyun oynanana kadar oyun oynayacak.
En az 10 başvuru yapılıncaya kadar, boş alanlar kalıntılar arasında rasgele dolaşan ve dayanma süreleri tükenene ve çıkışa doğru gitmeleri gerekene kadar rasgele hazineleri alan (ve bazen de bırakan) rasgele hazineleri alan "Drunkards" ile doldurulur.
Yeni başvurular varsa, turnuvalar haftada bir tekrarlanacaktır. Bu, belirlenmiş bitiş tarihi olmayan açık bir KOTH mücadelesidir.
Liderler Sıralaması
4 Mayıs 2019, 04:25 PM MDT: (2019-05-04 4:25 - 6: 00 saatleri arasında)
Seed: K48XMESC
Bot Class | Score | Mean Score
--------------+---------+--------------
BountyHunter | 898 | 7.301
Scoundrel | 847 | 6.886
Accountant | 773 | 6.285
Ponderer | 730 | 5.935
Artyventurer | 707 | 5.748
PlanAhead | 698 | 5.675
Sprinter | 683 | 5.553
Accomodator | 661 | 5.374
Memorizer | 459 | 3.732
Backwards | 296 | 2.407
Güncelleme - 15 Nis: birkaç kural güncellemesi / açıklama
Güncelleme - Nis 17: Diğer botların kodlarını değiştirmek gibi birkaç istisnai dava vakasını yasakladı.
Güncelleme - 4 Mayıs: Bounty, Backea'yı kesinlikle yok ettiği için Sleafar'a verildi. Tebrikler!