หมากฮอส: King Me?


14

ท้าทาย:

ให้หมากฮอสเอาท์พุทจำนวนน้อยที่สุดเท่าที่มันจะเอา (สมมติว่าดำไม่ขยับเลย) กับกษัตริย์ชิ้นแดงถ้าเป็นไปได้

กฎ :

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

การป้อนข้อมูล:

กระดานหมากรุกขนาด 8x8 พร้อมช่องว่างของกระดานที่กำหนดเป็นอักขระต่อไปนี้ (อย่าลังเลที่จะใช้ตัวเลือกอื่นตราบใดที่มันยังมีความสอดคล้องกัน):

. - ว่างเปล่า

R - ชิ้นสีแดง

B - ชิ้นสีดำ

เอาท์พุท:

ที่เล็กที่สุดจำนวนของการเคลื่อนไหวมันจะใช้ชิ้นส่วนสีแดงจะเป็น 'kinged' โดยการป้อนแถวของกษัตริย์แถวบนสุดของคณะกรรมการ (ด้านสีดำ) 0 ถ้าไม่มีการเคลื่อนไหวจะต้อง (ชิ้นสีแดงเริ่มต้นในแถวของกษัตริย์) หรือ ตัวเลขที่เป็นลบถ้ามันเป็นไปไม่ได้ที่จะเป็นราชาชิ้นสีแดง (เช่นสีดำตรงบริเวณนั้นเป็นแถวแรกทั้งหมด)

อินพุต 1:

. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
R . . . . . . .

เอาท์พุท 1:

7

อินพุต 2:

. . . . . . . .
. . . . . . . .
. . . . . B . .
. . . . . . . .
. . . B . . . .
. . . . . . . .
. B . . . . . .
R . . . . . . .

เอาท์พุท 2:

2

อินพุต 3:

. B . B . B . B
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
R . . . . . . .

เอาท์พุท 3:

-1

อินพุต 4:

. . . . . . . R
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
R . . . . . . .

เอาท์พุท 4:

0

อินพุต 5:

. . . . . . . .
. . . . . . . .
. . . . . . . .
. B . . B . . .
B . . . . B . .
. B . B . . . .
. . B . . B . .
. . . R R . . .

ผลลัพธ์ 5:

4

อินพุต 6:

. . . . . . . .
. . . . . . . .
. B . . . . . .
. . B . . . . .
. B . B . . . .
. . . . R . . .
. . . B . . . .
. . . . R . . .

เอาท์พุท 6:

2

อินพุต 7:

. . . . . . . .
. . . . . . . .
. . B . . . . .
. . . . . . . .
. . B . . . . .
. B . B . B . .
. . . . B . . .
. . . . . R . R

เอาท์พุท 7:

4

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

นี่คือดังนั้นรหัสที่สั้นที่สุดในหน่วยไบต์ชนะ


1
กรณีทดสอบที่สองไม่ควรเป็น 2 เนื่องจากคุณสามารถกระโดดสองครั้ง / สามครั้งได้หรือไม่
James

อาร์เรย์ของอาร์เรย์ของจำนวนเต็มเป็นอินพุตตกลงหรือไม่
Jonathan Allan

1
ฉันเพิ่มเอกสารทดสอบอีกหนึ่งเรื่องที่น่าจะพิสูจน์ได้ยาก มันเกี่ยวข้องกับการกระโดดหลายครั้งหลายชิ้นและกระโดดไปข้างหลังเพื่อให้ได้ทางออกที่ดีที่สุด
orlp

1
@ orlp หืมฉันจะบอกว่าไม่มีชิ้นส่วนสีแดงใด ๆ ที่ได้รับอนุญาตให้ย้ายไปด้านหลังเนื่องจากไม่มีพวกเขาเป็นกษัตริย์ (ดังนั้นประเด็นของความท้าทาย) แต่ดูเหมือนบางคนเล่นกับกฎที่อนุญาตให้ถ่ายภาพด้านหลังโดยไม่ใช่ - ชิ้น kinged ถ้าจับครั้งแรกไปข้างหน้า ฉันจะเพิ่มเข้าไปในกฎเนื่องจากฉันไม่ได้ตระหนักถึงสิ่งนี้มาก่อน
Yodle

1
ooooooooh คุณไม่ต้องเลือกแค่หนึ่งชิ้นสีแดงพวกเขาสามารถร่วมมือ! ฉันเข้าใจแล้ว
Greg Martin

คำตอบ:


4

JavaScript (ES6), 354 322 ไบต์

ใช้อาร์เรย์เป็นอินพุตด้วย:

  • 0 = ช่องว่าง
  • 1 = ชิ้นสีแดง
  • 2 = ชิ้นสีดำ

ส่งคืนจำนวนการเคลื่อนไหวที่เหมาะสมที่สุดหรือ 99 ถ้าไม่มีวิธีแก้ไข

มันเร็วมาก แต่สามารถตีกอล์ฟได้มากกว่านี้

F=(b,n=0,C=-1,i)=>b.map((v,f,X,T,x=f&7,y=f>>3)=>v-1||(y&&n<m?[-9,-7,7,9].map(d=>(N=c=X=-1,r=(d&7)<2,T=(t=f+d)>=0&t<64&&(x||r)&&(x<7||!r)?(!b[t]&d<0)?t:b[t]&1?N:b[t]&2&&(d<0&y>1|d>0&C==f)?(X=t,x>1||r)&&(x<6|!r)&&!b[t+=d]?c=t:N:N:N)+1&&(b[f]=b[X]=0,b[T]=1,F(b,n+!(C==f&c>N),c,1),b[f]=1,b[X]=2,b[T]=0)):m=n<m?n:m),m=i?m:99)|m

var test = [
  [ 0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    1,0,0,0,0,0,0,0
  ],
  [ 0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,2,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,2,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,2,0,0,0,0,0,0,
    1,0,0,0,0,0,0,0
  ],
  [ 0,2,0,2,0,2,0,2,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    1,0,0,0,0,0,0,0
  ],
  [ 0,0,0,0,0,0,0,1,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    1,0,0,0,0,0,0,0
  ],
  [ 0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,2,0,0,2,0,0,0,
    2,0,0,0,0,2,0,0,
    0,2,0,2,0,0,0,0,
    0,0,2,0,0,2,0,0,
    0,0,0,1,1,0,0,0
  ],
  [ 0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,2,0,0,0,0,0,0,
    0,0,2,0,0,0,0,0,
    0,2,0,2,0,0,0,0,
    0,0,0,0,1,0,0,0,
    0,0,0,2,0,0,0,0,
    0,0,0,0,1,0,0,0
  ],
  [ 0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,2,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,2,0,0,0,0,0,
    0,2,0,2,0,2,0,0,
    0,0,0,0,2,0,0,0,
    0,0,0,0,0,1,0,1
  ]
];

test.forEach((b, n) => {
  console.log("Test #" + (n + 1) + " : " + F(b));
});


99 อาจไม่เป็นไรฉันไม่สามารถจินตนาการได้ว่าวิธีการแก้ปัญหาที่แท้จริงคือการเคลื่อนไหว 99 ครั้งบนกระดาน 8x8 งานที่ดี!
Yodle
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.