Bir sonraki hamlen nedir?


18

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ü)

3x3 tic-tac-toe oyunu için tüm olası hamle.

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.


Üzgünüm DJMCMayhem, aslında bunları etiketlemeye çalıştım ama yapamadım, burada yeni olduğum için.
Sihirli Ahtapot Urn

Bonus da kaldırıldı, tedium'dan başka bir şey eklemedi.
Sihirli Ahtapot Urn

Aşağıdaki çıkış formatına izin veriliyor mu: orijinal olarak boş olan her boş alanda tahta konumunun bir diyagramı, orada oynamanın bir kazanma / kayıp / berabere (örneğin W, L ve D) yol
açıp açmadığını

1
3x3 örneğinde, O ne oynarsa oynasın kaybetmelidir, ama çıktının [2,1] olması gerektiğini söylüyorsunuz, neden böyle?
Dada

Düzenlendi, iyi yakaladım. Ne düşündüğümü bilmiyorum, olumsuz örnek buydu.
Sihirli Ahtapot Urn

Yanıtlar:


8

Perl, 101 98 bayt

içerir +4için-0p

STDIN üzerindeki giriş ile çalıştırın

tictactoe.pl
OXO
---
--X
^D

Çıktı aynı diyagramdır, ancak durumuyla güncellenen her hareketle 1bir kazanmayı 2temsil eder, bir çekilişi 3temsil eder ve bir kaybı temsil eder. Bu dava için

OXO
223
21X

3 hamle beraberlik, 1 galibiyet ve 1 kaybeder (bu çıktı formatı kabul edilemez ise çözümü güncelleyeceğim, ancak temel kod aynı kalacaktır)

tictactoe.pl:

#!/usr/bin/perl -0p
m%@{[map"O.{$_}"x"@-"."O|",1-/.(
)(.)/,@-]}Z%sx||s%-%$_="$`X$'";y/XO/OX/;do$0%eg?/1/?3:1+/2/:2

Bu zaten acı verici bir şekilde yavaştır ve boş 3 * 3 kartı için çok fazla bellek kullanır (neden, özyineleme o kadar derine inmez. Bellek sızıntısı olmalı). Memoize eklemenin maliyeti 6 bayttır, ancak çok daha zordur:

#!/usr/bin/perl -0p
$$_||=m%@{[map"O.{$_}"x"@-"."O|",1-/.(\n)(.)/,@-]}Z%sx||s%-%$_="$`X$'";y/XO/OX/;do$0%eg?/1/?3:1+/2/:2

Vay be, pl ve büyük olasılıkla kesinlikle boşluğu çok n = 10 için çalıştırmak olmaz bakan ... Birisi görmek umuyordum her iki şeyi yaptım. Bir dize girdisi ve yalnızca en iyiyi değil, tüm hareketlerin sonucunu eşleme. Bravo.
Sihirli Ahtapot Urn

Bir özyinelemeli işlev 'sızıntı' varsa nasıl olabilir ??? Çok yüksek dil, CPU'daki 32 bit kaydını görmüyor (veya basit talimatta olduğu gibi)
RosLuP

@RosLup Bu bağlamda sızıntı mutlaka ulaşılamaz kayıp hafıza anlamına gelmez. Perl, hafızayı serbest bıraktığında oldukça tuhaftır, bunu genellikle beklediğinizden daha sonra yapar ve böylece beklediğinizden çok daha fazla bellek kullanır. Ayrıca, veri yapılarınızı büyüteceğiniz beklentisiyle doğrudan ihtiyaç duyulandan fazlasını tahsis etme eğilimindedir. Bu durumda kötüye do$0kullanmak yerine bir işlevle "normal" özyineleme kullanmak 10 kat daha az bellek kullanır. Dikkat edin, bu durum o kadar aşırı ki, gerçek bir bellek sızıntısı olabilir.
Ton Hospel

Sadece biri kayıtları veya temel talimatları (hlls talimatlarından) görmek değil, hafıza kullanımı kontrolünü kaybetmek ... Benim için ölçek değil ...
RosLuP

Yeterince uzun sürdü, adamımı kazandın, üzgünüm ama daha fazla girişimde bulunmadık.
Sihirli Ahtapot Urn

2

JavaScript (ES6), 320 294 bayt

