Satranç tahtası labirent


14

Satranç taşları (krallar, kraliçeler, kaleler, piskoposlar ve şövalyeler) ve piyonlar tahtadadır, ancak a1 veya h8 meydanında değildir. Göreviniz boş gelen seyahat etmektir a1 boş için h8 sadece boş kareler geçerken, kareler. Hareket kuralları aşağıdaki gibidir:

  1. Herhangi bir boş kareden yanındaki herhangi bir boş kareye ilerleyebilirsiniz (aynı sıralama, sonraki veya önceki dosya; veya aynı dosya, sonraki veya önceki sıralama).
  2. Eğer, (bir sonraki veya önceki seviye bir sonraki veya önceki dosyası) çapraz olarak bir sonraki boş bir kare için bir boş kare ilerleyebileceğimizle Resim sinsi köşe kareler birini içeren, (a), iki piyonu veya ters (b) piyonu / adet renk. (Aynı renkteki iki piyon olmayan parça veya piyon olmayan bir parça ve piyon, ilerlemenizi köşede engelleyecek kadar güçlüdür, ancak iki piyon değildir; ve karşıt renkteki parçalar / piyonlar çalışmıyor Örneğin, c4 ve d5'te boşsanız , c5 ve d4 piyonlar veya karşıt renkte parçalar / piyonlar içeriyorsa , buna devam edebilirsiniz . Resimler için aşağıdaki "Örnek köşegenler" bölümüne bakın.

Giriş

FEN'in yönetim kurulu açıklaması. Yani: girdi, sıra 8'in bir açıklamasını , bir eğik çizgi ( /), sıra 7'nin bir açıklamasını , bir eğik çizgi,… ve sıra 1'in bir açıklamasını içeren bir dize olacaktır . Her bir rütbenin tanımı, a dosyasından h dosyasına kadar olan sayıları ve harfleri içerir , burada harfler parçaları ve piyonları gösterir (siyah olanlar p= piyon, n= şövalye, b= piskopos, r= kale, q= kraliçe, k= kral ve beyazdır) bunlar büyük harfle yazılmış sürümlerdir) ve sayılar arka arkaya boş kareleri gösterir. Örneğin, rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNbir kat hareketten sonra tahta (kralın piyonu e4'e)) bir satranç oyununda.

a1 ve h8 girişte boş olacaktır; yani, ilk eğik çizgiden önce bir rakam ve son eğik çizgiden sonra bir rakam vardır.

Çıktı

Truthy veya Falsey, başarılı geçit olmadığını gösteren h8 mümkündür.

Giriş geçerli bir FEN panosu açıklaması değilse (yani, yukarıdaki açıklamamla eşleşen bir açıklama) veya a1 veya h8 meşgulse , çıktı herhangi bir şey veya hiçbir şey olmayabilir. (Başka bir deyişle: girdinin yukarıdaki gereksinimleri karşıladığını varsayabilirsiniz.)

puanlama

Bu kod golf: en az bayt kazanır.

Örnek giriş ve çıkış

Kodunuzun yalnızca örnekler için değil, tüm geçerli girişler için çalışması gerektiğini unutmayın.

wGörüntülemek için her FEN'den sonra bir boşluk ve bir ekleyin http://www.dhtmlgoodies.com/scripts/chess-fen/chess-fen-3.html. (Bazı diğer çevrimiçi FEN görüntüleyicilerinin satrançta yasadışı olan bir panele izin vermeyeceğini unutmayın, örneğin 1 veya 8 .

Gerçek örnekler

  • 8/8/8/8/8/8/8/8 - boş tahta
  • 1p1Q4/2p1Q3/2p1Q3/2p1Q3/2p1Q3/2p1Q3/Q1p1Q3/1q3q2- a1 , b2 , b3 , b4 , b5 , b6 , b7 , c8 , d7 , ( e8 değil , engellenen bir yol var, ancak) d6 , d5 , d4 , d3 , d2 , d1 , e1 , f2 , f3 , f4 , f5 , f6 , f7 , f8 , g8 , h8
  • 8/8/KKKKK3/K3K3/K1K1p3/Kp1K4/K1KK4/2KK4 - bir noktada engellenen bir karenin daha sonra geçirilmesi gereken bir örnek (kareleri geçilmez olarak ayarlamadığınızdan emin olmak için)
  • K1k1K1K1/1K1k1K1k/K1K1k1K1/1k1K1K1k/K1k1K1k1/1K1k1k1K/K1K1k1K1/1k1k1K1k- tek bir yol var (sadece burnunuzu takip edin: geri adım atmadıkça, her adımda hareket etmek için sadece bir kare var); bu aynı zamanda bir karenin bir noktada engellendiği ancak daha sonra gerekli olduğu bir örnektir

Falsey örnekleri

  • 6Q1/5N2/4Q3/3N4/2Q5/1N6/2Q5/1N6 - bir yoldaki herhangi bir girişim, çapraz olarak yerleştirilmiş iki aynı renk parçasından geçmek zorunda kalacaktır.
  • N1q1K1P1/1R1b1p1n/r1B1B1Q1/1p1Q1p1b/B1P1R1N1/1B1P1Q1R/k1k1K1q1/1K1R1P1r- a8-h1 köşegeninden geçmenin tek yolu f2-g3'tür , ancak her ikisi de imkansız olan e1-d2 veya f2-e3'ten geçiş gerektirir .
  • 4Q3/4q3/4Q3/5Q2/6Q1/3QqP2/2Q5/1Q6
  • 4q3/4Q3/4q3/5q2/6q1/3qQp2/2q5/1q6

Örnek köşegenler

Yukarıdaki nesir net değilse, bazı resimler var.

Geçilebilir köşegenler

aynı renkteki piyonlar karşıt renklerin piyonları zıt renklerin kaleleri

Geçilemez köşegenler

bir kale ve aynı renkte bir piyon aynı renkteki kaleler


Üzgünüm, standart golf kurallarından emin değilim: Yasadışı bir String eklerseniz ne olur? Herhangi bir davranış olabilir mi?
alex berne

@alexberne Bunun bunu kapsadığına inanıyorum: "kodunuz tüm geçerli girdiler için çalışmalıdır ".
Rainbolt

@alexberne, ben düzenledim. Şimdi anlaşıldı mı?
msh210

Evet teşekkürler. Burada yeniyim, bu yüzden golfçü için olağan şeyler olabilir, ama benim için belirsiz :)
alex berne

