สามารถวาง Wazirs บนกระดานหมากรุก N × N ได้กี่คน?


30

สมมติว่าชิ้นหมากรุกนางฟ้าใหม่ที่ชื่อว่า Wazir ได้รับการแนะนำให้รู้จักกับหมากรุก Wazirs สามารถย้ายจากตำแหน่ง ( x , y ) ไปที่:
 ( x +1, y )
 ( x , y +1)
 ( x -1, y )
 ( x , y -1)

นั่นคือพวกเขาเคลื่อนตัวแบบออโธกอนอิกเหมือนโกง แต่เพียงก้าวเดียวในเวลาเดียวกับราชา สามารถวาง wazirs บนกระดานหมากรุก N × N ได้กี่คนเพื่อที่จะไม่มีผู้โจมตีสองคนโจมตีกันได้

 บนกระดาน 1 × 1 สามารถมีได้เพียง 1 ชิ้นเท่านั้น
 บนกระดาน 2 × 2 สามารถมีได้ 2 ชิ้น
 บนกระดาน 3 × 3 สามารถมีได้ 5 ชิ้น

รับ N ส่งคืนจำนวน wazirs ที่สามารถวางบนกระดานหมากรุก N × N

นี่คือ OEIS ลำดับ A000982

กรณีทดสอบเพิ่มเติม

725

832

1005000


4
ดังนั้นอูฐจึงโกงสิ่งที่พระราชาทรงมีต่อพระราชินี? เช่นสามารถเคลื่อนที่แบบตั้งฉากได้และทำได้ครั้งละหนึ่งขั้นเท่านั้น
Adám

2
@SashaR ฉันขอเขียนคำถามของคุณอีกครั้งว่าเป็นความท้าทายของรหัสกอล์ฟที่เหมาะสมหรือไม่?
Adám

2
แน่นอน! ด้วยวิธีนี้ฉันจะได้เห็นวิธีการเข้ารหัสคำถามที่เกี่ยวข้องในอนาคต
Sasha R

15
ในฐานะผู้ใช้ใหม่ของไซต์นี้คุณโชคดีมากในครั้งนี้ คำถามการเขียนโปรแกรม (นอกหัวข้อ) จำนวนมากในเว็บไซต์นี้ถูกปิดและลดระดับลงอย่างถาวรโดยไม่ได้รับการแก้ไขว่าเป็นสิ่งที่ท้าทายและถูกยกระดับเช่นนี้ ตามที่คนอื่น ๆ อธิบายไว้แล้วไซต์นี้มีไว้สำหรับการแข่งขันการเขียนโปรแกรมเท่านั้นไม่ใช่เพื่อขอการบ้าน คุณสามารถใช้แซนด์บ็อกซ์ (ที่codegolf.meta.stackexchange.com/questions/2140/… ) ก่อนโพสต์คำถามเพื่อหลีกเลี่ยงข้อผิดพลาดทั่วไปในครั้งต่อไป และโปรดทราบว่าผู้ใช้ส่วนใหญ่ในเว็บไซต์นี้ตามที่คุณเห็นให้ใช้ภาษา "อ่านไม่ได้"
user202729

16
คำถามนี้เป็นคำถามสวยทำให้เกิดความสับสนในการที่อูฐมีอยู่แล้วชื่อนางฟ้าหมากรุกมาตรฐานชิ้นส่วนเช่นอัศวินที่ทำให้อีกต่อไปกระโดดเป็นและชิ้นส่วนที่คุณอธิบายแล้วมีชื่อหมากรุกนางฟ้า: อัลวา
Mark S.

คำตอบ:


33

ช่องว่างขนาด 45 ไบต์

   
	
		   
			 
 	  
   	
	      	 
	 	 	
 	

ลองออนไลน์!

นี่เป็นข้อพิสูจน์ว่าสูตร⌈n² / 2⌉นั้นถูกต้อง

  • เราสามารถวางอย่างน้อยazn² / 2⌉ wazirs : เพียงวางมันในรูปแบบกระดานหมากรุก! สมมติว่าแผ่นกระเบื้องด้านซ้ายบนเป็นสีขาวมีแผ่นกระเบื้องสีขาว⌈n² / 2⌉และแผ่นสีดำ⌊n² / 2⌋บนกระดานn × n และถ้าเราวาง wazirs ไว้บนแผ่นกระเบื้องสีขาวก็จะไม่มีใครโจมตีพวกเขาสองคนเพราะทุกคนมีเพียง "เห็น" กระเบื้องสีดำ

    นี่คือวิธีที่เราวาง 13 wazirs บนกระดาน 5 × 5 (แต่ละ w เป็น wazir)

              13 wazirs on a 5 × 5 board

  • เราไม่สามารถทำอะไรได้ดีกว่านี้ : ลองเรียงกระดานหมากรุกกับชิ้นส่วนโดมิโน 2 × 1 โดยเลือกใช้ชิ้นส่วน 1 × 1 สำหรับมุมสุดท้ายของกระดานหมากรุกที่มีความยาวคี่เช่น:

              domino cover of a 5 × 5 board

    เราต้องการแต้มโดมิโนcovern² / 2⌉เพื่อให้ครอบคลุมกระดานหมากรุก เห็นได้ชัดว่าวางสอง wazirs บนโดมิโนหนึ่งทำให้มันเพื่อให้พวกเขาสามารถโจมตีซึ่งกันและกัน! ดังนั้นแต่ละโดมิโนสามารถมีมากที่สุดคนหนึ่งอัลวาหมายถึงเราไม่สามารถเป็นไปได้วางมากกว่า⌈n² / 2⌉ wazirs บนกระดาน


