โจมตีควีนส์


26

ให้กระดานหมากรุกขนาด 8x8 มีค่าที่ต่างกันสองค่าโดยมีค่าหนึ่งเป็นสี่เหลี่ยมจัตุรัสที่ว่างเปล่าและอีกค่าหนึ่งเป็นราชินี ในตัวอย่างต่อไปนี้ฉันใช้ 0s เป็นสี่เหลี่ยมจัตุรัสที่ว่างเปล่าและ 1s เป็นควีน ตัวอย่างเช่น:

ควีนส์บนกระดานหมากรุก

ได้รับจาก

1 0 1 1 1 0 0 0
1 0 1 0 1 0 1 1
1 0 1 0 1 1 0 1
0 1 0 1 0 1 0 0
0 1 1 0 0 1 0 1
1 0 0 0 1 0 0 0
0 1 0 0 0 1 1 1
0 1 1 1 0 1 0 1

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

โจมตีราชินี

พบว่ามี 43 คู่ข้างต้นให้กรณีทดสอบต่อไปนี้:

Input:
1 0 1 1 1 0 0 0
1 0 1 0 1 0 1 1
1 0 1 0 1 1 0 1
0 1 0 1 0 1 0 0
0 1 1 0 0 1 0 1
1 0 0 0 1 0 0 0
0 1 0 0 0 1 1 1
0 1 1 1 0 1 0 1
Output: 43

ท้าทาย

เขียนโปรแกรมที่ให้สถานะกระดานแทนค่าที่แตกต่างกันสองค่าส่งออกจำนวนคู่ของควีนส์ที่โจมตีซึ่งกันและกันอย่างน้อยหนึ่งสแควร์ในระหว่างนั้น

  • คุณสามารถป้อนข้อมูลในรูปแบบใดก็ได้ที่สะดวกที่สุดที่ใช้ค่าสองค่าเพื่อแทนสี่เหลี่ยมและควีนที่ว่างเปล่าเช่นสตริง 64 "" s สำหรับสี่เหลี่ยมที่ว่างเปล่าและ "Q" s สำหรับควีนโดยแถวจากล่างขึ้นบนเป็น 8x8 เมทริกซ์ของ booleans รายการของจำนวนเต็ม 0 และ 1 ฯลฯ ตราบใดที่อธิบายไว้ในวิธีแก้ปัญหาของคุณ
  • เอาท์พุทเป็นจำนวนเต็ม
  • ใช้วิธีการ I / O มาตรฐานและช่องโหว่มาตรฐานที่ต้องห้าม
  • นี่คือรหัสกอล์ฟเพื่อให้ได้คำตอบที่สั้นที่สุดในจำนวนไบต์ที่ชนะ

กรณีทดสอบ:

ใช้รูปแบบ 0 และ 1 โดยที่ 0 เป็นสี่เหลี่ยมว่างเปล่าและ 1 เป็นราชินี:

Input:
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
0 0 0 0 0 0 0 0
Output: 0

Input:
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
Output: 0

Input:
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 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
Output: 1

Input:
0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 1 0 0 0
0 1 0 0 0 0 1 0
0 0 0 0 1 0 1 0
0 0 0 0 0 0 0 0
0 0 0 1 0 0 1 0
0 0 0 0 0 0 0 0
Output: 10

Input:
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 0 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
Output: 4

Input:
1 1 0 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 0 1 1 1
1 1 1 1 0 1 1 1
1 1 1 1 0 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
Output: 11

ฉันควรถามก่อนที่จะโพสต์รุ่นที่ 2 ของฉัน: 254สำหรับราชินีและ0สำหรับค่าอินพุตที่ยอมรับได้ของสี่เหลี่ยมจัตุรัสหรือเปล่า?
Arnauld

@Arnauld คุณสามารถป้อนข้อมูลในรูปแบบใดก็ได้ที่สะดวกที่สุดที่ใช้สองค่าเพื่อแสดงสี่เหลี่ยมและควีนที่ว่างเปล่า ดังนั้นก็ดีแน่นอน
JMigst

ขอบคุณ ฉันถามเพราะฉันคิดว่ากฎนี้อาจได้รับอนุญาตเล็กน้อยหากได้รับตัวอักษร ฉันสามารถขอให้ส่งสตริงที่มีรหัส JS ส่วนใหญ่สำหรับราชินีและเพียงประเมินว่าในโปรแกรม (แต่มันอาจถูกป้องกันโดยช่องโหว่เริ่มต้นฉันไม่แน่ใจ)
Arnauld