(b,p,d,M,S=-2)=>(T=(p,q,r,s)=>b[p][q]==(n=b[r][s|0])&&n!='-',w=0,b.map((r,y)=>(l=r.length-1,m=15,r.map((c,x)=>(m&=8*T(l-x,x,l)+4*T(x,x,0)+2*T(x,y,0,y)+T(y,x,y))),w|=m)),w?-1:(b.map((r,y)=>r.map((c,x)=>S<1&&c=='-'&&(r[x]='O.X'[p+1],(s=-f(b,-p,1))>S&&(S=s,M=[x,y]),r[x]=c))),S=S+2?S:0,d?S:[M,S]))

Giriş

1) Geçerli kartı açıklayan bir dizi karakter dizisi, örneğin:

[['X', '-'], ['-', 'O']]

2) Geçerli dönüşü açıklayan bir tam sayı: 1 = X, -1 =O

Çıktı

Şunlardan oluşan bir dizi:

  • [x, y]biçimdeki en iyi hamleyi tanımlayan bir dizi
  • Oyunun sonucu bir tamsayı olarak: 1 = kazan, -1 = kayıp, 0 = kravat

Misal

Aşağıdaki örnekte Xoynayarak kazanacağınız garanti edilmektedir [1, 2].

let f =
(b,p,d,M,S=-2)=>(T=(p,q,r,s)=>b[p][q]==(n=b[r][s|0])&&n!='-',w=0,b.map((r,y)=>(l=r.length-1,m=15,r.map((c,x)=>(m&=8*T(l-x,x,l)+4*T(x,x,0)+2*T(x,y,0,y)+T(y,x,y))),w|=m)),w?-1:(b.map((r,y)=>r.map((c,x)=>S<1&&c=='-'&&(r[x]='O.X'[p+1],(s=-f(b,-p,1))>S&&(S=s,M=[x,y]),r[x]=c))),S=S+2?S:0,d?S:[M,S]))

console.log(JSON.stringify(f(
  [['O','X','O'],
   ['-','-','-'],
   ['-','-','X']],
  1
)));

BİR STRANGE OYUNU. SADECE KAZANAN TAŞI OYNAMAZ.
GÜZEL BİR SATRANÇ OYUNU NASIL?


Aferin, iyi ilk giriş. Sadece sahip olduğum açıklamalar, verilen 'X her zaman önce hareket eder' bilgisiyle bayt kaydetme potansiyeli vardır. Ve 3x3 olmayan bir tahta ile denediniz mi;)?
Sihirli Ahtapot Urn

@carusocomputing - 'X her zaman önce hareket eder' ile ilgili düşüncelerinizi anladığınızdan emin değilsiniz. Sadece tahta göz önüne alındığında hangi tarafın hareket halinde olduğunu bulmak için kullanılabilir, ancak aslında daha fazla bayt maliyeti olan hesaplama; sanırım başka bir şeyden bahsediyorsunuz. Ve evet, biraz daha büyük tahtalarla bazı testler yaptım. Beklendiği sürece ... err ... çok fazla boş pozisyon yok. :-)
Arnauld

Zorluk diyor The current state of the board must be the only input to your program. Kodunuzun, bu kuralı ihlal eden iki girişe ihtiyacı vardır.
Dada

1
@Dada - Ben bunu merak ediyordum ama aktif renk varsayılır ise kurulu bir devletin parçası (sadece bir satranç pozisyonu gibi hep tr passant kare + rok kullanılabilirliği aktif renk + ile gelir). Yani sanırım OP bu noktayı açıklığa kavuşturmalı. (Ve eğer haklıysanız, bu gereksiz bir ek zorluk gibi görünüyor, IMHO.)
Arnauld

1
Mmm .. cevabında yönetim kurulu devletinin açıklamasını gerçekten seviyorum. Bunu düşünerek, bazı diller sadece giriş olarak dizeleri kullanabilir, XXOOXO-OO gibi bir panoya sahip olmak, pano boyutları gibi ek bilgiler olmadan düşük bayt sayısında deşifre etmek zor olurdu. Yönetim kurulu durumuna katkıda bulunan ek girdilere izin vereceğim, ancak yine de 'X'in önce hareket ettiğini varsayın' bilgisinin 'kimin döndüğünden' farklı olduğunu düşünüyorum. Bazı diller bundan bir varsayım olarak faydalanacaktır;).
Sihirli Ahtapot Urn
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.