เขาวงกตกระดานหมากรุก


14

ชิ้นหมากรุก (พระมหากษัตริย์พระราชินี rooks บิชอปและอัศวิน) และเบี้ยอยู่บนกระดาน แต่ไม่ได้อยู่บนa1หรือh8ตาราง งานของคุณคือการเดินทางจากช่องว่างa1ไปยังช่องว่างh8 ที่ว่างผ่านช่องว่างเปล่าเพียงช่องเดียว กฎของการเคลื่อนไหวมีดังนี้:

  1. คุณสามารถดำเนินการต่อจากจัตุรัสที่ว่างเปล่าไปยังจัตุรัสที่ว่างถัดจากนั้น (อันดับเดียวกัน, ไฟล์ถัดไปหรือก่อนหน้า; หรือไฟล์เดียวกัน, ถัดไปหรือก่อนหน้าอันดับ)
  2. คุณสามารถดำเนินการต่อจากสี่เหลี่ยมจัตุรัสที่ว่างเปล่าไปยังจตุรัสที่ว่างใด ๆ ในแนวทแยงมุมถัดจากนั้น (อันดับถัดไปหรือก่อนหน้าไฟล์ถัดไปหรือก่อนหน้า) โดยมีเงื่อนไขว่าสี่เหลี่ยมมุม catty ประกอบด้วย (a) เบี้ยสองตัวหรือ (b) เบี้ย / ชิ้น สี. (สองชิ้นที่ไม่ได้จำนำหรือชิ้นส่วนที่ไม่ได้จำนำและจำนำที่มีสีเดียวกันนั้นแข็งแกร่งพอที่จะขัดขวางความคืบหน้าของคุณข้ามมุมได้ แต่ตัวเบี้ยสองตัวนั้นไม่ได้และชิ้น / เบี้ยที่มีสีตรงกันข้ามไม่ทำงาน คอนเสิร์ตเพื่อกีดกันทางของคุณ) ตัวอย่างเช่นหากคุณอยู่บนc4และd5ว่างเปล่าคุณสามารถดำเนินการต่อได้หากc5และd4มีเบี้ยหรือมีชิ้น / เบี้ยสีตรงข้าม ดูส่วน "ตัวอย่างเส้นทแยงมุม" ด้านล่างสำหรับรูปภาพ

อินพุต

คำอธิบายกระดานของFEN นั่นคือการป้อนข้อมูลจะเป็นสตริงที่รวมถึงรายละเอียดของการจัดอันดับ8 , เฉือน ( /) รายละเอียดของการจัดอันดับ7 , เฉือน, ... , และรายละเอียดของการจัดอันดับ1 คำอธิบายของแต่ละระดับประกอบด้วยตัวเลขและตัวอักษรที่วิ่งจากไฟล์aถึงไฟล์hโดยที่ตัวอักษรระบุชิ้นและเบี้ย (คนดำp= จำนำ, n= อัศวิน, b= บาทหลวง, r= โกง, q= ราชินี, k= ราชาและขาว คือรุ่นที่เป็นตัวพิมพ์ใหญ่เหมือนกัน) และตัวเลขจะระบุจำนวนของช่องว่างที่ต่อเนื่องกัน ตัวอย่างเช่นrnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNเป็นกระดานหลังจากย้ายชั้นหนึ่ง (จำนำของกษัตริย์ถึงe4) ในเกมหมากรุก

a1และh8จะว่างเปล่าในอินพุต เช่นเครื่องหมายทับแรกมีตัวเลขอยู่ก่อนหน้าและเครื่องหมายทับสุดท้ายมีตัวเลขหลัง

เอาท์พุต

ความจริงหรือเท็จแสดงว่าเส้นทางที่ประสบความสำเร็จไปยังh8นั้นเป็นไปได้หรือไม่

หากการป้อนข้อมูลไม่ใช่คำอธิบายของคณะกรรมการ FEN ที่ถูกต้อง (หมายถึงสิ่งที่ตรงกับคำอธิบายของฉันด้านบน) หรือหากครอบครองa1หรือh8ดังนั้นผลลัพธ์จะเป็นอะไรก็ได้ (ในคำอื่น ๆ : คุณอาจถือว่าอินพุตตรงตามข้อกำหนดข้างต้น)

