Connect 4 kazananını belirle


19

Kısmen doldurulmuş bir Connect 4 ızgarası (7x6) verilir.

O X             
O X          
X O X O     O
X O X O   X X
O X X X O O X
O O O X X O X

(Giriş 1D veya 2D dizi olarak ve harfler veya sayılar vb. Olarak verilebilir.)

Varsayalım

  • X oyuna başladı.
  • Henüz kimse kazanmadı.
  • Oyuncular şimdiye kadar iyi oynamamış olabilirler, ancak şimdi ikisi de en uygun stratejileri kullanacak.
  • Giriş ızgarası hatalı.

Hangi oyuncunun kazandığını (veya berabere) gösteren tek bir değer çıkarmalısınız

Kod golf meydan; en kısa kod kazanır. Programınızın çıktıyı makul bir sürede gerçekte hesaplaması gerekmez, ancak çıktının sınırlı bir süre içinde doğru bir şekilde elde edileceğini kanıtlayabilmelisiniz.



@ MartinBüttner Bu, aşağı indirileceğim anlamına mı geliyor yoksa sorumu burada bırakmak doğru mu?
ghosts_in_the_code

4
Bu sadece soruların ilişkili olduğu, başka bir şeyin olmadığı, daha azının olmadığı anlamına gelir. Bağlantıyı yayınlamanın amacı, birbirlerinin "Bağlantılı" kenar çubuğunda karşılaşılan zorlukların ortaya çıkmasıdır, böylece insanlar ilgili zorlukları daha kolay bulabilirler. Sorunuzu bir kopya olarak görseydim, bunu söylerdim (ya da kapattım), endişelenmeyin. :)
Martin Ender

2
"Optimal play" iyi tanımlanmış mı? Öyleyse, optimum oynatma için algoritmayı tanımlayan bir bağlantı sağlayabilir misiniz?
Rainbolt

2
Bu edilmiş @Rainbolt çözüldü ve orada mevcut mükemmel algoritmalar da. Daha fazla bilgi için Wikipedia'yı okuyun .
ghosts_in_the_code

Yanıtlar:


16

Perl, 119 118 117 bayt

İçin +4 içerir -0p

STDIN üzerindeki boşluklarla doldurulmuş döndürülmüş tahta verin (yerçekimi taşları sağa çeker)

connect4.pl
  OXXX
   XOO
    OX
  OOXX
  XXXO
XXOOXO
OOXXOO
^D

connect4.pl:

#!/usr/bin/perl -p0
y/XO/OX/if$^S|y/X//>y/O//;$_=$$_||=/Z@{[map"|O".".{$_}O"x3,0,5..7]}/sx||s% (?! )%$_="$`X$'";do$0%eg?/1/?3:1+/2/:2

3Hareket ettirilecek oyuncunun kazanıp kazanamayacağını, 1hareket ettirilen oyuncunun kaybedip 2beraberlik için yazdırır .

Daha eski perlslerde ^Sbir bayt kazanmak için değişmez bir kelime kullanabilirsiniz . Aşırı verimsizliğin bir sakıncası yoksa $$_||=(transpozisyon tablosu) dışında kalabilir ve 6 bayt daha kazanabilirsiniz. Dışarıda bırakırsanız $_=, sonuç yerine nerede oynayacağınızı gösterecektir ( 1eğer varsa oynayın ve kazanın, varsa oynayın 2ve çizin ya da herhangi birinde oynayın 3ve kaybedin)

Tam bir minimax ağacı oluşturur ve değerlendirir. Kart zaten yeterince iyi doldurulmadıkça bellek ve zamanınız bitecek.


2
Neden birileri yere indirdi? Golf gerçekten şaşırtıcı (perl ile golf ve böyle bir çözüm elde etmek son derece zordur - bu kod ile gelmiş olabilir biliyorum başka bir perl golfçü emin değilim). Ve kod gerekli davranışa sahiptir.
Dada

Bu beynimi incitir. 1!
levelonehuman

@Dada bu cevabın oy kullanmadığını nereden biliyorsunuz? 3 oy olarak görüyorum ...
RosLuP

@RosLuP Bu gönderiyi ilk gördüğümde, 1 downvote vardı. Ayrıca, yeterli sayıda temsilciniz olduğunda, bir gönderinin kaç yukarı ve aşağı oyu olduğunu görebilirsiniz: bu durumda, şimdi 4 yukarı ve 1 aşağı vardır.
Dada
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.