Mayın Tarlası Çözücü


34

Mayın Tarlası tarlalarını oluşturduk , ancak birisinin PCG patlamasından önce bu mayınları taraması gerekiyor!

Göreviniz , “Çalışma Mayın Tarlası” nın kabul edilen çözümünün biraz değiştirilmiş bir sürümüyle uyumlu bir Mayın Tarlası Çözücü yazmaktır (eylemler, daha büyük alanlara izin vermek için boşluklarla ayrılmıştır).

Giriş: Bir Mayın Tarlası alanı, boşluklarla ayrılmış alanlar. İlk satır toplam mayın sayısını gösterir.

  • x: El değmemiş
  • !: Bayrak
  • Rakam: Bu alanın etrafındaki mayın sayısı

Örnek:

10
0 0 1 x x x x x
0 0 2 x x x x x
0 0 2 ! x x x x
0 0 1 2 x x x x
0 0 0 1 x x x x
1 1 0 2 x x x x
x 1 0 2 x x x x
1 1 0 1 x x x x

Çıktı: Biçimdeki bir sonraki adımınız action row column(sıfırdan başlayarak)

Geçerli Eylemler:

  • 0: Aç onu
  • 1: Bir bayrak yerleştirin

Örnek:

0 1 2

Kurallar:

  • Giriş olarak tek bir alan alan (STDIN veya komut satırı argümanları) tek bir eylem (STDOUT) veren eksiksiz bir program yazıyorsunuz. Bu nedenle, hariç durumları kaydedemezsiniz !.
  • Seçiminiz hayatta kalmak için en iyi oranları takip etmeli. (yani% 100 güvenli bir hareket varsa, al)
  • Bu ; en kısa çözüm (UTF-8 baytlarda) kazanır

Testler:

Bu testler, ortak net durumlar için test etme amacına hizmet eder; Programınız her test alanı için çalışmalıdır.

İçinde:

4
x x x x
1 2 x x
0 1 2 x
0 0 1 x

Dışarı (bunlardan herhangi biri):

1 1 2
0 0 2
0 1 3

İçinde:

2
x x x
1 ! x
1 1 x

Dışarı (bunlardan herhangi biri):

0 0 0
0 0 1
0 1 2
0 2 2
1 0 2

İçinde:

10
x x x x x x x x
1 3 3 x x x x x
0 1 ! 3 3 4 x x
0 2 3 ! 2 3 x x
0 1 ! 2 2 ! x x

Dışarı (bunlardan herhangi biri):

1 1 5
1 0 2

İçinde:

2
x x x
2 3 1
! 1 0

Dışarı (bunlardan herhangi biri):

0 0 1
1 0 0
1 0 2

Güzel! 1) Belki birisini test etmek için bir test demeti yazmalıdır: bir alan verilirse, atılan her adımı ve programın kazanıp kazanmadığını yazdırır. Program herhangi bir belirsizlik olmadan haritalarda kazanmalıdır. 2) Bayrak eylemini birisinin kullanıp kullanmayacağını merak ediyorum. Asla gerekli olmamalı gibi görünüyor.
Claudiu

İlk test için. Neden 0 0 2veya ile hareket edebiliyorsun 0 1 3? Bunlardan birinin nasıl güvenli sayılacağını göremiyorum. (Mayın
tarlasında

1
Muhtemelen Fveya Pdaha iyi bayrak görünüyor !:)
VisioN

1
@JonathanVanMatre Alan boştur, ancak ilk açılıştan sonra mayın olmadığı garantilidir, çünkü madenler ilk tıklanmadan sonra yerleştirilir :)
TimWolla

2
Eğlenceli gerçek: Sadece sınırlı sayıda pano mevcuttur (en azından rekabetçi sahnede kanon olan XP versiyonunda). Bir madeni tıklatmadığınızdan emin olmak için ilk noktaya tıkladığınızda tahta kaydırılır, ancak bunun dışında hangi tahtayı kullanacağınıza karar verilir.
undergroundmonorail

Yanıtlar:


17

Mathematica

Hala golf oynamam. G / Ç formatlarında biraz daha çalışılması gerekiyor.

t = {{0, 0, 1, x, x, x, x, x}, {0, 0, 2, x, x, x, x, x}, {0, 0, 2, F, x, x, x, x}, 
     {0, 0, 1, 2, x, x, x, x}, {0, 0, 0, 1, x, x, x, x}, {1, 1, 0, 2, x, x, x, x}, 
     {x, 1, 0, 2, x, x, x, x}, {1, 1, 0, 1, x, x, x, x}};
(*Sqrt[2] is  1.5*)
c = Sequence; p = Position;
nums = p[t, _?NumberQ];
fx = Nearest[p[t, x]];
flagMinus[flag_] := If[Norm[# - flag] < 1.5, t[[c @@ #]]--] & /@ nums
flagMinus /@ p[t, F];
g@x_List := Tr[q[#] & /@ x]
eqs = MapIndexed[t[[c @@ (nums[[#2]][[1]])]] == g[#1] &, (fx[#, {8, 1.5}] & /@nums)];
vars = Union@Cases[eqs, _q, 4];
s = Solve[Join[eqs, Thread[0 <= vars < 2]], vars, Integers];
res = (Transpose@s)[[All, All, 2]];
i = 1; plays = Select[{i++, #[[1]], Equal @@ #} & /@ res, #[[3]] &];
Flatten /@ ({#[[2]] /. 1 -> F, List @@ vars[[#[[1]]]] - 1} & /@ plays)

(*
{{0, 0, 3}, {F, 1, 3}, {F, 2, 4}, {0, 3, 4}, {0, 4, 4}, 
 {F, 5, 4}, {F, 6, 0}, {F, 6, 4}, {0, 7, 4}}
*)

Düzenleme: Bonus Track

Belirli bir konfigürasyon için olası tüm çözümleri hesaplayarak bomba olasılıklarını hesaplayan etkileşimli bir oyun alanı oluşturdum:

Mathematica grafikleri

Mathematica kurulmadan test etme talimatları:

  1. Http://pastebin.com/asLC47BW indirin ve * .CDF olarak kaydedin
  2. Ücretsiz CDF ortamını https://www.wolfram.com/cdf-player/ adresindeki Wolfram Research'ten indirin (küçük bir dosya değil)

Sürgü tahta ölçülerini değiştirir. Bu tam olarak test edilmemiş, sadece kabataslak bir programdır, lütfen herhangi bir hata bildirin. "Gemide bulunan toplam bomba sayısı" özelliğini uygulamadım. Sonsuz olarak kabul edilir.

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.