Dama: Kral Beni?


14

Meydan okuma:

Bir dama tahtası verildiğinde, mümkünse kırmızı bir parçayı krallamak için alacağı en küçük hareket miktarını (siyahın hiç hareket etmediğini varsayarak) çıktılayın.

Kurallar :

Red'in tarafı her zaman altta olacak, ancak parçaları herhangi bir sırada başlayabilir (kralın sırası bile almaları gerekir). Siyah parçalar sabittir , yani kırmızı hareketler arasında hareket etmezler, ancak yakalandığında tahtadan çıkarılırlar. Parçaların , yan yana da dahil olmak üzere tahtadaki herhangi bir alanda başlayabileceğini unutmayın . Normal dama bu şekilde oynanmaz, ancak programınız bunları çözebilmelidir. (Bkz. Giriş 5) Ancak, denetleyici parçaları yalnızca çapraz olarak hareket etmelidir (bkz. Giriş 3). İlk yakalama zincirde öne doğru çıkarsa geriye doğru yakalamaya izin verilir (bkz. Giriş 7).

Giriş:

Aşağıdaki karakterler olarak tanımlanan tahta boşlukları olan 8x8 dama tahtası (tutarlı oldukları sürece alternatifleri kullanmaktan çekinmeyin):

. - Boş

R - Kırmızı parça (lar)

B - Siyah parçalar

Çıktı:

En az sayıda hamle, tahtanın en üst satırında kralın sırasına (siyah taraf), hiçbir hamle gerekmiyorsa (kralın satırında kırmızı bir parça başlar) girerek kırmızı bir parçayı 'krallaştırmak' alacaktır veya kırmızı bir parçayı krallamak imkansızsa negatif bir sayı (yani, siyah ilk satırın tamamını kaplar).

Giriş 1:

. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
R . . . . . . .

Çıkış 1:

7

Giriş 2:

. . . . . . . .
. . . . . . . .
. . . . . B . .
. . . . . . . .
. . . B . . . .
. . . . . . . .
. B . . . . . .
R . . . . . . .

Çıkış 2:

2

Giriş 3:

. B . B . B . B
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
R . . . . . . .

Çıkış 3:

-1

Giriş 4:

. . . . . . . R
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
R . . . . . . .

Çıkış 4:

0

Giriş 5:

. . . . . . . .
. . . . . . . .
. . . . . . . .
. B . . B . . .
B . . . . B . .
. B . B . . . .
. . B . . B . .
. . . R R . . .

Çıktı 5:

4

Giriş 6:

. . . . . . . .
. . . . . . . .
. B . . . . . .
. . B . . . . .
. B . B . . . .
. . . . R . . .
. . . B . . . .
. . . . R . . .

Çıkış 6:

2

Giriş 7:

. . . . . . . .
. . . . . . . .
. . B . . . . .
. . . . . . . .
. . B . . . . .
. B . B . B . .
. . . . B . . .
. . . . . R . R

Çıktı 7:

4

puanlama:

Bu , bayt en kısa kod kazanır.


1
Çift / üçlü zıplayabileceğiniz için ikinci test durumu 2 olmamalı mı?
James

Durum tamsayı dizileri dizisi TAMAM mı?
Jonathan Allan

1
Zor olması gereken başka bir test çantası ekledim. Mümkün olan en iyi çözümü elde etmek için çoklu sıçramalar, çoklu parçalar ve geriye doğru atlamayı içerir.
orlp

1
@orlp Hm, kırmızı parçaların hiçbirinin geriye doğru hareket etmesine izin verilmediğini söyleyecektim, çünkü hiçbiri kral değildir (bu nedenle meydan okuma noktası), ancak bazı insanlar geriye doğru çekilmenin ilk ele geçirme ileri sürülürse kralları parçaladı. Daha önce farkında olmadığım için bunu kurallara ekleyeceğim.
Yodle

1
ooooooooh, sadece bir kırmızı parça seçmek zorunda değilsin, takım kurabilirler! Anladım
Greg Martin

Yanıtlar:


4

JavaScript (ES6), 354 322 bayt

Bir diziyi girdi olarak alır:

  • 0 = boş kare
  • 1 = kırmızı parça
  • 2 = siyah parça

Optimal hareket sayısını veya çözüm yoksa 99 değerini döndürür.

Çok hızlı ama çok daha fazla golf olabilir.

F=(b,n=0,C=-1,i)=>b.map((v,f,X,T,x=f&7,y=f>>3)=>v-1||(y&&n<m?[-9,-7,7,9].map(d=>(N=c=X=-1,r=(d&7)<2,T=(t=f+d)>=0&t<64&&(x||r)&&(x<7||!r)?(!b[t]&d<0)?t:b[t]&1?N:b[t]&2&&(d<0&y>1|d>0&C==f)?(X=t,x>1||r)&&(x<6|!r)&&!b[t+=d]?c=t:N:N:N)+1&&(b[f]=b[X]=0,b[T]=1,F(b,n+!(C==f&c>N),c,1),b[f]=1,b[X]=2,b[T]=0)):m=n<m?n:m),m=i?m:99)|m

var test = [
  [ 0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    1,0,0,0,0,0,0,0
  ],
  [ 0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,2,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,2,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,2,0,0,0,0,0,0,
    1,0,0,0,0,0,0,0
  ],
  [ 0,2,0,2,0,2,0,2,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    1,0,0,0,0,0,0,0
  ],
  [ 0,0,0,0,0,0,0,1,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    1,0,0,0,0,0,0,0
  ],
  [ 0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,2,0,0,2,0,0,0,
    2,0,0,0,0,2,0,0,
    0,2,0,2,0,0,0,0,
    0,0,2,0,0,2,0,0,
    0,0,0,1,1,0,0,0
  ],
  [ 0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,2,0,0,0,0,0,0,
    0,0,2,0,0,0,0,0,
    0,2,0,2,0,0,0,0,
    0,0,0,0,1,0,0,0,
    0,0,0,2,0,0,0,0,
    0,0,0,0,1,0,0,0
  ],
  [ 0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,2,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,2,0,0,0,0,0,
    0,2,0,2,0,2,0,0,
    0,0,0,0,2,0,0,0,
    0,0,0,0,0,1,0,1
  ]
];

test.forEach((b, n) => {
  console.log("Test #" + (n + 1) + " : " + F(b));
});


99 muhtemelen iyi, 8x8 tahtada 99 hamle yapan gerçek bir çözüm düşünemiyorum. İyi iş!
Yodle
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.