เกณฑ์การให้คะแนน

นี่คือรหัสกอล์ฟ: ไบต์ที่น้อยที่สุดชนะ

ตัวอย่างอินพุตและเอาต์พุต

โปรดทราบว่ารหัสของคุณจะต้องใช้งานได้กับอินพุตที่ถูกต้องทั้งหมดไม่เพียง แต่ตัวอย่างเท่านั้น

เพิ่มพื้นที่และหลังจากแต่ละหนองที่จะเห็นภาพได้ที่w 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- มีเส้นทางa1 , B2 , B3 , B4 , B5 , B6 , B7 , c8 , D7 ( ไม่ e8ที่ปิดกั้น แต่) d6 , D5 , D4 , D3 , D2 , D1 , E1 , F2 , F3 , f4 , f5 , f6 , f7 , f8 , g8 , h8
  • 8/8/KKKKK3/K3K3/K1K1p3/Kp1K4/K1KK4/2KK4 - ตัวอย่างที่สแควร์ที่ถูกบล็อก ณ จุดหนึ่งต้องถูกส่งผ่านในภายหลัง (เพื่อให้แน่ใจว่าคุณไม่ได้ตั้งค่าสแควร์สว่าไม่สามารถใช้ได้)
  • K1k1K1K1/1K1k1K1k/K1K1k1K1/1k1K1K1k/K1k1K1k1/1K1k1k1K/K1K1k1K1/1k1k1K1k- มีเส้นทางเดียวผ่าน (เพียงตามจมูกของคุณ: มีเพียงหนึ่งตารางที่จะย้ายไปที่แต่ละขั้นตอนเว้นแต่จะก้าวถอยหลังไป) นี่เป็นตัวอย่างที่สี่เหลี่ยมถูกบล็อก ณ จุดหนึ่ง แต่จำเป็นในภายหลัง

ตัวอย่างปลอมแปลง

  • 6Q1/5N2/4Q3/3N4/2Q5/1N6/2Q5/1N6 - ความพยายามใด ๆ ที่ทางเดินจะต้องผ่านชิ้นส่วนที่มีสีเดียวกันสองแนวตั้ง
  • N1q1K1P1/1R1b1p1n/r1B1B1Q1/1p1Q1p1b/B1P1R1N1/1B1P1Q1R/k1k1K1q1/1K1R1P1r- วิธีเดียวในการผ่านa8-h1 diagonal นั้นอยู่ที่f2-g3แต่นั่นต้องผ่าน passage ผ่านe1-d2หรือf2-e3ซึ่งเป็นไปไม่ได้
  • 4Q3/4q3/4Q3/5Q2/6Q1/3QqP2/2Q5/1Q6
  • 4q3/4Q3/4q3/5q2/6q1/3qQp2/2q5/1q6

ตัวอย่างเส้นทแยงมุม

ในกรณีที่ร้อยแก้วด้านบนไม่ชัดเจนนี่เป็นภาพบางส่วน

เส้นทแยงมุมพอควร

เบี้ยที่มีสีเดียวกัน เบี้ยสีตรงข้าม สีตรงข้าม

เส้นทแยงมุมไม่สามารถใช้ได้

โกงและจำนำที่มีสีเดียวกัน ก้านที่มีสีเดียวกัน


ฉันขอโทษฉันไม่แน่ใจเกี่ยวกับกฎกอล์ฟมาตรฐาน: จะเกิดอะไรขึ้นถ้าคุณใส่สตริงที่ผิดกฎหมาย พฤติกรรมใด ๆ ที่อาจเกิดขึ้น?
alex berne

@alexberne ฉันเชื่อว่านี่ครอบคลุม: "รหัสของคุณจะต้องใช้งานได้กับอินพุตที่ถูกต้องทั้งหมด"
Rainbolt

@alexberne ฉันได้แก้ไขแล้ว ชัดเจนหรือไม่
msh210

ใช่ขอบคุณ. ฉันใหม่ที่นี่ดังนั้นมันอาจจะเป็นสิ่งที่มีประโยชน์สำหรับนักกอล์ฟ แต่สำหรับฉันมันไม่ชัดเจน :)
alex berne

