4x4 Hex'in Mükemmel Oyununu Oyna


10

Arka fon

Hex , K×Kaltıgen fayans eşkenar dörtgen üzerinde oynanan iki kişilik soyut bir strateji oyunudur . Eşkenar dörtgen iki karşıt taraf beyaz renklidir ve diğer iki siyah ve iki oyuncu, siyah ve beyaz, boş bir kiremit üzerine renklerinin bir token yerleştirerek sırayla alırlar. Renklerinin karşı tarafları arasında bir yol inşa etmeyi başaran oyuncu kazanır. Oyunun berabere bitemeyeceği ve ilk oyuncunun tahta boyutundan bağımsız olarak kazanma stratejisine sahip olduğu bilinmektedir (ayrıntılar için Wikipedia sayfasına bakın).

Görev

Bu meydan okumada, tahta boyutunu sabitleriz ve kartı K = 4aşağıdaki tablo olarak temsil ederiz . Kalın çizgiler bitişik karoları gösterir.

4x4 ızgara.

Göreviniz ilk oyuncu için siyah veya beyaz olmayı seçebileceğiniz bir kazanan strateji oluşturmaktır. Bu, rakip oyuncunun hangi yasal hamle yaparsa yapsın, oyunun bir zaferle sonuçlanması gerektiği anlamına gelir. Girişiniz bir oyun pozisyonudur (kartta jetonların düzenlenmesi) ve çıktınız aşağıda belirtilen biçimde yasal bir harekettir. Kendiniz kazanan bir strateji bulmak istiyorsanız, bu spoileri okumayın:

Birincisi, beyazın önce geldiğini varsayarak, olası bir kazanma stratejisinin ana hatlarını çizin. Önce 5'i seçin. Bundan sonra, 5'ten alt satıra giden bir yolunuz varsa VEYA siyah herhangi bir noktada 0 veya 1'i seçerse, 0 veya 1'den hangisinin boş olduğunu seçerek yanıt verin. Siyah 9 veya 13'ü seçerse, 10'u seçin ve 14 veya 15'ten hangisi boşsa. Siyah 9, 13 veya 14'ü seçmezse, 9'u ve sonraki 13 veya 14'ten hangisinin boş olduğunu seçin. Siyah 14'ü seçerse, 15'i seçerek yanıt verin. Ardından, boşsa 10'u seçin; siyah 10'u seçerse, 11 ile cevap verin. Eğer siyah 6'yı seçerse, 7 ile cevap verin ve bir sonraki 2 veya 3'ten hangisi boşsa. Siyah 6'yı seçmezse, onu seçin, böylece 5'ten alt satıra giden bir yolunuz vardır.

Giriş ve çıkış

WBEGirişiniz, beyaz, siyah ve boş olan 16 karakterlik bir dizedir . Yukarıda sayıldığı gibi tahta karolarını temsil ederler. Aşağıdakilerden giriş yöntemini (çıkış yönteminizi de belirler) seçebilirsiniz:

  1. STDIN'den giriş, STDOUT'a çıkış.
  2. Bir komut satırı argümanı olarak giriş yapın, STDOUT'a çıkış yapın.
  3. 16 tek karakterlik komut satırı argümanı olarak giriş yapın, STDOUT'a çıkış yapın.
  4. Adlandırılmış işlevin bağımsız değişkeni olarak giriş, dönüş değeri olarak çıkış.

Çıktınız, sonraki sıranızı yerleştirdiğiniz döşemeyi temsil eder, çünkü taşıma sırası sizde olur. Aşağıdaki çıktı biçimleri arasından seçim yapabilirsiniz:

  1. Sıfır tabanlı bir dizin (yukarıdaki resimde kullanılan şekilde).
  2. Tek tabanlı bir dizin.
  3. Girdi dizesi, Ehangisinin yerini alırsa Wveya Boynatıcınız için hangisini seçerseniz seçin.

kurallar

