Có bao nhiêu Wazir có thể được đặt trên Bàn cờ N × N?


30

Giả sử một quân cờ cổ tích mới có tên Wazir được giới thiệu cho cờ vua. Wazir có thể di chuyển từ một vị trí ( x , y ) đến:
 ( x +1, y )
 ( x , y +1)
 ( x -1, y )
 ( x , y -1)

Đó là, họ di chuyển trực giao như tân binh, nhưng chỉ một bước một lần như nhà vua. Có bao nhiêu wazir như vậy có thể được đặt trên bàn cờ N × N để không có hai wazir nào có thể tấn công lẫn nhau?

 Trên bảng 1 × 1, chỉ có thể có 1 mảnh như vậy.
 Trên bảng 2 × 2, có thể có 2 miếng như vậy.
 Trên bảng 3 × 3, có thể có 5 miếng như vậy.

Cho N, trả về số lượng wazir có thể được đặt trên bàn cờ N × N.

Đây là trình tự OEIS A000982 .

Nhiều trường hợp kiểm tra

725

832

1005000


4
Vậy lạc đà là đối với Rook Vua là gì đối với Nữ hoàng? Tức là chỉ có thể di chuyển trực giao, và chỉ một bước tại một thời điểm.
Adám

2
@SashaR Tôi có thể viết lại câu hỏi của bạn như một thử thách golf đúng không?
Adám

2
Chắc chắn rồi! Bằng cách đó, tôi cũng có thể thấy cách đặt câu hỏi liên quan đến mã hóa trong tương lai
Sasha R

15
Là người dùng mới của trang web này, lần này bạn đã rất may mắn. Rất nhiều câu hỏi lập trình (ngoài chủ đề) trên trang web này đã bị đóng và hạ cấp vĩnh viễn, không được chỉnh sửa như một thách thức và được nâng cấp như câu hỏi này. Như những người khác đã giải thích, trang web này chỉ dành cho các cuộc thi lập trình, không phải để yêu cầu bài tập về nhà. Bạn có thể sử dụng hộp cát (tại codegolf.meta.stackexchange.com/questions/2140/ mẹo ) trước khi đăng một thử thách để tránh những lỗi phổ biến vào lần tới; và lưu ý rằng hầu hết người dùng trên trang web này, như bạn đã thấy, sử dụng các ngôn ngữ "không thể đọc được".
dùng202729

16
Câu hỏi này khá khó hiểu ở chỗ Lạc đà đã là tên cờ thần tiên tiêu chuẩn cho một quân cờ giống như một hiệp sĩ thực hiện những cú nhảy dài hơn và quân cờ mà bạn mô tả đã có một tên cờ thần tiên: Wazir .
Đánh dấu S.

Câu trả lời:


33

Khoảng trắng , 45 byte

   
	
		   
			 
 	  
   	
	      	 
	 	 	
 	

Hãy thử trực tuyến!

Nhân tiện, đây là một bằng chứng cho thấy công thức ⌈n² / 2⌉ là chính xác.

  • Chúng tôi luôn có thể đặt ít nhất ⌈n² / 2⌉ wazirs : chỉ cần đặt chúng ra theo mô hình bàn cờ! Giả sử gạch trên cùng bên trái có màu trắng, có n² / 2⌉ gạch trắng và n² / 2⌋ gạch đen trên bảng n × n . Và nếu chúng ta đặt wazir trên các ô màu trắng, thì không có hai trong số chúng đang tấn công lẫn nhau, vì mỗi wazir chỉ nhìn thấy gạch đen.

    Dưới đây là cách chúng tôi đặt 13 wazir trên bảng 5 × 5 (mỗi W là một wazir).

              13 wazir trên bảng 5 × 5

  • Chúng ta không thể làm tốt hơn : hãy tùy ý xếp bàn cờ với các quân cờ 2 × 1, tùy ý sử dụng quân cờ 1 × 1 cho góc cuối cùng của bàn cờ có chiều dài kỳ lạ, như vậy:

              bìa domino của một bảng 5 × 5

    Chúng ta cần ⌉n² / 2⌉ domino để phủ lên bàn cờ. Rõ ràng, đặt hai wazir lên một domino để chúng có thể tấn công lẫn nhau! Vì vậy, mỗi domino chỉ có thể chứa tối đa một wazir, có nghĩa là chúng ta không thể đặt nhiều hơn ⌈n² / 2⌉ wazir trên bảng.