Sadece @ msh210 büyük bir bulmaca için teşekkür etmek istedim. Neden daha fazla cevap olmadığını anlamıyorum.
Joffan

Yanıtlar:


6

Vba 668 666 633 622 548 510 489 435 331 322 319 315 bayt

Function Z(F):Dim X(7,7):While Q<64:R=R+1:V=Asc(Mid(F,R))-48:If V>9 Then X(Q\8,Q Mod 8)=(3+(V\8=V/8))*Sgn(48-V):V=1
Q=Q-V*(V>0):Wend:X(7,0)=1:For W=0 To 2E3:Q=W Mod 8:P=W\8 Mod 8:For T=Q+(Q>0) To Q-(Q<7):For S=P+(P>0) To P-(P<7):If X(S,T)=0 Then X(S,T)=(1=X(P,Q))*(6>X(P,T)*X(S,Q))
Next S,T,W:Z=X(0,7):End Function

Giriş dizesini okumak 'Wend' e kadar yer kaplar. Güzel yan etki - kart [X] tamamen kodlandıktan sonra giriş dizesini iptal eder, böylece sonunda bir açıklama bırakabilirsiniz.

Pano kodlamasında piyonlar 2, diğer parçalar 3, siyah negatiftir. Piyonlar 8 ile bölünebilen karakter kodlarına sahip 'P' ve 'p' ile tanınır.

'X (7,0) = 1', a1 erişilebilir ayarı , yol kontrollerinin başladığı yerdir. Bu, defalarca erişilebilir (1) olarak işaretlenmiş karelerden erişilebilir kareler eklemeye çalışırken kartı tekrar tekrar tarar. Diyagonal erişim ve doluluk, bir zamanlar bir işlevde yaşayan ancak şimdi iç içe komşu döngülerde oturan bir IF + mantık-hesapta kontrol edilir. Diyagonal erişim kontrolü, iki pisi köşesi karesinin ürününe dayanır; bu, eğer parçalar aynı renkteyse ve en az biri piyon olmayan bir parça ise sadece 6 veya daha fazladır.

E-tabloda arayın; h8 erişilebilirse X (0,7) - 1 ve değilse 0 olarak - Excel'in doğruluk / falsy olarak tanıdığı değeri döndürür. = EĞER (Z (C2), "evet", "hayır")

resim açıklamasını buraya girin

