Açlık Oyunları - Ye ya da Öl
Yemek yemezsen ölürsün. Eğer yersen, yaşarsın (ölene kadar). Sen olacak die, bu yüzden son ölmeye çalışın.
genel bakış
Bir av hayvanları sürüsü ile dolu bir ada var. Beş avcı paketini kontrol ediyorsun. Amacınız, paketinizi canlı tutmaktır. Bunu av yiyerek yapın. Av avcılardan kaçma eğilimindedir, aksi halde sürünün içinde kalmaya çalışır. Tabi ki, paketin diğer paketlerle aynı alanda olacak, bu yüzden yarışma sizden önce onları yemeye çalışacak. Bunun sizi cesaret kırmasına izin vermeyin, yoksa açlıktan öleceksiniz.
Nasıl oynanır
Paketinizi yönlendirmek için bir komut satırı programı oluşturun ve gönderin. STDIN üzerindeki kontrol programından ve STDOUT'daki çıkış komutlarından durum bilgisi alacak. Format aşağıda ayrıntılı olarak açıklanmıştır. Her program sadece bir kez yürütülecek ve daha fazla paket üyesi bulunmayana kadar çalışmaya devam etmelidir . Girdileri girerken okumanız ve hızlı bir şekilde yanıtlamanız gerekecektir. Her cevap için 200ms'lik kesin bir zaman aşımı süresi vardır. O zamana kadar cevap vermediyseniz, paketiniz geçerli dönüş için yeni talimatlar almayacaktır.
Programınız denetleyici tarafından çalıştırılamazsa, geçerli sayılmaz. Lütfen gönderinizi çalıştırmak için kullanmam gereken komut satırı dizesini ekleyin. Herhangi bir özel talimat varsa (derleyici kurulumu, vb.), Lütfen bunları ekleyin. Çalışmasını sağlayamazsam, sizden yorumlarda yardım isteyeceğim. Cevap vermezseniz, gönderinizi kabul edemeyeceğim.
Turnuva 64bit bir Linux sisteminde yapılacaktır. Gerekli yönergeleri verirken bunu aklınızda bulundurun.
ayrıntılar
Her bir yaratığın konumu ve yönü , sırasıyla
double
kendilerinix
vey
koordinatlarını temsil eden bir çift duyarlıklı kayan nokta sayısı (örn. ) Şeklindedir.Her yaratık bir nokta olarak kabul edilir. Bu, aynı alanı üst üste getirip işgal edebilecekleri anlamına gelir. Kenara atılmayacaksınız ve diğer canlılarla çarpışma kavramı yok.
Ada bir taraftır, bir tarafına 500 birimdir. Bu sınırların ötesine girmeye çalışırsanız, kenara kenetleneceksiniz. Kökeni
{0,0}
sol üstte,x
sağa doğru vey
aşağı doğru artıyor. Yine, harita kaydırmaz .Oyun 1500 + (packCount * 50) av hayvanları ile başlar. Adanın merkezinde toplanacaklar, ancak hızla hareket etmeye başlamaya karar verecekler.
Paketler, çevre etrafındaki eşit aralıklarla yerleştirilmiş bir dairede düzenlenecektir. Paket sırası karıştırılır, bu nedenle belirli bir yerden başlamaya güvenmeyin.
Av hayvanları 30 birim yarıçapındaki diğer tüm hayvanları görebilir . Tur başına maksimum 6,0 birim hareket edebilirler .
Avcılar diğer tüm hayvanları 50 birim yarıçapında görebilirler . Her turda maksimum 6,1 birimde hareket edebilirler . Bu, görülmeden önce avı görebilecekleri ve (zorlukla) onları geçebilecekleri anlamına gelir.
Avcılar, açlık seviyelerine göre yaşar ve ölürler . 1000'de başlar ve her turda bir azalır. Hareketten sonra, bir avcı 1 birim av içindeyse, otomatik olarak onu yer. Bu avını kaldırır ve avcının açlığını 1000'e ayarlar. Her avcı, dönüş başına sadece bir av yiyebilir. Menzilde birden fazla varsa, ilmek için ilk önce hangisini alırsa mutlaka yenecektir (mutlaka en yakın olan değil). Bir avcı açlığı sıfıra ulaşırsa ölür.
Paketler her biri beş üyeyle başlar . Her 5000 turda hala oyunda olan tüm paketler bir yeni üyeye dönüşecek. Diğer bir paket üyesinin görünür aralığına yerleştirilecektir. Girişlerinizin beşten fazla üyeyle iş yapabildiğinden emin olun.
Her 1000 turda daha fazla av ortaya çıkacak. Yeni av sayısı eksi olan canlı avcı sayısı olacaktır.
Avcılar diğer avcılara saldıramaz. Avlandıklarında avlarını yer. Bu kadar.
Bir sıra içindeki sipariş:
- Bütün avlar karar verir.
- Bütün avcılar karar verir
- Tüm av hareketleri
- Bütün avcılar taşınır / yer
Her paketin kararlarını / hamlelerini aldığı sıra, her seferinde rasgele seçilecektir.
Protokol (Genel)
Tüm iletişim dizge biçiminde yapılır US-ASCII
. Sayılar, Java Double.toString()
veya kullanarak dizgelere dönüştürülür Integer.toString()
. Çıktınız, Java tarafından okunabilecek şekilde Double.valueOf(String)
(tamsayılar çıkarmayacaksınız) biçimlendirilmelidir . Ayrıştırılabilir formatlarla ilgili ayrıntılar için belgelerine bakınDouble
. Bir satırda tüm alanlar standart ayrılır \t
karakteri, ve satırbaşları vardır \n
. Tüm dize sonlandırılacak, boş bir bayt olacaktır \0
.
Aşağıdaki örneklerde, <>
okunabilirlik uğruna alanları işaretlemek için kullanıyorum . Bunlar gerçek dizgelerde mevcut değil.
Protokol (Giriş)
Giriş dizesinin, paketinizde kaç tane canlı göründüğüne bağlı olarak uzunluğu değişir. 100k karakteri geçebilir, bu yüzden hazırlıklı olun. Temel kurulum:
Satır 0: Oyun hakkında temel bilgiler.
turn
geçerli dönüş numarasıdır ve sayımlar , sahada kalan av ve avcıların toplam sayısıdır. Bunlarinteger
string biçimindedir.<turn>\t<preyCount>\t<predatorCount>\n
Satır 1: Paket üyelerinizin benzersiz kimlikleri ve açlık seviyeleri. Bunlar edilir değil her giriş için aynı sırayla verilmiştir. Girdide göründükleri sırayı değil , tek tek üyeleri izlemek için benzersiz kimlikleri kullanın . Yine, bunlar
integer
dizge gibidir. İkili paket için bu şöyle olur:<id[0]>\t<hunger[0]>\t<id[1]>\t<hunger[1]>\n
Satır 2: Paket üyelerinizin pozisyonları, 1. satırda verilen sırayla . Bunlar
double
string olarak:<x[0]>\t<y[0]>\t<x[1]>\t<y[1]>\n
Aşağıdaki satırlar her bir paket üyesinin görünürlüğünü, 1. satırda verilenle aynı sırada gösterir . Bunlar üye başına iki satır olarak verilecek.
Her biri için birincisi görebileceği avın bulunduğu yerlerden oluşur . İkincisi, avcıların görebileceği yerler. Bu yerler bir bütün olarak benzersiz değildir. Örneğin, iki paket üyesi aynı hayvanı görebiliyorsa, her iki üyenin dizisinde olacaktır. Ayrıca, kendi paket üyeleriniz de eklenecek. Bunları hariç tutmak istiyorsanız, konumları kendi üyelerinizle karşılaştırmak isteyebilirsiniz. Tüm konumlar double
dizge biçimindedir.
Her yaşayan üye için:
<prey[0].x>\t<prey[0].y>\t<prey[1].x>\t<prey[1].y>\n
<predator[0].x>\t<predator[0].y>\t<predator[1].x>\t<predator[1].y>\n
Son olarak, son karakter \0
, bir sonraki satırın başında olacak .
İstisna: Girdiyi alırsanız dead\0
paketiniz ölür. Lütfen programınızı dikkatlice sonlandırın, lütfen. Kontrolör gerektiğini kapatıldığında bütün canlı işlemleri kapatıldı, ama yerine her yere zombi süreçleri istemem. Bir nezaket olarak, bir giriş zaman aşımı içerebilir. Mesela, benim örnek sınıfım 15 saniye girdi almazsa biter.
Protokol (Çıktı)
Çıktı basittir. double
Her canlı paket üyesi için bir çift değer vereceksin . Bunlar, bu dönüşü üstlenmelerini istediğiniz hareketi temsil eder. Örneğin, eğer yaratıcınız şu anda çalışıyorsa {100.0, 100.0}
ve onlara bir komut verirseniz {-1.0, 1.0}
, onlar taşınacaktır {99.0, 101.0}
. Tüm sayılar sekmeyle ayrılmış tek bir satırda olacaktır.
Örneğin, hayatta 3 paket üyeniz varsa, bu geçerli bir cevap olacaktır:
1.0\t-1.0\t2.0\t-2.0\t3.0\t-3.0\0
Bu ederek yaratıkları taşımak istiyorsunuz {1.0,-1.0}
, {2.0,-2.0}
ve {3.0,-3.0}
. Sipariş, girişte alınan ile aynıdır. Sonunu unutma \0
!
Geçersiz giriş yaparsanız, hatalı sonuçlar izleyecektir. Tek bir sayı a ile ayrıştırılamazsa double
sıfır olur. Dize bir bütün olarak ayrıştırılamazsa, yeni bir talimat verilmeyecek ve paketinizin tamamı önceki sıradaki yönergeleri kullanacaktır.
Her yöne maksimum 6.1 ünite mesafeye kadar kenetlenecektir. İsterseniz bundan daha yavaş hareket edebilirsiniz. Örneğin, {1, 0}
size bir birim taşıyacak. {6,8}
(mesafe 10) yalnızca 6.1 ünite taşıyacak ve etrafa düşecektir {3.66, 4.88}
. Yön sabit kalır.
Önemli: Kontrol programı STDOUT hem okur ve STDERR. Bir istisna atarsanız ve STDERR'ye yazdırırsanız, iletinin geçerli bir yanıt şeklinde olması pek olası değildir. Bunu yapmaktan kaçının.
Kontrol Programı / Test
Kontrolörün kaynağı burada bitbucket.org adresinde bulunabilir . Çalıştırmadan önce derlemeniz gerekecektir. Ana sınıf Game
ve tüm sınıflar varsayılan pakette. Çalıştırmak için her paketin komutunu ayrı bir argüman olarak ekleyin. Örneğin, bir Java ChaserPack ve bir Python LazyPack.py çalıştırmak istiyorsanız, şunları kullanabilirsiniz:
java Game "java ChaserPack" "python LazyPack.py"
Haritada avlar yeşil renkte, avcılar kırmızı renkte görünür. Ancak, hangi paket argüman olarak verilen ilk paket ise bunun yerine mavi renkle gösterilir. Bu, test amacıyla onları daha kolay ayırt etmek için tasarlanmıştır. Avcılar, yediklerinde beş kare boyunca beyaz renkte yanıp söner.
Oyun, son avcı aç olana kadar devam edecek, açlık veya tükenme olayları meydana geldiğinde konsola yazacaksınız. Oyun tamamlandıktan sonra, her paket için puan verilecek. Açlık / tükenme olaylarını görmek istemiyorsanız, -silent
argümanı kullanabilirsiniz . O zaman sadece final skorunu verir. Bunu ilk argüman olarak geçmelisiniz :
java Game -silent "java ChaserCat" "./someOtherPack"
Dahil bir iskelet Java paketi GenericPack
. Gerekli temel giriş / çıkış işlemlerini içerir. Nasıl ayrıştırılacağına ve cevaplandığına dair net bir örnek vermek gerekirse. Başka bir dilde bir şablon eklemek isterseniz, bana bildirin.
Ayrıca, şablona dayanan bir yırtıcı hayvandır ChaserPack
. Turnuvaya dahil edilmeyecek ve yalnızca test amaçlı dahil edilecektir. Kasıtlı bir hedefleme hatası nedeniyle oldukça kötü bir performans sergiliyor. Eğer yenemezsen, denemeye devam et.
Aşağıda, kontrol programına ait örnek bir çalışma bulunmaktadır (video için tıklayınız). Video kalitesi mükemmel değil (üzgünüm), ancak avın nasıl hareket ettiği hakkında bir fikir edinebilirsiniz. ( dikkat: ses )
puanlama
Kazanan, her raundda puan kazanarak turnuva tarafından belirlenir.
Her tur tüm avcılar ölünceye kadar ilerler. Her paket, son üyesinin açlıktan öldüğü zamana göre puanlanacak. Daha sonra siparişe göre puanlar verilir. On tur için puan toplanacak ve victor en yüksek puan alan pakettir.
Her tur için ilk sırayı 100 puan alırsınız. Bundan sonraki her yer için ödül% 20 oranında azaltılır (aşağı yuvarlanır). Bu, puan sıfıra ulaşana kadar devam edecektir (17. sıradan sonra). 18+ ve üstü yerler tur için puan alamaz. Bağlanan paketler eşit puan alır. Örneğin:
1st : 100
2nd : 80
3rd : 64 (T)
3rd : 64 (T)
4th : 51
...
17th: 1
18th: 0
19th: 0
Turnuva boyunca mümkün olan en yüksek puanlar, her 10 seferde birincilikten itibaren 1000'dir.
Birden fazla program ilk etapta bağlı olan turnuvayı sonlandırırsa, sadece sunulan ilk etapta girişlerle on turluk bir turnuva daha düzenlenecektir . Bu, bir zafer kazanana kadar devam edecek.
Her hafta kabaca bir turnuva yapmaya çalışacağım ya da yeni başvurular geldiğinde.
Ek Kurallar (adil oyun!)
Herhangi bir harici kaynağı okuyamaz veya yazamazsınız. Programınızın çoklu zamanlarını çağırmayacağınız için, herhangi bir durum bilgisi dahili olarak saklanabilir.
Diğer işlemlere / gönderimlere müdahale etmeyin. Bu mu değil avlarını çalmaya kalkmayın demek, o sürecin çalışan engel olmadığı anlamına gelir vb Onlardan kurtulmak. Bu benim takdirime bağlı.
Yarışmacılar en fazla üç girişle sınırlıdır . Daha fazla gönderirseniz, sadece gönderilen ilk üç puanı alırım. Birini iptal etmek istiyorsanız, silin.
Girişler yalnızca diğer girişleri desteklemek için bulunmayabilir. Her biri kendi yararına kazanmak için oynamalıdır.
Programınız (bir defada bir alt sürecin en fazla spawn toplam torunları, doğrudan değil). Her iki durumda da, zaman aşımını aşmadığınızdan emin olun.
Game
Herhangi bir şekilde sınıfın kendisini davet edemezsiniz.
Sonuçlar - 29 Nisan 2014
İşte son on tur turnuvasının sonuçları:
Clairvoyant : 1000
EcoCamels : 752
Netcats : 688
RubySpiders : 436
RubyVultures : 431
CivilizedBeasts : 382
LazyPack : 257
EDT 2014/04 / 29'dan önce 09: 00'dan önce gönderilen paketler bu çalışmaya dahil edilir.
Ayrıca her turun detaylarını görüntüleyebilirsiniz . Nedense turları geriye doğru saymaya karar verdim, bu yüzden "10. tur" ile başlıyor.
Güncellemeler
2014/04/23: FGreg , zaman aşımları ile ilgili bir hata bildirdi (teşekkürler!). Bir düzeltme uygulandı, bu nedenle test uzmanları kontrol program kodlarını güncellemek isteyeceklerdir.