チェス盤迷路


14

チェスの駒(キング、クイーン、ルーク、ビショップ、ナイト)とポーンはボード上にありますが、a1またはh8スクエアにはありません。あなたの仕事は、空のa1から空のh8のマスに移動し、空のマスのみを通過することです。移動の規則は次のとおりです。

  1. 空の四角から隣の空の四角(同じランク、次または前のファイル、または同じファイル、次または前のランク)に進むことができます。
  2. あなたは、斜め横に空の正方形(次または前の順位、次または前のファイル)に空の正方形から進むことができ提供猫のようなコーナー正方形は()は、2つのポーン又は反対の(B)ポーン/個のいずれかを含むこと色。(同じ色の2つのポーン以外のピース、またはポーン以外のピースとポーンは、コーナーでの進行を妨げるのに十分な強さですが、2つのポーンはそうではありません。反対の色のピース/ポーンは機能しませんたとえば、c4d5が空の場合、c5d4にポーンが含まれているか、反対の色のピース/ポーンが含まれている場合は、続行できます。写真については、以下の「対角線の例」セクションを参照してください。

入力

FENのボードの説明。つまり、入力は、ランク8の説明、スラッシュ(/)、ランク7の説明、スラッシュ、…、およびランク1の説明を含む文字列になります。各ランクの説明は、ファイルaからファイルhまでの数字と文字で構成されます。文字はピースとポーンを示します(黒いものはp= pawn、n= knight、b= bishop、r= rook、q= queen、k= king、およびwhiteです。 1つは同じものの大文字バージョンです)、数字は空の正方形の連続数を示します。たとえば、rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBN1プライ移動後のボード(キングのポーンはe4)チェスゲームで。

入力ではa1h8は空になります。つまり、最初のスラッシュの前に数字があり、最後のスラッシュの後に数字があります。

出力

真実か偽か。h8への移行が成功したかどうかを示します。

入力が有効なFENボードの説明(つまり、上記の説明と一致するもの)でない場合、またはa1またはh8が使用されている場合、出力は何でもまたは何でもかまいません。(言い換えると、入力が上記の要件を満たしていると仮定できます。)

得点

これはコードゴルフです。最少バイトが勝ちます。

入出力の例

コードは、例だけでなく、すべての有効な入力に対して機能する必要があることに注意してください。

w各FENの後にスペースとaを追加して、で視覚化しhttp://www.dhtmlgoodies.com/scripts/chess-fen/chess-fen-3.htmlます。(他の一部のオンラインFENビジュアライザーは、チェスで違法なボード(ランク1または8のポーンなど)を許可しないため、この目的には使用できないことに注意してください。)

真実の例

  • 8/8/8/8/8/8/8/8 —空のボード
  • 1p1Q4/2p1Q3/2p1Q3/2p1Q3/2p1Q3/2p1Q3/Q1p1Q3/1q3q2—パスa1b2b3b4b5b6b7c8d7があります(e8ではなく 、ブロックされていますが)d6d5d4d3d2d1e1f2f3f4f5f6f7f8g8h8
  • 8/8/KKKKK3/K3K3/K1K1p3/Kp1K4/K1KK4/2KK4 —ある時点でブロックされた正方形を後で通過させる必要がある例(正方形を通過不可として設定しないようにするため)
  • K1k1K1K1/1K1k1K1k/K1K1k1K1/1k1K1K1k/K1k1K1k1/1K1k1k1K/K1K1k1K1/1k1k1K1k—単一のパスがあります(鼻をたどるだけです。後方に一歩を踏み出さない限り、各ステップで移動する正方形は1つだけです)。これは、正方形が1つのポイントでブロックされているが、後で必要になる例でもあります

偽の例

  • 6Q1/5N2/4Q3/3N4/2Q5/1N6/2Q5/1N6 —パスへの試みは、斜めに位置する2つの同じ色の部分を通過する必要があります。
  • N1q1K1P1/1R1b1p1n/r1B1B1Q1/1p1Q1p1b/B1P1R1N1/1B1P1Q1R/k1k1K1q1/1K1R1P1ra8-h1の対角線を通る唯一の方法はf2-g3ですが、それは両方とも不可能なe1-d2またはf2-e3を通る必要があります。
  • 4Q3/4q3/4Q3/5Q2/6Q1/3QqP2/2Q5/1Q6
  • 4q3/4Q3/4q3/5q2/6q1/3qQp2/2q5/1q6

対角線の例

上記の散文が不明瞭な場合のために、ここにいくつかの写真があります。

通行可能対角線

同じ色のポーン 反対色のポーン 反対色のルーク

通過できない対角線

同じ色のルークとポーン 同じ色のルーク


申し訳ありませんが、標準のゴルフルールについてはよくわかりません。違法な文字列を挿入するとどうなりますか?何らかの動作が発生する可能性がありますか?
アレックスベルン

@alexberneこれはそれをカバーすると信じています:「あなたのコードはすべての有効な入力に対して機能しなければなりません」。
レインボルト

@alexberne、編集しました。今は明らかですか?
msh210

はい、ありがとう。私はここに新しいので、ゴルファーにとっては普通のものかもしれませんが、私にとっては不明瞭でした:)
アレックスベル

