Dama Denetleyicisi


10

Bu zorluğun amacı, bir hamlenin yasal bir İngiliz Daması hamlesi olup olmadığını belirlemektir .

Bu meydan okuma 8x8 bir tahta kullanacak. Taşınan bir parça, sadece çapraz olarak ilerleyebilen bir adam (kral değil) olarak ele alınmalıdır. Tahtada 0 veya daha fazla siyah ve 1 veya daha fazla beyaz parça olacak. Şu anda bir beyaz parça hareket ediyor olacak. Doğrudan arkasındaki kare boşsa, beyaz parça çapraz olarak önündeki siyah bir parça üzerine "atlayabilir". Önünde çapraz olarak herhangi bir yönde başka bir siyah parça varsa bu konumdan daha fazla atlamak mümkündür. Yakalama zorunludur, bu nedenle mevcut bir atlama yapmamak yasadışıdır. Ancak, atlama sayısını en üst düzeye çıkaran bir yol almak zorunlu değildir. Temel olarak, bu bir atlama yaparsanız ve bitiş pozisyonundan başka bir olası atlama varsa o hareketin yasadışı olduğu anlamına gelir. Parça konumları aşağıdaki numaralandırma şemasını kullanır:

Dama Tahtası Numaralandırma


kurallar

girişler:

  • Siyah parçaları temsil eden sayıların listesi.

  • Beyaz parçaları temsil eden sayıların listesi.

  • Beyaz parça için başlangıç ​​pozisyonu

  • Beyaz parçanın bitiş konumu

Çıktı:

  • Hareket geçerliyse gerçek bir değer, aksi takdirde bir falsey değeri


Beyaz bir parçanın her zaman başlangıç ​​pozisyonunu işgal edeceğini varsayabilirsiniz.

Uygunsa, beyaz parça listesindeki ilk beyaz parçanın, giriş 3'ü kabul etmek yerine başlangıç ​​konumunu içerdiğini varsayabilirsiniz.

Standart kod golf kuralları. En az bayt kazanır.


Test Durumları

Bunu göstermek için, O başlangıç ​​pozisyonudur, X bitiş konumudur, B siyah parçalardır ve W beyaz parçalardır

Black pieces: []
White pieces: [5]
Move: (5, 1)
Output: True

Single move no jump
 X _ _ _
O _ _ _ 

B: [6]
W: [9]
M: (9, 2)
O: True

Single jump
 _ X _ _
_ B _ _ 
 O _ _ _

B: [2, 6]
M: (9, 2)
O: False

Illegal ending position on top of black piece
 _ X _ _
_ B _ _ 
 O _ _ _

B: [7, 14]
W: [17]
M: (17, 3)
O: True

Double jump
 _ _ X _
_ _ B _ 
 _ _ _ _
_ B _ _ 
 O _ _ _

B: [7, 14]
M: (17, 10)
O: False

Illegal jump, must take the next jump as well
 _ _ _ _
_ _ B _ 
 _ X _ _
_ B _ _ 
 O _ _ _

B: [4]
W: [8]
M: (8, 3)
O: False

Illegal jump across the board
 _ _ _ X
B _ _ _ 
 O _ _ _


B: [6, 7]
W: [6]
M: (10, 1)
O: True

Split decision p1
 X _ _ _
_ B B _ 
 _ O _ _

B: [6, 7]
M: (10, 3)
O: True

Split decision p2
 _ _ X _
_ B B _ 
 _ O _ _


B: [2]
W: [1]
M: (1, 3)
O: False

Sideways Jump
 O B X _

B: [6]
W: [1]
M: (1, 10)
O: False

Backwards Jump
 O _ _ _
_ B _ _ 
 _ X _ _

B: [6]
W: [9, 2]
M: (9, 2)
O: False

Illegal ending position on top of white piece
 _ X _ _
_ B _ _ 
 O _ _ _

B: []
W: [9, 6]
M: (9, 2)
O: False

Illegal jump over white piece
 _ X _ _
_ W _ _ 
 O _ _ _

B: [8, 15, 23, 24]
W: [27]
M: (27, 4)
O: True


Split decision long path
 _ _ _ X
_ _ _ B 
 _ _ _ _
_ _ B _ 
 _ _ _ _
_ _ B B 
 _ _ W _

B: [8, 15, 23, 24]
W: [27]
M: (27, 20)
O: True

Split decision short path
 _ _ _ _
_ _ _ B 
 _ _ _ _
_ _ B _ 
 _ _ _ X
_ _ B B 
 _ _ W _

3
Ben böyle bir test durumda önermek B=[8,15,23,24];W=[27]her biriyle M=[27,4]ve M=[27,20]o yönde bir değişiklik verecektir 1.. 2 bu soruya cevap verecek: ikisi de geçerli mi yoksa daha uzun süre alınmalı mı? ("Yakalama zorunludur, bu nedenle mevcut bir atlama yapmamak yasadışıdır") her ikisi de geçerli, ancak neden mümkünse yakalamamanızı yasadışı yaptığınızı bilmiyorum, belki belki mümkün olduğunca çok parça?)
Jonathan Allan

Üzgünüm (İngilizce) dama nasıl oynanacağını bilmiyorum . Yasal bir hareketin ne olduğu hakkında daha fazla ayrıntı eklemek ister misiniz?
tsh

1
İşte STDIN dostu biçimde test senaryolarının bir özeti .
Arnauld

Yakalama zorunludur, bu nedenle mevcut bir atlama yapmamak yasadışıdır. "zıpla" ne demek?
Outgolfer Erik

1
@JonathanAllan Sanırım açıklamada sorunuza değindim ve test senaryolarını ekledim.
aoemica

Yanıtlar:


1

Bu zorluydu :) * düzeltilen hatalar (bayt eklendi)

JavaScript (node.js) , 197 193 191 185 181 186 bayt

f=(B,W,S,E,F=1)=>g(S).filter((x,i)=>B[I="includes"](x)&!B[I](t=g(x)[i])&!W[I](t)&&t>0?F+=f(B,W,t,E):0)[0]?F>1:g(S)[I](E)
g=S=>[S--,!(y=~-(e=S-3)/4%2|0)||S%4^3?y?e+1:e:0,S%4||y?y?e:e-1:0]

Çevrimiçi deneyin!


Bunun >>2&1yerine kullanabileceğinizi düşünüyorum /4%2|0.
Arnauld

Testcase: [10, 3], [14], 14, 7başarısız oldu.
tsh

@tsh fixed :), daha fazla test örneği başarısız olursa bana bildirin
DanielIndie
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.