แค่อยากจะบอกว่าขอบคุณสำหรับปริศนาที่ยอดเยี่ยม @ msh210 ฉันไม่เข้าใจว่าทำไมไม่มีคำตอบเพิ่มเติม
Joffan

คำตอบ:


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 สีดำเป็นลบ จำนำได้รับการยอมรับโดย 'P' & 'p' มีรหัสตัวอักษรหารด้วย 8

'X (7,0) = 1', การตั้งค่าa1 ที่สามารถเข้าถึงได้คือจุดเริ่มต้นของการตรวจสอบเส้นทาง นี่เป็นการสแกนบอร์ดซ้ำ ๆ เพื่อพยายามเพิ่มช่องสี่เหลี่ยมที่สามารถเข้าถึงได้จากช่องสี่เหลี่ยมที่ทำเครื่องหมายเป็นเข้าถึงได้ (1) การเข้าใช้งานในแนวทแยงและการครอบครองถูกตรวจสอบใน IF + ลอจิก -Cal ซึ่งครั้งหนึ่งเคยอาศัยอยู่ในฟังก์ชั่น แต่ตอนนี้อยู่ในลูปเพื่อนบ้านซ้อนกัน การตรวจสอบการเข้าถึงในแนวทแยงนั้นขึ้นอยู่กับผลิตภัณฑ์ของสี่เหลี่ยมมุมคิตตี้สองอันซึ่งจะอยู่ที่ 6 หรือมากกว่าหากชิ้นมีสีเดียวกันและอย่างน้อยหนึ่งชิ้นเป็นเบี้ยไม่ได้จำนำ

โทรในสเปรดชีต ส่งกลับค่าใน X (0,7) - 1 ถ้าh8สามารถเข้าถึงได้และ 0 ถ้าไม่ใช่ - ซึ่ง Excel รู้จักว่าเป็นความจริง / เท็จ = IF (Z (C2), "ใช่", "ไม่")

ป้อนคำอธิบายรูปภาพที่นี่

ฉันอาจถูกพาออกไปด้วยการเขียนรหัสลงไปด้านบนดังนั้นนี่เป็นเวอร์ชั่นที่มีความคิดเห็นกึ่งอวดดี:

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 / ธันวาคมถอนหายใจและใช้สองสามกลม ในที่สุดฉันก็อาจจะติดอยู่กับเรื่องนี้ ....

การเข้ารหัสของชิ้น & สี่เหลี่ยมเปลี่ยนไป ไม่มีผลต่อความยาวรหัส

แก้ไข 3: คืนค่า (ปลอม) ฟังก์ชั่นลบCallไบต์ที่น่ารำคาญเหล่านั้นออกทั้งหมดและการปรับแต่งอื่น ๆ

แก้ไข 4: ทำลาย 500 ตัวใหญ่, วู - smooshed 3 สำหรับลูปเป็น 1

แก้ไข 5: Jiminy Cricket อีกหนึ่งหยดใหญ่เมื่อฉัน smooshed ทั้งสองฟังก์ชั่นเข้าด้วยกัน - การตรวจสอบการเข้าถึงในแนวทแยงของฉันผ่านไปยังช่องสี่เหลี่ยมที่อยู่ติดกันดังนั้น ...

แก้ไข 6: นิพพานศักดิ์สิทธิ์อีกหยดใหญ่ Buh-bye ไปยังฟังก์ชั่นภายนอกและทำให้กลมกลืน ... ฉันได้ไปครึ่งความยาวเดิมโพสต์ ....

แก้ไข 7: เพิ่มเวอร์ชันที่ไม่ได้แต่งแต้ม

แก้ไข 8: แก้ไขขั้นตอนการอ่านเพิ่มเติมอีกไม่กี่ดอลลาร์

แก้ไข 9: บีบสองสามสำนวนในเลือดหยดสุดท้าย

แก้ไข 10: Nextคำสั่งCompund ทำให้ข้อมูลไม่กี่ไบต์


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

3 บอร์ดที่ประสบความสำเร็จ 3 บอร์ดที่ถูกบล็อก