@ msh210というすばらしいパズルに感謝します。なぜこれ以上答えがないのか分かりません。
ジョファン

回答:


6

VBA 668 666 633 622 548 510 489 435 331 322 319 315バイト

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

入力文字列の読み取りは、「Wend」まで占有します。素晴らしい副作用-これは、ボード[X]が完全にコーディングされると入力文字列を破棄するため、最後に説明を残すことができます。

ボードのコーディングでは、ポーンは2、他のピースは3、黒は負です。ポーンは、8で割り切れる文字コードを持つ「P」と「p」によって認識されます。

'X(7,0)= 1'、a1をアクセス可能に設定すると、パスチェックが開始されます。これは、これまでアクセス可能(1)とマークされた正方形からアクセス可能な正方形を追加しようとしてボードを繰り返しスキャンします。対角線のアクセスと占有率は、IF + logic-calcでチェックされます。IF+ logic-calcは、かつて関数に存在していましたが、ネストされた隣接ループに配置されています。対角線アクセスチェックは、2つの子角の正方形の積に依存します。これは、同じ色があり、少なくとも1つがポーンではない場合、6以上になります。

スプレッドシートを呼び出します。戻りXの値(0,7) - 1の場合H8アクセス可能でない場合、0 - Excelはtruthy / falsyとして認識する。= IF(Z(C2)、 "yes"、 "no")

ここに画像の説明を入力してください

上記のコードを切り詰めることに夢中になったかもしれませんので、ここにコメントなしのコメント版があります:

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

プログレスノート

編集 1:コードは666-devilish :-Dとしてではなく、機能を失いました。オーバーヘッドを避けるために、それらを書くのに十分な短い方法を見つけました。

編集 2:別の大きな飛躍が進み、inc / dec関数の削除、ため息、そしていくつかのグローバルの使用の作業を効果的に終了します。私は最終的にこれのこつを得るかもしれません…。

ピースと正方形のコーディングが変更されました。コード長には影響しません。

編集 3 :(偽の)関数を返し、それらの迷惑なCallバイトをすべて削除し、その他の調整を行います。

編集 4:大きな500を突破、woohoo-3つのForループを1に滑らかにしました。

編集 5:ジミニー・クリケット、2つの機能を一緒に滑らかにしたときのもう1つの大きな低下-私の斜めのアクセスチェックは常に隣接する正方形に合格するので...

編集 6:聖なるニブリック、もう1つの大きなドロップ。外部関数、したがってグローバルへのバイバイ...私は元の投稿された長さの半分以下になりました....

編集 7:未ゴルフバージョンを追加

編集 8:読み取りプロセスをさらに数ドル修正しました

編集 9:最後の数滴の血のいくつかの表現を絞った