Belki yukarıda kod aşağı scrunching ile taşındı, bu yüzden burada bir yarı ungolfed yorum versiyonu:

Function MazeAssess(F)  'input string F (FEN)
Dim X(7, 7)             'size/clear the board; also, implicitly, Q = 0: R = 0
'Interpret string for 8 rows of chessboard
While Q < 64
    R = R + 1           ' next char
    V = Asc(Mid(F, R)) - 48  ' adjust so numerals are correct
    If V > 9 Then X(Q \ 8, Q Mod 8) = (3 + (V \ 8 = V / 8)) * Sgn(48 - V): V = 1 ' get piece type (2/3) and colour (+/-); set for single column step
    Q = Q - V * (V > 0) ' increment column (unless slash)
Wend
'Evaluate maze
X(7, 0) = 1             ' a1 is accessible
For W = 0 To 2000       ' 1920 = 30 passes x 8 rows x 8 columns, golfed to 2E3
    Q = W Mod 8         ' extracting column
    P = W \ 8 Mod 8     ' extracting row
    For T = Q + (Q > 0) To Q - (Q < 7)     ' loop on nearby columns Q-1 to Q+1 with edge awareness
        For S = P + (P > 0) To P - (P < 7) ' loop on nearby rows (as above)
            If X(S, T) = 0 Then X(S, T) = (1 = X(P, Q)) * (6 > X(P, T) * X(S, Q)) ' approve nearby empty squares if current square approved and access is possible
        Next 'S
    Next 'T
Next 'W
MazeAssess = X(0, 7)    ' report result for h8
End Function

İlerleme notları

Düzenleme 1: Kod şimdi 666-şeytan gibi değil: -D ve işlevlerini kaybetti; Havai önlemek için bunları yazmak için yeterince kısa bir yol buldum.

Edit 2: İnc / dec işlevlerini kaldırma, iç çekme ve birkaç küresel kullanma işini etkili bir şekilde bitiren ileri bir başka büyükçe sıçrama. Sonunda bunun asmak olabilir ....

Parçaların ve karelerin kodlaması değişti. Kod uzunluğu üzerinde etkisi yoktur.

Edit 3: (Sahte) işlevlerin geri dönüşü, tüm bu sinir bozucu Callbaytları ve diğer bazı düzeltmeleri kaldırarak .

Edit 4: Büyük 500'ü kırmak, woohoo - 3 For döngülerini 1'e dönüştürdü.

Edit 5: Jiminy Cricket, iki fonksiyonu bir araya getirdiğimde bir başka büyük damla - diyagonal erişim kontrolüm her zaman bitişik kareler için geçiyor, bu yüzden ...

Edit 6: Kutsal niblicks, başka bir büyük damla. Dış fonksiyonlara ve dolayısıyla küresellere buh-bye ... Orijinal gönderilen uzunluğun yarısına düştüm ....

Edit 7: Unungolfed sürümü ekle

Edit 8: Okuma işlemini birkaç dolar daha revize etti

Edit 9: Son birkaç damla kan için birkaç ifadeyi sıktı

Düzenleme 10: Compund Nextdeyimi birkaç bayt tutar


İlgi için, erişilebilirlik analizinden sonra kartların grafikleri (kod numaraları güncel değil ...) erişilebilir kareler yeşil, erişilemeyen kareler beyaz ve diğer renkler parça veya piyon.

3 başarılı kurul 3 bloke pano

Birkaç meydan okuma panosu: h8 her ikisinde de erişilebilir:

  • P1Pq2p1 / 1P1R1R1p / 1K2R1R1 / 1p1p1p2 / p1b1b1np / 1B1B1N1k / Q1P1P1N1 / 1r1r1n2 - çözmek için 10 geçiş
  • P1P3r1 / 1P1R2r1 / 1N1R1N2 / 1P1P1P2 / 1n1p1ppp / 1B1B4 / 1b1pppp1 / 1P6 - bir sarma yolu

1
Çok güzel ve +1, ancak: (1) 960 adımın yeterli olduğundan emin misiniz? (2) Tahtaya baş aşağı bakarak biraz bayt kaydedebilir misiniz? If V>9 Then X(7-P,C)=düşünürdüm (VBA'yı bildiğimi değil) If V>9 Then X(P,C)=.
msh210

Aslında bu teknik P başlatmayı kurtarır, bu yüzden :-) sorduğunuz için teşekkürler. Ve evet, eminim tahtadan 15 geçiş yeterli; Oldukça fazla kontrol yaptım. Aslında 10 geçişi geçemedim, ancak 640 ve 960'da aynı sayıda karakter var, bu yüzden güvenli oynayacağım. AMA tahtayı baş aşağı bulursam, 10'dan fazla ve belki de 15'ten fazla sürebilir - eğer tahta da baş aşağı geçmezsem, bu da bir ek yüke sahip olurdu.
Joffan