คำตอบ:


14

Python 2 , 105 ไบต์

lambda b:sum(b[i+d::d][:(8,7-i%8,i%8)[d%8%5]].find('1')*int(c)>0for i,c in enumerate(b)for d in[1,7,8,9])

ลองออนไลน์!

คำอธิบาย

เราใช้การป้อนข้อมูลที่เป็นสตริง 64 ตัวอักษรหรือ'0' '1'ด้วยการใช้สไลซ์สเต็ปเราโยน "เส้นสายตา" สี่เส้นจากราชินีทุกคนที่พบ ตัวอย่างเช่นเมื่อi = 10และd = 7ให้ทำเครื่องหมายราชินีเป็น♥และเลือกไพ่ตามb[i+d::d]█:

1 0 1 1 1 0 0 0
1 0  0 1 0 1 1
1  1 0 1 1 0 1
 1 0 1 0 1 0 
0 1 1 0 0 1  1
1 0 0 0 1  0 0
0 1 0 0  1 1 1
0 1 1  0 1 0 1

เห็นได้ชัดว่าเราไม่ต้องการให้วิสัยทัศน์ล้อมรอบกระดานเช่นนี้ b[i+d::d][:…]ดังนั้นเราคำนวณว่าห่างไกลขอบของคณะกรรมการที่อยู่ในแต่ละทิศทางและดูกระเบื้องที่

สำหรับคู่ของไพ่เรียงในทิศทางที่เรานับ:

ray.find('1')*int(c)>0

สิ่งนี้จะล้มเหลวทุกครั้ง

  • cไม่ใช่ราชินี หรือ
  • ราชินีที่รังสีนี้มองเห็นนั้นใกล้เกินไป ( findคืน 0); หรือ
  • รังสีนี้ไม่เห็นราชินี ( findส่งคืน −1)

ควีนแต่ละคู่จะได้รับการตรวจสอบเพียงครั้งเดียวเท่านั้นเนื่องจากรังสีจะถูกส่งต่อไปตามลำดับการอ่านเสมอจากราชินี "ก่อนหน้า" ไปเป็น "ภายหลัง"


10

JavaScript (ES7), 86 ไบต์

รับอินพุตเป็นอาร์เรย์ของจำนวนเต็ม 64 จำนวนที่มี254สำหรับราชินีและ0สำหรับสแควร์เปล่า

a=>[s=0,6,7,8].map(d=>a.map(g=(n,p)=>(p%8-(p+=~d)%8)**2<n%4?a[p]?s+=n&1:g(n/2,p):0))|s

ลองออนไลน์!

เวอร์ชันนี้ใช้การละเมิด underflow เลขคณิตเพื่อให้ได้เงื่อนไขการหยุดในส่วนที่เรียกซ้ำ


JavaScript (ES7), 89 ไบต์

รับอินพุตเป็นอาร์เรย์ 64 บิต

a=>[s=0,6,7,8].map(d=>a.map(g=(n,p,x)=>(p%8-(p+=~d)%8)**2>1|p<0?0:a[p]?s+=!x&n:g(n,p)))|s

ลองออนไลน์!

อย่างไร?

เราเรียก recursively function callback ชื่อที่map()จะเดินผ่านช่องสี่เหลี่ยมในทิศทางที่กำหนด แม้ว่าเราไม่ต้องการเนื้อหาของพารามิเตอร์ที่สามของการเรียกกลับ (อาร์เรย์map()ถูกเรียกใช้) แต่เราใช้โดยอ้อมเพื่อทราบว่าเป็นการทำซ้ำครั้งแรกหรือไม่