คุณไม่จำเป็นต้องใช้หลักการของช่องพิราบสำหรับส่วนสุดท้าย: คุณมีไพ่ทั้งหมด⌈n² / 2 exactly และอูฐต่อแผ่นมากที่สุดดังนั้นคุณจึงมีอูฐ⌈n² / 2⌉มากที่สุด
ShreevatsaR

8
@ShreevatsaR อะไรทำให้คุณมั่นใจได้ว่าคุณไม่สามารถใส่ x> ⌉n² / 2⌉อูฐในแผ่น⌈n² / 2⌉? มันเป็นหลักการของช่องสำหรับนกพิราบ ...
frarugi87

2
ตอนแรกฉันคิดว่ารหัสไม่โหลดดังนั้นฉันจึงรีเฟรชหน้าเว็บและยังไม่ได้โหลด จากนั้นฉันก็รู้ว่าชื่อภาษาใดถูกเขียนไว้ด้านบน
อาร์เธอร์

7
ฉันซาบซึ้งที่คุณไปและเปลี่ยนคุณCเป็นWภาพพิสูจน์ของคุณ
Giuseppe

4
ฉันยังซาบซึ้งว่า W นั้นล้วนแล้วแต่อยู่ใน WHITE SPACES พร้อมคำตอบใน WHITESPACE
corsiKa


10

Prolog (SWI) , 22 19 ไบต์

บันทึกแล้ว 3 ไบต์ขอบคุณKevin Cruijssen

X*Y:-Y is(X*X+1)/2.

ลองออนไลน์!



2
@KevinCruijssen: Doh! ฉันแนะนำให้ผู้ใช้รายอื่นทำการเปลี่ยนแปลงแบบเดียวกัน แต่อย่างใดฉันก็ไม่ได้ทำตามคำแนะนำของตัวเอง ขอบคุณ :)
Emigna

9

APL (Dyalog), 9 7 6 bytes

Now uses Mr. Xcoder's formula.

This is an anonymous prefix tacit function which takes N as argument.

2÷⍨×⍨

Try it online!

×⍨ square N (lit. multiplication selfie, i.e. multiply by self)

2÷⍨ divide by 2

 ceiling (round up)


Wow!I have no idea how you did this !!Didn't get the logic thoughsigh
Sasha R

Darn, someone already found out the pattern.
Feathercrown

1
Huh, just realized the formula is on the OEIS page. Probably shouldn't have linked that.
Feathercrown





5

C (gcc), 23 18 17 bytes

  • Saved a byte thanks to Tahg; golfing n/2+n%2 to n+1>>1.
f(n){n=n*n+1>>1;}

Try it online!

C (gcc), 22 bytes (not using undefined behavior)

f(n){return n*n+1>>1;}

Try it online!

Some people really do not like exploiting a certain compiler's undefined bahavior when using specific compiler flags. Doing so does save bytes, though.


3
Odd way of providing an answer IMO, but: f(n){n=n*n+1>>1;} to save a byte.
Tahg

1
@Tahg Thanks; though in what way do you find my way of providing an answer odd?
Jonathan Frech

2
I didn't think changing the input argument was a normal way of returning a value in C.
Tahg

2
@YSC Yet in the compiler's opinion it is understandable and creates an executable which works.
Jonathan Frech

5
@YSC We believe here on PPCG that, if the program works on one interpreter, it is a valid submission. It works on an online interpreter, it is therefore valid without any further remarks.
Conor O'Brien


4

Python 3, 19 bytes