編集 10:Compund Nextステートメントは数バイトを削減


興味深いことに、アクセシビリティ分析後のボードのグラフィックス(コード番号は古くなっていますが...)アクセシブルな正方形は緑、アクセスできない正方形は白、その他の色はピースまたはポーンです。

3つの成功したボード 3つのブロックされたボード

いくつかのチャレンジボード:h8は両方でアクセス可能です:

  • P1Pq2p1 / 1P1R1R1p / 1K2R1R1 / 1p1p1p2 / p1b1b1np / 1B1B1N1k / Q1P1P1N1 / 1r1r1n2-10パスで解決
  • P1P3r1 / 1P1R2r1 / 1N1R1N2 / 1P1P1P2 / 1n1p1ppp / 1B1B4 / 1b1pppp1 / 1P6-巻線パス

1
とても素敵で、+ 1ですが、:(1)960ステップで十分ですか?(2)ボードを上下逆さまにして、いくつかのバイトを節約できますか?If V>9 Then X(7-P,C)=私が思うだろう(私はVBAを知っているということではない)になりますIf V>9 Then X(P,C)=
msh210

実際、この手法はPの初期化を節約するので、質問してくれてありがとう:-)。はい、ボードの15パスで十分だと確信しています。私は非常に多くのチェックを行いました。実際、10パスを超えてプッシュすることはできませんでしたが、実際には640と960のキャラクターの数が同じなので、安全にプレイします。しかし、ボードを上下逆さまにすると、10回以上、場合によっては15回以上かかる可能性があります-上下逆さまにボードを移動すると、オーバーヘッドが発生します。
ジョファン

msh210 1追加の観察@ - 15のループがあるだけで、全体ボード、最悪のケースを分析するのに十分な、しかし、私は本当に大きなマージンを持っているので、10個のループは、H8の状態を取得するのに十分です。理由は、パスの検索は評価の方向ではるかに高速に機能し、行番号と列番号が増加するためです。パスが上向きまたは右向きである限り、単一のパスで完了します。左または下に移動すると、パスごとに1ステップだけ進みます。
ジョファン

@ msh210読み取りプロセスの改良の一環として-FEN文字列の終わりにコメントを残すためにファシリティを狭く維持しました-あなたが提案したボードの反転を追加しました-一部のボードは15パス(17まで)を取得するようになりました機能は、ボードの30パスに増加しました。
ジョファン

@Joffanは、[some non-letter character] Totoのすべてのインスタンスを圧縮することで3バイトをドロップできます[some non-letter character]To
Taylor Scott

3

Matlab、保存時の636 887バイト(インデントを含む)

この解決策はあまりゴルフではありませんが、私は先に進み、それを上げたかったのです。

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

x上記で指定されたボード文字列を読み取り、より完全に表現されたものに変換し、oスペース間のすべての動き(グラフの端)を見つけ、次にどの動きが可能か(塗りつぶされたスペースではない)を見つけ、次に可能な動きが「通過する2つの部分のゲート」を開き、ゲートが開いている(ポーン、反対の色)か閉じている(同じ色で、ポーン以外を含む)かを判断します。次に、左下の正方形からのパスで到達可能な場所を見つけるためにウォークスルーし、パスがスペース64に到達できる場合は、はいボードです。


1
涼しい。質問の例のFENに対してテストして、それぞれに対して正しい結果が返されることを確認しましたか?また、これはコードゴルフの質問なので、本当にこれをゴルフする必要があります。他に何もない場合は、インデントを取り除くことができますか(または、4つのスペースではなく単一のスペースまたはタブにします)?および/または=sの周りのスペースをドロップしますか?(私はMATLABを知りません:多分それらは不可能です。)
msh210

ええ、そして私は次の休憩中にそのいくつかをするかもしれません。私はあなたのすべての例とそれからいくつかに対してテストしました。何らかの方法でそれを示す必要がありますか?
シンタックス

ダンノ; 私はただ疑問に思っていました。
msh210
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.