Bu meydan okuma, seçili bir dilde bir minimax işlevi yazmak , mevcut tahta durumu göz önüne alındığında bir NxN tic-tac-toe oyununda bir sonraki en iyi hamleyi çıkarmaktır . Kart girişi, bir Matris, 2D Koleksiyon veya sizin için anlamlı olan ancak kurallara uyan herhangi bir şey olarak kabul edilebilir . Olmanın çıkış sonraki en iyi hareket için çevirmek kim varsa şu anda nerede, X başladığı kabul edilir .
Minimax Algoritması Hakkında Hızlı Arka Plan
Minimax algoritmasının temel fikri, tüm olası sonuçları bir DAG olarak numaralandırmak ve daha sonra hamlelerin sırasının, yapılan ilk hamle ile anahtarlanan oyuncuya sağladığı fayda ile ağırlıklandırmaktır. Tüm olası sonuçlar daha sonra ilk hamleye göre `` kovalanır '' ve tüm sonuçların toplamına göre puanlanır (bir kayıp için -1, bir kravat için 0 ve bir galibiyet için 1). Birden fazla oyuncunun oynamasını gerektiren uygulamalarda, oyuncunun olası tüm hareketlerini ve rakiplerin olası tüm cevaplarını numaralandırırsınız. Örneğin, bir tic-tac-toe oyununda (ilk hamleden sonra) yapabileceğiniz 8 olası ilk hamle vardır ve sadece bir sonraki dönüşü analiz ederken hepsi eşit görünebilir. Ancak nihai sonuca yol açan her olası hamle kümesi için olası tüm sonuçları tekrarlayarak ve hepsini toplayarak,
Mini-max algoritmasının tic-tac-toe açısından daha iyi, daha derinlemesine ve içeriksel bir özeti için, burada daha fazlasını okuyun: http://neverstopbuilding.com/minimax
XKCD (Yalnızca 3x3 Çözümü)
Kurallar
- Herhangi bir dil kullanılabilir, ancak harici minimax kütüphanelerine izin verilmez.
- Çıktı bir sonraki en iyi hareketi gösteren bir koordinat (0-n, 0-n) veya bir sayı (1-n * n) olabilir.
- Buna ek olarak, en iyi durum senaryosunun ne zaman bir kazanç yerine bir kayıp veya beraberlik olduğunu belirleyebilmelisiniz.
- Kaybınızı veya kravatınızı belirtme şekliniz bir kez daha size kalmış.
- Girdi geleneksel X ve O'yu kullanmalı ve önce X hareketlerini varsaymalısınız; boş alanlar herhangi bir şeyle temsil edilebilir.
- Programınıza gelen herhangi bir girdinin n O ve n + 1 X'e sahip olduğunu varsayabilirsiniz, diğer bir deyişle iyi biçimlendirilmiş bir kart aldığınızı varsayabilirsiniz.
- Programın geçerli durumu, programınızın tek girişi olmalıdır, özyineleme kullanıyorsanız, giriş gereksinimlerini kolaylaştırmak için yardımcı yöntemler yapılmalıdır. Açıklama için /codegolf//a/92851/59376 adresine bakın .
- 10> = n> = 1 olan herhangi bir değer desteklenmelidir; Eğer programınız n> 10 için "zaman aşımına uğrarsa" bunu kabul edilebilir buluyorum, çünkü bazı diller önemli ölçüde daha düşük işlem gücüne sahiptir (Özellikle web'e bakan konsolları kullanarak).
YARGILAMAK
- Bu kod golfüdür, bu nedenle programın en düşük bayt sayısı kazanır ve standart boşluklar evrensel olarak izin verilmez.
- Beraberlik durumunda, en büyük 'n' yi destekleyen program kazanacaktır.
Örnek Girdiler
2x2
[[X,O]
[-,-]]
Çıktı: 2 veya [0,1] (3 veya [1,1] de tartışmalı olarak doğru olacaktır) (Kullandığınız biçimi kolayca açıklayabildiğiniz sürece, konumun bir tür göstergesi, keyfi)
3x3
[[X,O,X]
[O,X,-]
[-,-,-]]
Çıktı: -1 (Kayıp)
Bir kez daha istediğiniz herhangi bir giriş formatına izin verilir, ancak X'ler ve O'lar kullanılmalıdır, sağlanan örnekler sadece ilham vermek için bu formata sınırlama amaçlı değildi.