จับบนกระดานหมากรุกจำนำ


17

คุณควรเขียนโปรแกรมหรือฟังก์ชั่นที่ได้รับสตริงที่แสดงกระดานหมากรุกที่มีเบี้ยเพียงเป็นอินพุตและเอาท์พุตหรือคืนค่าว่าจะมีการจับภาพใด ๆ บนกระดาน

การป้อนข้อมูลที่อยู่ในบึงเหมือนสัญกรณ์อธิบายตำแหน่งของผู้จำนำสีขาวและสีดำที่มีไม่มีชิ้นอื่น ๆ ในปัจจุบัน คุณควรตัดสินใจว่ามีเบี้ยซึ่งสามารถจับศัตรูได้หรือไม่

คำอธิบายแต่ละอันดับเริ่มต้นด้วยอันดับ 8 และลงท้ายด้วยอันดับ 1 ภายในแต่ละอันดับเนื้อหาของแต่ละตารางจะอธิบายจากไฟล์ "a" ถึงไฟล์ "h" การจำนำแต่ละครั้งจะถูกระบุด้วยตัวอักษรเดียว (จำนำสีขาว = "P", จำนำสีดำ = "p",) สี่เหลี่ยมที่ว่างเปล่าจะถูกบันทึกโดยใช้ตัวเลข 1 ถึง 8 (จำนวนของช่องสี่เหลี่ยมที่ว่าง) และ "/" คั่นอันดับ (บางส่วนมาจาก Wikipedia)

ตัวอย่างเช่น

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

อธิบายบอร์ด

--------

pppppppp


    P   

PPPP PPP

--------

จำนำสีขาวสามารถจับหนึ่งสีดำถ้าสีดำอยู่ในตำแหน่งแนวทแยงมุมขึ้นมาจากมัน (สีดำเป็นซ้ายหรือขวาขึ้น) และจำนำสีดำสามารถจับภาพสีขาวถ้าสีขาวอยู่ในแนวทแยงมุมด้านล่าง (สีขาวคือ ลงซ้ายหรือขวาล่าง) ไม่มีย้ายจับอื่น ๆ ( การกิน ) ควรได้รับการพิจารณา

อินพุต

  • FEN12345678pP/สตริงเหมือนที่ประกอบด้วยตัวอักษร
  • อินพุตอธิบายถึงเบี้ยของตำแหน่งเกมหมากรุกที่ถูกต้อง นี่หมายถึง (ท่ามกลางข้อ จำกัด ที่ซับซ้อนมากขึ้น) จะมีเบี้ยได้มากที่สุด 8 ตัวสำหรับแต่ละด้านและไม่มีเบี้ยในลำดับที่ 1 และ 8

เอาท์พุต

  • หากมีความเป็นไปได้สำหรับการจับภาพทั้งสองข้างที่คุณควรส่งออกtruthyคุ้มค่าและfalsyคุ้มค่าเป็นอย่างอื่น

ตัวอย่าง

ปัจจัยการผลิตที่มีtruthyเอาท์พุท (หนึ่งต่อบรรทัด)

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

อินพุตที่มีเอาต์พุตที่ผิดพลาด (หนึ่งรายการต่อบรรทัด)

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"ดังนั้นเราจึงหาจำนวนของสตริงนั้นในรายการผลลัพธ์ นี่คือผลลัพธ์

โบนัสจะนับจำนวนการบันทึกที่เป็นไปได้จริงในอินพุต


อีกโซลูชัน 25: :sXz`M9*LN9"p.{7}(..)?P"1น่าเสียดายที่พารามิเตอร์สุดท้ายของ:ไม่ใช่ตัวเลือก (ฉันคิดว่ามันควรจะเป็น)
Jakube

3
@ Jakube จะทำ
isaacg

12

เรติน่า , 33 29 ไบต์

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

p.{7}(..)?P

ในการเรียกใช้รหัสจากไฟล์เดียวให้ใช้การ-sตั้งค่าสถานะ

ควรจะสามารถเอาชนะได้ง่ายโดยบางอย่างเช่น Perl ที่การขยายตัวของตัวเลขไปยังสตริงของช่องว่าง (หรือตัวละครอื่น ๆ ) ไม่ได้ใช้เวลาถึง 17 ไบต์

ผลลัพธ์เป็นค่าบวก (ความจริง) หากมีการจับภาพที่เป็นไปได้และเป็นศูนย์ (เท็จ) หากไม่มี

คำอธิบาย

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

นี่คือวงวนของสองขั้นตอน คนแรกคือระยะทับศัพท์ซึ่งลดจำนวนแต่ละหลักและเปลี่ยนเป็นศูนย์เพื่อขีดเส้นใต้ ทำไม? เพราะdและwขยายไปยังสองบรรทัดต่อไปนี้:

0123456789
_0123456789AB...YZab...yz

หากชุดเป้าหมายของระยะการถอดเสียงยาวกว่าชุดต้นทางอักขระที่ไม่เกี่ยวข้องจะถูกละเว้นดังนั้นพฤติกรรมที่ลดลง (โดยสุจริตมันเป็นโชคดีที่ฉันตัดสินใจใส่ขีดล่างหน้าตัวเลขเมื่อขยายwคลาสอักขระ) .

จากนั้นขั้นตอนที่สองคือการเปลี่ยนซึ่งจะผนวก a .ไปยังแต่ละหลัก นั่นหมายความว่าในแต่ละหลักn, nระยะเวลาก่อนที่จะมีการเพิ่มหลักที่กลายเป็นขีด

_
<empty>

นี่เป็นเพียงการกำจัดขีดล่าง

p.{7}(..)?P

ในที่สุดเราก็พบการแข่งขัน เนื่องจากเราไม่สนใจผู้ที่สัญจรไปมาการจับกุมจึงเป็นไปได้ก็ต่อเมื่อมีpและPตามด้วยเส้นทแยงมุมด้านล่าง ในสตริงเชิงเส้นนี่หมายความว่าจะต้องมี 7 หรือ 9 ตัวอักษรระหว่างสองเบี้ย สิ่งนี้จับคู่กับ.{7}(..)?(เช่นจับคู่ 7 ตัวอักษรจากนั้นเลือกจับคู่อีกสองตัวเลือก)

เวทีการแข่งขันเช่นนั้นจะคืนจำนวนการแข่งขันที่พบ


เรื่อง "ควรจะสามารถเอาชนะได้ง่ายโดยบางอย่างเช่น Perl ที่การขยายตัวของตัวเลขเป็นสตริงของช่องว่าง (หรือตัวละครอื่น ๆ ) ไม่ได้ใช้เวลาถึง 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

Ruby, 145 123 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

Perl 5, 30 ไบต์

29, บวก 1 -peแทน-e

s/\d/1x$&/ge;$_=/p.{7}(..)?P/

ภาษา Perl คัดลอกของw0lf คำตอบของทับทิม


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 ไบต์

ปรับปรุงห้องอย่างแน่นอน ไม่ใช่การแข่งขันเพราะเยลลี่ถูกสร้างขึ้นก่อนคำถาม ขอบคุณ @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.