กระดานท้าทายสองอย่าง: h8สามารถเข้าถึงได้ทั้งสองแบบ:

  • P1Pq2p1 / 1P1R1R1p / 1K2R1R1 / 1p1p1p2 / p1b1b1n1 / 1B1B1N1k / Q1P1P1P1N1 / 1r1r1n2 - 10 ครั้งเพื่อแก้ไข
  • P1P3r1 / 1P1R2r1 / 1N1R1N2 / 1P1P1P2 / 1n1p1ppp / 1B1B4 / 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 มีจำนวนอักขระที่เหมือนกันดังนั้นฉันจะเล่นได้อย่างปลอดภัย แต่ถ้าฉัน bult บอร์ดคว่ำมันอาจใช้เวลามากกว่า 10 ผ่านและอาจมากกว่า 15 - เว้นแต่ฉันสำรวจกระดานคว่ำด้วยซึ่งจะมีค่าใช้จ่าย
Joffan

@ msh210 1 สังเกตเพิ่มเติม - 15 ลูปเป็นเพียงแค่พอที่จะวิเคราะห์ทั้งกระดานกรณีเลวร้ายที่สุด แต่ 10 ลูปก็เพียงพอที่จะได้รับสถานะของ h8 ดังนั้นฉันมีขอบขนาดใหญ่จริงๆ เหตุผลก็คือการค้นหาเส้นทางทำงานได้เร็วขึ้นมากในทิศทางของการประเมินเพิ่มแถว # และคอลัมน์ # - ตราบใดที่เส้นทางกำลังขึ้นหรือขวามันจะเสร็จสมบูรณ์ในรอบเดียว การเดินไปทางซ้ายหรือลงจะได้รับเพียงขั้นตอนเดียวต่อการผ่าน
Joffan

@ msh210 เป็นส่วนหนึ่งของการปรับปรุงในกระบวนการอ่าน - ซึ่งแคบเก็บสิ่งอำนวยความสะดวกในการแสดงความคิดเห็นในตอนท้ายของสตริง FEN - ฉันเพิ่มคณะกรรมการกลับรายการที่คุณแนะนำ - บอร์ดบางตอนใช้เวลากว่า 15 ผ่าน (สูงสุด 17) ฟังก์ชั่นเพิ่มขึ้นเป็น 30 รอบของบอร์ด
Joffan

@Joffan คุณสามารถปล่อย 3 Bytes ได้โดยการรวมอินสแตนซ์ทั้งหมด[some non-letter character] Toไว้ที่[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จากนั้นจะพบการเคลื่อนไหวทั้งหมด (ขอบกราฟ) ระหว่างช่องว่างจากนั้นตัวเลขที่การเคลื่อนไหวที่เป็นไปได้ (ไม่ใช่ช่องว่างที่เต็มไป) ประตู "สองชิ้นที่จะผ่านไปมาจากนั้นคิดออกว่าประตูเปิด (จำนำสีตรงข้าม) หรือปิด (สีเดียวกันและรวมถึงไม่จำนำ) จากนั้นจะผ่านเพื่อค้นหาสถานที่ที่สามารถเข้าถึงได้ด้วยเส้นทางจากช่องสี่เหลี่ยมด้านล่างซ้ายและหากเส้นทางสามารถเข้าถึงพื้นที่ 64 ได้ก็จะเป็นบอร์ดใช่


1
เย็น. คุณทดสอบกับตัวอย่าง FEN ของฉันในคำถามหรือไม่เพื่อให้แน่ใจว่าผลลัพธ์นั้นถูกต้องสำหรับแต่ละรายการ นอกจากนี้เนื่องจากคำถามนี้เป็นคำถามเกี่ยวกับกอล์ฟคุณควรตีกอล์ฟนี้ให้ดี หากไม่มีอะไรอื่นคุณสามารถกำจัดการเยื้อง (หรือทำให้มันเป็นช่องว่างหรือแท็บเดียวแทนที่จะเป็นสี่ช่องว่าง)? และ / หรือวางช่องว่างรอบ ๆ=? (ฉันไม่รู้ MATLAB: อาจเป็นไปไม่ได้เลย)
msh210

ใช่และฉันอาจทำบางอย่างในช่วงพักครั้งต่อไป ฉันทดสอบกับตัวอย่างทั้งหมดของคุณแล้วมีบางส่วน ฉันควรระบุว่าอย่างใด?
sintax

dunno; ฉันแค่สงสัย
msh210
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.