Stratejiniz deterministik olmalıdır. Stratejinizi kullanarak boş tahtadan erişilemeyen oyun pozisyonlarını veya her iki oyuncu için zaten kazanmış olan pozisyonları doğru bir şekilde ele almanız gerekmez ve bunlara çarpabilirsiniz. Tersine, stratejinizi kullanarak ulaşılabilen panolarda yasal bir hamle yapmalısınız.

Bu kod golf, bu yüzden en düşük bayt sayısı kazanır. Standart boşluklara izin verilmez.

Test yapmak

Girişleri doğrulamak için bir Python 3 denetleyicisi yazdım, çünkü elle yapmak çok sıkıcı olurdu. Burada bulabilirsiniz . İlk üç giriş biçimini ve Python 3 işlevlerini (diğer dillerdeki işlevlerin programlara sarılması gerekir), her üç çıkış biçimini ve her iki oynatıcıyı destekler. Eğer bir strateji kazanmıyorsa, bulduğu kaybedilen bir oyunu çıkarır, böylece programınızı değiştirebilirsiniz.


Bu zorluk bana hesap makinesi programları yazarken tic tac toe AI sıkıştırmaya çalıştığımı hatırlatıyor. ticalc.org/archives/files/fileinfo/354/35408.html
Sparr

2
Incorrect response 'WWWWWWWWBBBBBBBB' to message 'WWWWWWWWBBBBBBBB'.Uzun zaman önce kazanmış olmalıydım, yoksa yanılıyor muyum?
Sebastian Höffner

@ SebastianHöffner Denetleyicide bir hata gibi görünüyor. Zamanım olduğunda tamir etmeye çalışacağım.
Zgarb

@ SebastianHöffner Hata düzeltildi.
Zgarb

Yanıtlar:


6

Marbelous, 973b

Bu, söz konusu ipucu stratejisinin naif bir uygulamasıdır. Kartın 16 komut satırı / anakart parametresi gibi sağlanmasını bekler ve hex.mbl B W E E E W E E E B E E E E E Ebeyazın bir sonraki hareketinin sıfır endeksli konumunu verir.