lambda x:-(-x*x//2)

Try it online!

lambda x:-(-x*x//2)  # Unnamed function
lambda x:            # Given input x:
            x*x      # Square
           -         # Negate
               //2   # Halve and Floor (equivalent of Ceil)
         -(       )  # Negate again (floor -> ceil)

-1 byte thanks to Mr. Xcoder


x**2 -> x*x
Mr. Xcoder

@Mr.Xcoder Facepalm thanks
HyperNeutrino

What about lambda x:x*x+1>>1 ?
Alix Eisenhardt

Or lambda x:x*x+1//2 Disclaimer: I don't know this language's syntax or order of operations, so I guessed; I'm saying add 1 before you //2 instead of negating twice.
Dan Henderson

@DanHenderson You still need parentheses otherwise it's parsed as (x*x) + (1//2), so that isn't actually shorter.
Skyler

4

x86_64 machine language (Linux), 9 8 bytes

0:       97                      xchg   %eax,%edi
1:       f7 e8                   imul   %eax
3:       ff c0                   inc    %eax
5:       d1 f8                   sar    %eax
7:       c3                      retq

To Try it online!, compile and run the following C program.

#include<stdio.h>
const char *f="\x97\xf7\xe8\xff\xc0\xd1\xf8\xc3";
int main() {
  for(int i=1; i<10; i++) {
    printf("%d\n", ((int(*)())f)(i));
  }
}

3

J, 8 bytes

Anonymous tacit prefix function.

2>.@%~*:

Try it online!

*: square

>. ceiling (round up)
@ after
2%~ dividing by two


Alternate solutions: <.@-:@*: and *:<.@%2:
Conor O'Brien

2
@ConorO'Brien 2>.@%~*:‽ Where did I get that from? I can't read that – looks like line noise to me…
Adám

>.@-:@*: gets my vote.
Jonah

1
@Jonah If you squint, you can see a camel.
Adám


3

R, 22 21 bytes

cat((scan()^2+1)%/%2)

Try it online!

Square, increment, integer divide. Easy peasy.

Input from stdin; it can take space or newline separated input and it will compute the max wazirs for each input boardsize. Output to stdout.

-1 byte thanks to plannapus


@plannapus fixed, thank you.
Giuseppe






2

Cubix, 11 bytes

Iu*:^\)2,O@

Heheh, :^\)

Try it online!

Expands to the following cube:

    I u
    * :
^ \ ) 2 , O @ .
. . . . . . . .
    . .
    . .

Which is the same algorithm that many use.

  • ^Iu : read in input as int and change directions
  • :* : dup top of stack, multiply
  • \) : change direction, increment
  • 2, : push 2, integer divide
  • O@ : print output as int, end program.






1

Commentator, 19 bytes

//{-//-}! {-#  -}<!

Try it online!

Who needs golfing languages? I've got confusing languages!

Ungolfed version:

5//{-8}//{5-}
print(10!= 5)
x={-1,3,4} # Smiley :-}
print(5<!=10)*/ # Weird comparision.

Try it online!

How does it work? I'll explain, with input 5

//                         - Take input.                           Tape: [5 0 0]
  {-//-}!                  - Square the input.                     Tape: [25 0 0]
  {-                         - Move one along the tape
    //                       - Copy the input to the tape.         Tape: [5 5 0]
      -}                     - Move one back along the tape
        !                    - Take the product of the tape.       Tape: [25 5 0]
         <space>           - Increment the tape head.              Tape: [26 5 0]
                 {-#  -}<! - Halve the tape head (floor division). Tape: [13 2 0]
                 {-          - Move one along the tape
                   #         - Set the tape head to 2.             Tape: [26 2 0]
                      -}     - Move one back along the tape
                        <!   - Reduce the tape by floor division.  Tape: [13 2 0]



1

///, 35 bytes

/I///,*/+,//+/I//**,/,A//*/A//,//,I

Try it online!

Takes input in unary using symbol *, and output in unary using symbol A. This is allowed for some specific languages, including /// (meta)

Because there is no way to take input in ///, input should be hardcoded:

/I/«put input here»//,*/+,//+/I//**,/,A//*/A//,//,I

for input = 4.


Explanation: (before reading, you need to know that the only syntax of /// are /pattern/replacement/, which replace every occurence of pattern by replacement; and \ for escaping; other characters is printed to output)

For n=4:

/I/****//,*/+,//+/I//**,/,A//*/A//,//,I    Start program.
/I/****/                                   Replace all `I` in the program by the input.

/,*/+,//+/****//**,/,A//*/A//,//,****      Remaining part of the program.
/,*/+,/                                    Use the `,` as a scanner, scan through `*` after it and convert to `+`.
       /+/****//**,/,A//*/A//,//++++,      Note that only `*` in the second group is affected.
       /+/****/                            Replace all `+` (which is just created) by `n` asterisks (from the first `I` group)

/**,/,A//*/A//,//****************,         Now at the last of the program before the `,` there are `n²` asterisks.
/**,/,A/                                   Scan the `,` to the left to perform division by 2:
                                           replace each `**` by a `A` as the scanner `,` pass through.
/*/A//,//,AAAAAAAA                         Remaining program.
/*/A/                                      If there is any `*` remaining (if `n²` is odd), replace it with `A`.
     /,//                                  Remove the scanner `,`.
          AAAAAAAA                         Output the result.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.