Bạn không cần nguyên tắc pigeonhole cho phần cuối cùng: bạn có chính xác ⌈n² / 2⌉ gạch, và nhiều nhất là lạc đà trên mỗi gạch, vì vậy bạn có tối đa n² / 2⌉ lạc đà.
ShreevatsaR

8
@ShreevatsaR Điều gì đảm bảo cho bạn rằng bạn không thể đặt x> ²n² / 2⌉ con lạc đà trong n² / 2⌉ gạch? Đó là nguyên tắc chim bồ câu ...
frarugi87

2
Lúc đầu tôi nghĩ mã không tải, vì vậy tôi đã làm mới trang và nó vẫn không hoạt động. Sau đó tôi nhận ra tên ngôn ngữ nào được viết ở trên cùng.
Arthur

7
Tôi đánh giá cao rằng bạn đã đi và thay đổi của bạn C's W' s trong hình minh họa bằng chứng của bạn.
Giuseppe

4
Tôi cũng đánh giá cao rằng tất cả các W đều có trên SPACES TRẮNG với câu trả lời trong WHITESPACE.
corsiKa



9

APL (Dyalog) , 9 7 6 byte

Bây giờ sử dụng công thức của ông Xcoder.

Đây là một hàm ẩn tiền tố ẩn danh, lấy N làm đối số.

2÷⍨×⍨

Hãy thử trực tuyến!

×⍨ bình phương N (lit. phép nhân selfie, tức là nhân với tự)

2÷⍨ chia cho 2

 trần nhà (làm tròn lên)


Wow! Tôi không biết bạn đã làm điều này như thế nào !! Không hiểu logic dù thở dài
Sasha R

Darn, ai đó đã tìm ra mô hình.
Feathercrown

1
Huh, chỉ cần nhận ra công thức là trên trang OEIS. Có lẽ không nên liên kết điều đó.
Feathercrown





5

C (gcc) , 23 18 17 byte

  • Đã lưu một byte nhờ Tahg ; chơi golf n/2+n%2để n+1>>1.
f(n){n=n*n+1>>1;}

Hãy thử trực tuyến!

C (gcc) , 22 byte (không sử dụng hành vi không xác định)

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

Hãy thử trực tuyến!

Một số người thực sự không thích khai thác bahavior của một trình biên dịch nhất định khi sử dụng các cờ biên dịch cụ thể. Làm như vậy sẽ tiết kiệm byte, mặc dù.


3
Cách kỳ lạ để cung cấp câu trả lời IMO, nhưng: f (n) {n = n * n + 1 >> 1;} để lưu một byte.
Tahg

1
@Tahg Cảm ơn; mặc dù theo cách nào bạn tìm thấy cách của tôi để cung cấp một câu trả lời kỳ lạ?
Jonathan Frech

2
Tôi không nghĩ việc thay đổi đối số đầu vào là một cách bình thường để trả về giá trị trong C.
Tahg

2
@YSC Tuy nhiên, theo ý kiến ​​của người biên soạn, có thể hiểu được và tạo ra một tệp thực thi hoạt động được.
Jonathan Frech

5
@YSC Chúng tôi tin ở đây trên PPCG rằng, nếu chương trình hoạt động trên một trình thông dịch, thì đó là một bài nộp hợp lệ. Nó hoạt động trên một trình thông dịch trực tuyến, do đó nó có giá trị mà không có bất kỳ nhận xét nào thêm.
Conor O'Brien


4

Python 3 , 19 byte

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

Hãy thử trực tuyến!

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 nhờ ông Xcoder


x**2->x*x
Ông Xcoder

@ Mr.Xcoder facepalm nhờ
HyperNeutrino

Thế còn lambda x:x*x+1>>1?
Alix Eisenhardt

Hoặc lambda x:x*x+1//2 Tuyên bố miễn trừ trách nhiệm: Tôi không biết cú pháp hoặc thứ tự hoạt động của ngôn ngữ này, vì vậy tôi đoán; Tôi đang nói thêm 1 trước bạn //2 thay vì phủ định hai lần.
Dan Henderson