arr.map (ฟังก์ชันเรียกกลับ (currentValue [, index [, array]])

นี่คือตัวแปรxในรหัส

a =>                        // given the input array a[]
  [ s = 0,                  // initialize the sum s to 0
    6, 7, 8 ].map(d =>      // for each direction d in [0, 6, 7, 8]:
    a.map(g = (n, p, x) =>  //   for each square n at position p in a[]:
      (                     //     we are out of the board if:
        p % 8 -             //       - abs(p % 8 - p' % 8) is greater than 1
        (p += ~d) % 8       //         where p' = p - (d + 1)
      ) ** 2 > 1 |          //         (squaring is shorter than using Math.abs)
      p < 0 ?               //       - or p' is less than 0
        0                   //       if so, stop recursion
      :                     //     else:
        a[p] ?              //       if there's a queen on the target square:
          s +=              //         increment s if:
            !x &            //           x is undefined (this is not the 1st iteration)
            n               //           and n = 1 (there's a queen on the source square)
        :                   //       else:
          g(n, p)           //         do a recursive call to g(), with x undefined
    )                       //   end of inner map()
  ) | s                     // end of outer map(); return s

8

หอยทากขนาด 14 ไบต์

A
rdaa7\1\0+\1

ลองออนไลน์!

อินพุตเป็นรูปแบบ 0/1 โดยไม่มีช่องว่างภายในบรรทัด

หอยทากถูกสร้างขึ้นสำหรับรูปแบบ 2D ภาษาที่ตรงกับความท้าทายการออกแบบ สิ่งสำคัญที่สุดคือโดยค่าเริ่มต้นจะแสดงจำนวนการแข่งขันที่พบซึ่งเหมาะสำหรับความท้าทายนี้


A ตั้งค่าตัวเลือก "เส้นทางทั้งหมด" ดังนั้นหากราชินีอยู่ในหลายคู่แต่ละคู่เหล่านั้นจะสร้างการแข่งขัน

rdaa7ตั้งค่าทิศทางการแข่งขันเป็น S, SE, E และ NE การตั้งค่าทุกทิศทาง ( z) จะทำให้การนับซ้ำเป็นสองเท่า

\1\0+\1จับคู่ a 1จากนั้นอย่างน้อยหนึ่งตัว0และอีก1อัน


6

APL (Dyalog Classic) , 41 39 32 ไบต์

(+/+⌿-⌈⌿)2<⌿0⍪⊢,⍉,8 31⍴⊢,≠⍨,⌽,≠⍨

ลองออนไลน์!

≠⍨ คือ "ไม่เท่ากับตัวเอง" - เมทริกซ์ 8x8 ทั้งหมดเป็นศูนย์

⊢,≠⍨,⌽,≠⍨- ถ้าเมทริกซ์ดั้งเดิมคือABC...นิพจน์นี้จะคืนค่า:

A B C D E F G H 0 0 0 0 0 0 0 0 H G F E D C B A 0 0 0 0 0 0 0 0
I J K L M N O P 0 0 0 0 0 0 0 0 P O N M L K J I 0 0 0 0 0 0 0 0
Q R S T U V W X 0 0 0 0 0 0 0 0 X W V U T S R Q 0 0 0 0 0 0 0 0
Y Z A B C D E F 0 0 0 0 0 0 0 0 F E D C B A Z Y 0 0 0 0 0 0 0 0
G H I J K L M N 0 0 0 0 0 0 0 0 N M L K J I H G 0 0 0 0 0 0 0 0
O P Q R S T U V 0 0 0 0 0 0 0 0 V U T S R Q P O 0 0 0 0 0 0 0 0
W X Y Z A B C D 0 0 0 0 0 0 0 0 D C B A Z Y X W 0 0 0 0 0 0 0 0
E F G H I J K L 0 0 0 0 0 0 0 0 L K J I H G F E 0 0 0 0 0 0 0 0

8 31⍴ ปรับรูปร่างจาก 8x32 เป็น 8x31 โดยใช้องค์ประกอบตามลำดับแถวหลัก:

A B C D E F G H 0 0 0 0 0 0 0 0 H G F E D C B A 0 0 0 0 0 0 0
0 I J K L M N O P 0 0 0 0 0 0 0 0 P O N M L K J I 0 0 0 0 0 0
0 0 Q R S T U V W X 0 0 0 0 0 0 0 0 X W V U T S R Q 0 0 0 0 0
0 0 0 Y Z A B C D E F 0 0 0 0 0 0 0 0 F E D C B A Z Y 0 0 0 0
0 0 0 0 G H I J K L M N 0 0 0 0 0 0 0 0 N M L K J I H G 0 0 0
0 0 0 0 0 O P Q R S T U V 0 0 0 0 0 0 0 0 V U T S R Q P O 0 0
0 0 0 0 0 0 W X Y Z A B C D 0 0 0 0 0 0 0 0 D C B A Z Y X W 0
0 0 0 0 0 0 0 E F G H I J K L 0 0 0 0 0 0 0 0 L K J I H G F E

⊢,⍉, เพิ่มเมทริกซ์ดั้งเดิมและทรานสฟอร์มของมัน (เว้นวรรคเพื่อความชัดเจน)

A B C D E F G H  A I Q Y G O W E  A B C D E F G H 0 0 0 0 0 0 0 0 H G F E D C B A 0 0 0 0 0 0 0
I J K L M N O P  B J R Z H P X F  0 I J K L M N O P 0 0 0 0 0 0 0 0 P O N M L K J I 0 0 0 0 0 0
Q R S T U V W X  C K S A I Q Y G  0 0 Q R S T U V W X 0 0 0 0 0 0 0 0 X W V U T S R Q 0 0 0 0 0
Y Z A B C D E F  D L T B J R Z H  0 0 0 Y Z A B C D E F 0 0 0 0 0 0 0 0 F E D C B A Z Y 0 0 0 0
G H I J K L M N  E M U C K S A I  0 0 0 0 G H I J K L M N 0 0 0 0 0 0 0 0 N M L K J I H G 0 0 0
O P Q R S T U V  F N V D L T B J  0 0 0 0 0 O P Q R S T U V 0 0 0 0 0 0 0 0 V U T S R Q P O 0 0
W X Y Z A B C D  G O W E M U C K  0 0 0 0 0 0 W X Y Z A B C D 0 0 0 0 0 0 0 0 D C B A Z Y X W 0
E F G H I J K L  H P X F N V D L  0 0 0 0 0 0 0 E F G H I J K L 0 0 0 0 0 0 0 0 L K J I H G F E

2<⌿0⍪เพิ่ม 0s ไว้ด้านบนและเปรียบเทียบโดยใช้<ทุกองค์ประกอบเทียบกับองค์ประกอบด้านล่างดังนั้นเราจะได้ 1 สำหรับผู้นำ 1 ในทุกกลุ่มแนวตั้งของ 1s และเราได้ 0 จากทุกที่อื่น

+⌿-⌈⌿ ผลรวมตามคอลัมน์ลบจำนวนสูงสุดโดยคอลัมน์ - เราคำนวณจำนวนช่องว่างระหว่าง 1 กลุ่มในทุกคอลัมน์, 0 ถ้าไม่มี

+/ รวม


5

เยลลี่ , 22 20 ไบต์

t0ŒgL:2
Z,U;ŒD$€ẎÇ€S

ลองออนไลน์!


มันทำงานอย่างไร
lirtosiast

@lirtosiast ฉันจำไม่ได้ ...
user202729

@lirtosiast ลิงก์แรกนับจำนวนคู่ใน 1D ลิงก์ที่สองใช้ผลรวมของลิงค์แรกเหนือทุกบรรทัดในตาราง
user202729

3

เรติน่า 0.8.2 , 60 58 ไบต์

1
¶1$';___¶
_
$n$%`7$*_
(.)(?=.*;(_)*)(?<-2>.)*
$1
m`^10+1

ลองออนไลน์! รับอินพุตเป็นสตริงไบนารี่ 8 ตัวที่คั่นด้วยเครื่องหมายจุลภาค 8 ตัว แต่ส่วนหัวจะแปลงรูปแบบที่จัดให้สำหรับคุณ คำอธิบาย:

1
¶1$';___¶

สร้างสตริงย่อยทั้งหมดของบอร์ดโดยเริ่มจากราชินี เติมค่าตัวทำเครื่องหมายให้กับแต่ละสตริงย่อย แก้ไข: บันทึก 2 ไบต์โดยทิ้งสตริงขยะบางส่วนไว้ด้านหลัง; สิ่งเหล่านี้จะถูกละเว้นอย่างมีประสิทธิภาพ

_
$n$%`7$*_

แยกเครื่องหมายแต่ละตัวออกเป็นช่วงรวมและเพิ่ม 7 องค์ประกอบที่ไม่เป็นศูนย์

(.)(?=.*;(_)*)(?<-2>.)*
$1

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

m`^10+1

นับจำนวนรังสีทั้งหมดที่ผ่านอย่างน้อยหนึ่งตารางว่างก่อนที่จะพบกับราชินีอื่น


3

JavaScript (ES6) + SnakeEx , 38 ไบต์

s=>snakeEx.run('m:<*>10+1',s).length/2

'10111000\n10101011\n10101101\n01010100\n01100101\n10001000\n01000111\n01110101'จะเข้าในรูปแบบ กลายเป็นว่า SnakeEx ยังคงสามารถใช้งานได้นอกความท้าทายดั้งเดิม


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