Arka fon
Oyunu Morra basit bir oyun. "Orijinal" versiyonda, birkaç oyuncu eşzamanlı olarak ellerindeki 0-5 sayılarını atarken, herkesin toplamını tahmin ediyor. Burada kullanacağım sürüm önemsiz olmayan stratejinin potansiyelini artırmak için değiştirildi ve aşağıda açıklandı:
- İki oyuncu var.
- Taş-kağıt-makaslarda olduğu gibi, oyuncular aynı anda hareket eder.
- Her turlu, her oyuncu bir sayı 0-5 seçer ve ayrıca tahmin 0-5 rakiplerini seçim. Bu, her turda iki sayı çıktığı anlamına gelir. Açıklığa kavuşturmak için, her iki sayı çıkışı da dahil olmak üzere 0-5 aralığında olmalıdır.
- Rakibinizin seçimini doğru tahmin edersiniz ancak rakibiniz doğru tahmin etmediyse, oynanan iki sayının toplamına eşit sayıda puan kazanırsınız. Örneğin, oynanan rakamlar 3 ve 5 olsaydı, doğru bir tahmin 8 puan değerinde olurdu.
- Her ikisi de veya hiçbiri doğru tahmin edemezse, hiçbir puan verilmez.
- 1000 turdan sonra en yüksek puana sahip olan kişi bu oyunu kazanır.
Turnuva
Turnuva yuvarlak robin tarzında yapılacak ve her olası yarışmacı eşleştirmesiyle gerçekleştirilecek. Her zafer için yarışmacı 2 zafer puanı kazanır. Her kravat 1 galibiyet puanı ile sonuçlanır. Kayıp için zafer puanı kazanılmaz.
Sezgisel olarak, turnuvanın kazananı, diğerlerine karşı en fazla zafer puanı kazanan yarışmacı olacaktır.
Nasıl Girilir
Yarışmak için bot göndermenin iki yöntemi olacak. İlk ve en çok tercih edilen yöntem, denetleyici tarafından sağlanan bir Java arayüzünün uygulanmasıdır. İkinci yöntem ise bağımsız bir program yazmaktır.
Önce Java yöntemini ele alalım. Uygulamanız gereken arayüz şudur Player
ve iki yöntemi tanımlar: public String getName()
botunuzu tanımlar ve altı karakter dizisi olarak public int[] getMove(String[] args)
alır ,. Bir örnek:args
mychoices myguesses myscore opponentchoices opponentguesses opponentscore
042 045 0 324 432 6
Bu, ilk rauntta 0 seçtiğimi ve rakibimin 0 atacağını tahmin ettiğim anlamına gelir. Rakibim 3 attı ve tahmin edeceğim 4 atacaktı. Üçüncü rauntta rakibim atacak olduğumu doğru tahmin etti. a 2, 2 + 4 = 6 puan aldığı anlamına gelir.
Yönteminiz, sırasıyla seçiminiz ve tahmin ettiğiniz iki tam sayı dizisini döndürür. Bir örnek {4,2}
4 seçimi ve 2 tahmini içindir.
İşte bir yöntem olarak yazılmış tam bir Java bot örneği. İsterseniz, gönderiminiz yalnızca getMove
yöntemde olanları içermelidir.
import java.util.Random;
/**
* A simple example Morra bot to get you started.
*/
public class ExampleBot implements Player
{
public String getName()
{
return "ExampleBot";
}
public int[] getMove(String [] args)
{
//easiest way I know to break down to create a move history
//(just contains their throw history)
char[] theirThrowsC = args[3].toCharArray();
int[] theirThrows = new int[theirThrowsC.length];
for(int i = 0; i < theirThrowsC.length; i++)
{
theirThrows[i] = Integer.parseInt(Character.toString(theirThrowsC[i]));
}
//get my score
int myScore = Integer.parseInt(args[2]);
Random r = new Random();
int guess = r.nextInt(6);
if(theirThrows.length > 0)
{
guess = theirThrows[theirThrows.length-1];
}
//throws a random number, guesses what they threw last
return new int[] {r.nextInt(6),guess};
}
public static int otherMethod(int example) //you can write additional static methods
{
return 0;
}
}
Bağımsız bir program olarak
Şu anda ek dil desteğimle sınırlıyım. Java dışında Python 3.4, Perl 5 veya Ruby 2.1.5 ile yazılmış programları kabul edebilirim. Birkaç kişinin istediği gibi bir dil varsa, eklemek için elimden geleni yapacağım.
Programınıza giriş komut satırındaki argümanlar olacaktır. Bu gibi görünebilir:
perl awesomebot.plx 042 045 0 324 432 6
Programınızın çıktısı seçiminiz, ardından tahminlerinizin ardından her biri beyaz boşluk bırakılmalıdır.
Lütfen cevabınıza çalıştırmak için gereken tam komutu ekleyin. Windows 8.1 kullandığımı unutmayın.
Ekstra Kurallar
Devlet ve Zaman Aşımlarını Kaydetme
Programınızın, yerel bir dizinde bilgi saklayabileceğiniz bir metin dosyası oluşturmasına izin verilecek. Bu bilgi turnuva boyunca saklanacak ancak daha sonra silinecek. Dosyaya tanımlayabildiğim bir isim verin.
Kodunuzun yanıt vermesi için 500 milisaniye bir zaman sınırı vardır. Süre içinde cevap vermemek (veya geçersiz bir hamle yapmak), söz konusu karşılaşmanın kaybedilmesine neden olacaktır. Java gönderimleri şu anda pasif bir zaman aşımına sahiptir (aktif olarak yükseltebilirim), Java dışı gönderimler ise işlemlerinin 500 milisaniyeden sonra sonlandırıldığı etkin bir zaman aşımına sahiptir.
Diğer gönderim kuralları
- Kurallara uydukları ve etiket takmadıkları sürece, birden fazla gönderiye izin verilir.
- Her giriş benzersiz olmalıdır. Başka bir botun mantığının tam bir kopyasını farklı bir dilde yazamazsınız.
- Botlar birbirleriyle etkileşime giremez (herhangi bir türden takım oluşturmak için).
- Rakibinizi tanımlamak ve eylemlerini tahmin etmek için botunuzun içindeki diğer botların mantığını kullanamazsınız. Elbette, rakibinizin stratejisini belirlemeye çalışabilirsiniz.
- Denetleyiciyle, diğer yarışmacılarla veya bilgisayarımla uğraşmaya çalışmayın. Harici bilgi kaynaklarına bağlanmayın.
Kontrol eden, denetleyici
Denetleyicinin geçerli sürümü burada bulunur . Java 8 ile yazılmıştır. "Tournament" dosyası, rakiplerin listesini de içeren ana denetleyicidir (kendi yarışmalarınızı düzenlemek istiyorsanız).
Liderler Sıralaması
Lider panosunu çok sık güncelleyemedim. Bu haftasonu oldukça meşgulüm. "Oldukça meşgul" derken 6: 30'dan 9: 30'a kadar bir bilgisayara erişim demek istemiyorum. İşte 5 çalışmadan sonra alınan puanlar. "Echo" botu bir sebepten vazgeçmeyi sürdürdü (benim suçum olabilir, henüz araştırmadım).
170 - Quinn and Valor
158 - Historian
142 - DeltaMax
140 - MorraCowbell
132 - Extrapolator
115 - Rainbolt
102 - Popularity
100 - Interpolator
83 - CounterBot
80 - Basilisk
76 - Erratica
65 - Trendy
63 - Scholar
62 - RandomGuesser
60 - KingFisher
59 - NullifierBot
55 - EvolvedBot
48 - Confused
Kredi
Kontrolöre yardımlarından dolayı Rainbolt ve Peter Taylor'a çok teşekkürler.