@DanHenderson Bạn vẫn cần dấu ngoặc đơn nếu không nó được phân tích cú pháp (x*x) + (1//2), vì vậy nó không thực sự ngắn hơn.
Skyler

4

ngôn ngữ máy x86_64 (Linux), 9 8 byte

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

Để thử trực tuyến! , biên dịch và chạy chương trình C sau.

#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 byte

Chức năng tiền tố ẩn danh.

2>.@%~*:

Hãy thử trực tuyến!

*: Quảng trường

>. trần (lên tròn)
@ sau khi
2... %~ người chia làm hai


Các giải pháp thay thế: <.@-:@*:*:<.@%2:
Conor O'Brien

2
@ ConorO'Brien 2>.@%~*:Tôi đã lấy nó từ đâu? Tôi không thể đọc được điều đó - có vẻ như tiếng ồn đối với tôi
Adám

>.@-:@*:được bình chọn của tôi.
Giô-na

1
@Jonah Nếu bạn nheo mắt, bạn có thể thấy một con lạc đà.
Adám


3

R , 22 21 byte

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

Hãy thử trực tuyến!

Bình phương, tăng, chia số nguyên. Dễ như ăn bánh.

Đầu vào từ stdin; nó có thể lấy không gian hoặc đầu vào được phân tách bằng dòng mới và nó sẽ tính toán các wazir tối đa cho mỗi bảng đầu vào. Đầu ra cho thiết bị xuất chuẩn.

-1 byte nhờ vào plannapus


@plannapus đã sửa, cảm ơn bạn.
Giuseppe






2

Khối , 11 byte

Iu*:^\)2,O@

Heheh, :^\)

Hãy thử trực tuyến!

Mở rộng đến khối sau:

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

Đó là cùng một thuật toán mà nhiều người sử dụng.

  • ^Iu : đọc trong đầu vào dưới dạng int và thay đổi hướng
  • :* : dup top của stack, nhân lên
  • \) : thay đổi hướng, tăng
  • 2, : đẩy 2, chia số nguyên
  • O@ : in đầu ra như int, chương trình kết thúc.





1

Japt , 4 byte

Đã ngồi trên những điều này kể từ khi thách thức đã kết thúc.

²Ä z

Thử nó

Giải thích: Hình vuông, thêm 1, chia tầng cho 2


Thay thế

²ÄÁ1

Thử nó

Giải thích: Hình vuông, thêm 1, bit-shift phải bằng 1.


1

Bình luận viên , 19 byte

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

Hãy thử trực tuyến!

Ai cần ngôn ngữ chơi golf? Tôi đã có những ngôn ngữ khó hiểu!

Phiên bản bị đánh cắp:

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động? Tôi sẽ giải thích, với đầu vào 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

OCaml , 19 byte

let f n=(n*n+1)/2;;

Hãy thử trực tuyến!

Tôi hơi bực mình vì cái tên đã được đổi từ "lạc đà" thành "wazirs" trước khi tôi có thể viết nó, nhưng tôi nghĩ rằng dù sao tôi cũng sẽ đăng nó.


1

TI-Basic, 7 byte

round(Ans²/2,0

Hoặc (8 byte):

int(Ans²/2+.5

-int(-.5Ans²cũng hoạt động
Oki

@Oki Chắc chắn là có. Tôi chỉ muốn họ có một ceil(chức năng.
Timtech

1

/// , 35 byte

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

Hãy thử trực tuyến!

Đưa đầu vào trong unary bằng ký hiệu *và đầu ra trong unary sử dụng ký hiệu A. Điều này được phép cho một số ngôn ngữ cụ thể, bao gồm /// ( meta )

Vì không có cách nào để nhận đầu vào trong ///, nên đầu vào phải được mã hóa cứng:

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

cho đầu vào = 4.


Giải thích: (trước khi đọc, bạn cần phải biết rằng cú pháp duy nhất của ////pattern/replacement/, mà thay thế mỗi sự xuất hiện của patternbằng replacement; và \cho thoát; nhân vật khác được in đến đầu ra)

Dành cho 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.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.