msh210 1 ek gözlem @ - 15 döngüler olduğunu sadece tüm tabloyu, en kötü durum analiz etmek yeterli, ama gerçekten büyük bir marj var bu yüzden 10 döngüler, h8 durumunu almak için yeterlidir. Bunun nedeni, yolların bulunmasının değerlendirme yönünde çok daha hızlı çalışması ve satır # ile sütunun # artmasıdır - yol yukarı veya sağa devam ettiği sürece, tek geçişte tamamlanacaktır. Sola veya aşağı gitmek her geçişte sadece bir adım ileri gider.
Joffan

@ msh210 Okuma sürecindeki bir yenilemenin bir parçası olarak - tesisi FEN dizesinin sonuna yorum bırakmak için dar bir şekilde tuttu - önerdiğiniz tahta tersini ekledim - bazı tahtalar artık 15 geçişi (17'ye kadar) alıyor işlev kartın 30 geçişine yükselmiştir.
Joffan

Eğer tüm örneklerini yoğuşmalı tarafından 3 Bytes bırakabilirsiniz @Joffan [some non-letter character] Toiçin[some non-letter character]To
Taylor Scott

3

Matlab, kaydedildiği gibi 636887 bayt (girinti dahil)

Bu çözüm çok golf değil, ama devam etmek ve koymak istedim.

function[n] = h(x)
o=[];
for i=x
 b={blanks(str2num(i)),'K','k',i};o=[o b{~cellfun(@isempty,regexp(i,{'\d','[NBRQK]','[nbrqk]','p|P'}))}];
end
o=fliplr(reshape(o,8,8))
for i=1:64
 b=i-[-8,8,7,-1,-9,1,9,-7];
 if mod(i,8)==1
  b=b(1:5);
 elseif mod(i,8)==0
  b=b([1,2,6:8]);
 end
 b=b(b<65&b>0);c=o(b);dn=b(isspace(c)&ismember(b,i-[9,7,-9,-7]));
 for j=dn
  g=o(b(ismember(b,j-[-8,8,7,-1,-9,1,9,-7])));
  if ~isempty(regexp(g,'pk|kp|PK|KP|kk|KK'));c(b==j)='X';end;
 end
 Bc{i}=b(c==32);
end
n=Bc{1};
on=[];
while length(n)>length(on)
 on=n;
 for i=1:length(n)
  n=unique([n Bc{n(i)}]);
 end
end
any(n==64)
end

xYukarıda belirtildiği gibi bir tahta dizgisini okur ve onu daha tam olarak temsil edilen biçime dönüştürür o, ardından boşluklar arasındaki tüm hareketleri (grafik kenarları) bulur, sonra hangi hareketlerin mümkün olduğunu (dolu boşluklara değil), sonra hangi olası hareketlerin olduğunu bulur " geçmesi için iki parçanın kapıları "nı seçin, ardından kapının açık (piyonlar, karşıt renkler) veya kapalı (aynı renk ve piyon içermeyen) olup olmadığını anlar. Daha sonra, sol alt köşeden yollarla ulaşılabilen yerleri bulmak için yürür ve bir yol 64 boşluğuna ulaşabilirse, bu bir Evet tahtasıdır.


1
Güzel. Her biri için doğru sonucu döndürdüğünden emin olmak için sorudaki örnek FEN'lere karşı test ettiniz mi? Ayrıca, bu bir kod golf sorusu olduğundan, gerçekten bu golf gerekir. Başka bir şey yoksa, girintiden kurtulabilirsiniz (veya dört boşluk yerine tek bir boşluk veya sekme yapabilirsiniz)? ve / veya =s çevresindeki boşlukları bırakmak ? (
MATLAB'ı

Evet, bir sonraki molamda bunlardan bazılarını yapabilirim. Tüm örneklerinize ve sonra bazılarına karşı test ettim. Bunu bir şekilde belirtmeli miyim?
sintax

Dunno; Sadece merak ediyordum.
msh210
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.