00 }1 }0
&G B? W!
&0 &G &G
!!
00 }0 }1
&H B? W!
&1 &H &H
!!
.. }D .. }9 }9 }D }E }A }D }9 }A .. }E }F }5
}9 B! }E E? W? E? .. E? B? B? W? .. E? .. E?
B! ?0 B! &M &N &O E? &I \\ .. &J .. &K E? &5
?0 ++ ?0 &9 .. &D &P &A &I /\ &J .. &E &L !!
++ .. ++ !! .. !! &E !! \/ &L /\ &K !! &F
\\ .. // .. .. .. !! .. .. \/ .. \/ .. !!
.. =3 \/
&M /\ &N
\/ &O /\ &P
}0 }1 }6 .. }6 .. }7 &7 }2 }3 }A }A }B }E }F
..
..
..
..
..
..
..
..
..
.. .. .. .. .. .. .. .. .. .. .. .. .. B? W!
.. .. .. .. .. .. .. .. .. .. .. .. .. &Q &Q
.. .. .. .. B? .. E? W? E? .. E? B? E? &F \/
.. .. .. &S /\ &T &S &T &U E? &A &R &R !!
.. .. .. &7 .. .. \/ .. &2 &V !! &B \/
.. .. .. !! .. .. &U /\ &V &3 .. !!
.. .. .. .. .. .. .. .. .. !!
.. .. ..
.. .. E?
E? .. &6
&X E? !!
!! &Y
.. !!
}4 }8 }C
\/ \/ \/
30 30 31 31 32 33 35 36 37 39 31 30 31 31 31 33 31 34 31 35
&0 &X &1 &Y &2 &3 &5 &6 &7 &9 &A &A &B &B &D &D &E &E &F &F
:W?
}0
^4
=1
{0
:B?
}0
^0
=0
{0
:E?
}0
^1
=0
{0
:W!
}0
^4
=0
{0
:B!
}0
^0
>0
{0

Ben muhtemelen daha iyi dallanma ve kod yeniden kullanım ortadan kaldırılması ile bu yaklaşık 200 karakter golf olabilir düşünüyorum.


16 komut satırı argümanı seçeneğini ekledim ve doğrulama komut dosyasını güncelledim, böylece bu çözüm test edilebilir.
Zgarb

Marbelous +1 (PPCG bu karakterleri eklemenin yorumu geliştirdiğini düşünüyor)
Rohan Jhunjhunwala

1

Python 3, 100b

b=input()
i=b.find('B')
if b[i]in'BW'and'E'in b:i-=1+(b[i-1]is'W')*4
print((b[:i]+'B'+b[i+1:])[:16])
  • Oyuncu: BLACK
  • Yöntem: STDIN / STDOUT, MODIFIED_BOARD

Strateji önce Btahtada bir arama yapmaktır. Hiçbiri yoksa, bu geri döner -1, python ile aynıdır last index. Böylece boş bir tahtada ilk endeksim, index=-1hareket etmeye başladığım yer olacak.

Solumdaki ( index-1) alan boşsa, bir sonraki hamlem oraya gider. Eğer alınırsa, sola giderim. Asla yukarı çıkmam gerekmiyor: eğer yaparsam tempoyu kaybederim ve oyunu kaybederim.

Tam tahtada (hiçbir Eyerde) hareket etmiyorum.

printİlk başta biraz garip görünüyor: (Ben dilimleme yoluyla yapmak) ama sonra 16 karakter kesip gereken yeni yönetim kurulu oluşturmak zorundayız. Bu bir emanet çünkü olumsuz endekslerle çalışıyorum ve b[i+1:]böylece delik tahtasını ve beklediğim geri kalanını geri getireceğim, geri kalanını kesmeyi önemli hale getiriyorum. Başka bir yol da pozitif endekslerle çalışmak olabilirdi, örneğin alarak (b.find('B')+16)%16, ama (+16)%16bir bayt daha fazla ()[:16].

Ungolfed:

board = input()
index = board.find('B')
if board[index] in 'BW' and 'E' in board:
    index -= 1 + (board[index-1] is 'W') * 4
print((board[:index] + 'B' + board[index+1:])[:16])

Ölçek

Onaltılık denetleyici test paketini çalıştırırken garip bir davranışla karşılaştım:

OUT: EEEEEEEEEEEEEEEB
OUT: WEEEEEEEEEEEEEBB
OUT: WWEEEEEEEEEEEBBB
OUT: WWWEEEEEEEEEBBBB
OUT: WWWWEEEEEEEBBBBB
OUT: WWWWWEEEEEBBBBBB
OUT: WWWWWWEEEBBBBBBB
OUT: WWWWWWWEBBBBBBBB
OUT: WWWWWWWWBBBBBBBB

Incorrect response 'WWWWWWWWBBBBBBBB' to message 'WWWWWWWWBBBBBBBB'.

Bence ya 4. turdan sonra kazanmalıydım ya da aynı kurulla tam bir panoya cevap vermem doğru bir yanıt olmalı. Ne yanlış gidiyor emin değilim, çok daha derin dalış vermedi - Ben sadece tüm "özel" vakaları kapalı var mı kontrol etmek istedim. Ama birinin uzay 4'te başladığı durumları örtmek zorunda olmadığım için, bunun önemi yok.

85b

Ancak, eğer kendimi tam bir tahta kontrol etmem izin verirseniz (yani dışarıda bırakarak 'E' in bsadece 85 bayt kullanmak için kodu basitleştirebilirsiniz:

b=input();i=b.find('B')
if i!=-1:i-=1+(b[i-1]is'W')*4
print((b[:i]+'B'+b[i+1:])[:16])

Bu yine de aşağıdakilere yol açacaktır:

Incorrect response 'WWWBWWWWBBBBBBBB' to message 'WWWWWWWWBBBBBBBB'.

Bu sayılabilir ya da sayılmayabilir ve geçerli bir hamle olmadığını bulduğumdan daha uzun ama daha doğru cevabı almaya karar verdim.

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.