Pawn Chessboardでキャプチャする


17

入力および出力としてポーンのみを含むチェスボードを表す文字列を受け取るプログラムまたは関数を作成する必要があります。または、ボード上でキャプチャが可能かどうかを返します。

入力は、他のピースが存在しない白と黒のポーンの位置を記述するFENのような表記法です。敵を捕まえることができるポーンがあるかどうかを判断する必要があります。

ランク8から始まり、ランク1で終わる各ランクが記述されています。各ランク内で、各正方形の内容はファイル「a」からファイル「h」まで記述されます。各ポーンは1文字で識別されます(白いポーン=「P」、黒いポーン=「p」、)。空の四角は1〜8の数字(空の四角の数)を使用して示され、「/」はランクを区切ります。(一部ウィキペディアから取得)

例えば

8/pppppppp/8/8/4P3/8/PPPP1PPP/8

ボードについて説明します

--------

pppppppp


    P   

PPPP PPP

--------

白のポーンは黒のポーンが斜めに上にある場合(黒は左上または右上)、黒のポーンは白のポーンが下から斜めにある場合(白は白左下または右下)。他のキャプチャー移動(en passant)は考慮しないでください。

入力

  • A FENの文字からなる文字列様12345678pP/
  • 入力は、有効なチェスのゲーム位置のポーンを記述します。これは、(他のより複雑な制約の中でも)各側に最大8つのポーンがあり、ランク1と8にはポーンがないことを意味します。

出力

  • あなたが出力するいずれかの側に可能なキャプチャがある場合truthyの値とfalsyそうでない場合、値を。

真実の出力を持つ入力(1行に1つ)

8/7p/6P1/8/8/8/8/8
8/8/p7/1P6/3P3p/8/8/8
8/2P5/8/4P1p1/2p2P2/3p4/3p1P2/8
8/P7/8/5P2/2pp4/3P2p1/3pP3/8
8/P7/p7/p1P1P3/1P3p2/8/1p6/8
8/4p1P1/2P2P1P/2p1pPpp/8/6P1/pP1p4/8

偽の出力を伴う入力(1行に1つ)

8/8/8/8/8/8/8/8
8/7P/6p1/8/8/8/8/8
8/7p/7P/8/8/8/8/8
8/pppppppp/8/8/8/8/PPPPPPPP/8
8/p7/8/1p6/5P2/8/8/8
8/p7/P7/2P1p1p1/2p5/8/PP6/8

これはコードゴルフなので、最短のエントリーが勝ちます。


サンプルボードを説明してはいけません8/pppppppp/8/8/8/7P/PPPP1PPP/8か?
TheNumberOne

@TheNumberOneいいえ、7Pポーンは最後の8番目のファイルにあります。(ただし、図は正しくありませんでした。修正しました。)
randomra

1
偶然を取り除くと、これはあまり面白くないパズルになると思います。
corsiKa

回答:


6

Pyth、25バイト

/smC,>JsXz`M9*LN9dJ,8T"Pp

テストスイート

手順:

数字を同等の数の引用符(N)に置き換えて入力を変換します。これはに保存されJます。次に、最初の8文字または10文字を切り取り、元の結果と一緒に圧縮します。キャプチャペアはすべてに変換される"Pp"ため、結果のリストでその文字列のカウントを見つけます。これが出力です。

ボーナスとして、これは実際に入力で可能なキャプチャの数をカウントします。


別の解決策::sXz`M9*LN9"p.{7}(..)?P"1悲しいことに、最後のパラメータ:はオプションではありません(そうすべきだと思います)。
ジャクベ

3
@ジャクベがやる。
isaacg

12

網膜33 29バイト

T`d`w
)`\d
$0.
_

p.{7}(..)?P

単一のファイルからコードを実行するには、-sフラグを使用します。

スペース(または他の文字)の文字列への数字の展開が17バイトを占有しないPerlのようなものによって簡単に打ち勝つことができるはずです。

出力は、可能なキャプチャがある場合は正(真)であり、キャプチャがない場合はゼロ(偽)です。

説明

T`d`w
)`\d
$0.

これは2段階のループです。最初の段階は、各数字をデクリメントし、ゼロをアンダースコアに変える音訳段階です。どうして?ためdw次の2行に展開します。

0123456789
_0123456789AB...YZab...yz

音訳段階のターゲットセットがソースセットよりも長い場合、無関係な文字は無視されるため、デクリメント動作が行われます(正直なところ、w文字クラスを展開するときに数字の前にアンダースコアを置くことにしました) 。

次に、第2段階は置換であり、.各桁にa を追加します。つまり、各数字nに対して、nその数字が下線に変わる前にピリオドが追加されます。

_
<empty>

これはアンダースコアを取り除くだけです。

p.{7}(..)?P

最後に、一致を見つけます。en passantを無視しているため、キャプチャは、aがpあり、そのP下に斜めにある場合にのみ可能です。線形文字列では、これは単に2つのポーン間に7または9文字が必要であることを意味します。これは一致します.{7}(..)?(つまり、7文字に一致し、オプションで別の2文字に一致)

このような一致ステージは、見つかった一致の数を返します。


Re "スペース(または他の文字)の文字列への数字の展開が17バイトを必要としないPerlのようなものによって簡単に打ち負かすことができるべきです。" 。(私のPerlの答え。)しかし、多分他の誰かが....
msh210

3

Javascript、272文字

function h(t){b=[[]];for(i=-1;i++<7;){c=0;b.push(l=[]);for(j=-1;j++<7;){o=t.split('/')[i][j];switch(o){case'P':l[c++]=-1;break;case'p':l[c++]=1;break;default:c+=parseInt(o);}}}b.push([]);for(i=1;i<9;i++)for(j=0;j<8;j++)if((p=b[i][j])&&(b[i+p][j-1]||b[i+p][j+1]))return 1;}

おそらく改善の余地はたくさんあります。


3

ルビー、145123 46バイト

->b{b.gsub(/\d/){|x|?.*x.to_i}=~/p.{7}(..)?P/}

そもそもなぜこのことを考えなかったのか分かりません。それはずっと短く、かなり読みやすいです。

テストは次のとおりです。http//ideone.com/Gzav8N


古いアプローチ:

->b{l={}
r=p
b.split(?/).map{|s|c={}
i=0
s.chars.map{|x|n=x.to_i;c[i]=x;i+=n<1?1:n;x==?P&&r||=l[i-2]==?p||l[i]==?p}
l=c}
r}

オンラインテスト:http : //ideone.com/9L01lf、ゴルフ前のバージョン:http : //ideone.com/CSmqlW

変更の履歴はここで入手できます


2

ES6、64バイト

適切なバイトカウント(持続する場合)!

f=s=>/p.{7}(..)?P/.test(s.replace(/\d/g,n=>"        ".slice(-n)))

最初に他の答えを読まずにこの解決策を考えましたが、あなたが私を信じていなくてもかまいません。



0

PHP、94 87 80バイト

for(;$i++<8;)$t[$i]=$s.=" ";echo preg_match("#p.{7}(..)?P#",strtr($argv[1],$t));

そのループ+は、strtrより多くの短いpreg_replace_callbackstr_pad


0

ゼリー、88 84 79 72 69 65 64 63 60バイト

間違いなく改善の余地があります。Jellyは質問の前に作成されたため、競合しません。それを教えてくれた@lirtosiastに感謝します!

ØDṖḊ
”_x
e1£¬
1£iЀ2Ŀ€
x"3Ŀ€;"ÇFṣ”/
w€⁾pPn0
5ĿUŒDÇ
5ĿŒD6ĿoÇS
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.