N × N 체스 판에는 몇 개의 Wazir를 배치 할 수 있습니까?


30

Wazir라는 새로운 요정 체스 조각 이 체스에 도입되었다고 가정 해보십시오 . Wazirs는 위치 ( x , y )에서 다음 위치로 이동할 수 있습니다 :
 ( x +1, y )
 ( x , y +1)
 ( x -1, y )
 ( x , y -1)

즉, 그들은 루크처럼 직교 적으로 움직이지만 왕처럼 한 번에 한 걸음 만 움직입니다. NxN 체스 판에 두 개의 화이자가 서로를 공격 할 수 없도록 얼마나 많은 화이자를 배치 할 수 있습니까?

 1 × 1 보드에는 그러한 조각이 하나만있을 수 있습니다.
 2 × 2 보드에는 2 개의 조각이있을 수 있습니다.
 3 x 3 보드에는 5 조각이있을 수 있습니다.

N이 주어지면 N × N 체스 판에 놓을 수있는 wazirs의 수를 반환하십시오.

이다 OEIS 순서 A000982 .

더 많은 테스트 사례

725

832

1005000


4
낙타는 루크에게, 왕은 여왕에게 무엇인가? 즉, 한 번에 한 단계 만 직교로만 이동할 수 있습니다.
Adám

2
@SashaR 적절한 코드 골프 챌린지로 질문을 다시 써도 될까요?
Adám

2
확실한! 그렇게하면 미래에 코딩 관련 질문에 단어를 쓰는 방법도 볼 수 있습니다
Sasha R

15
이 사이트의 신규 사용자로서 이번에는 매우 운이 좋았습니다. 이 사이트에 대한 많은 (주제 이외의) 프로그래밍 질문은 영구적으로 폐쇄 및 하향 투표되었으며 도전 과제로 편집되지 않았으며 이와 같이 투표되었습니다. 다른 사람들이 이미 설명했듯이이 사이트는 프로그래밍 경쟁 전용이며 숙제를 요구하기위한 것이 아닙니다. 다음 번에 일반적인 실수를 피하기 위해 챌린지를 게시하기 전에 샌드 박스 ( codegolf.meta.stackexchange.com/questions/2140/… )를 사용할 수 있습니다 . 보시다시피이 사이트의 대부분의 사용자는 "읽을 수없는"언어를 사용합니다.
user202729 년

16
이 질문은 낙타가 이미 더 긴 점프를 만드는 기사와 같은 조각 의 표준 요정 체스 이름이며 이미 설명 한 조각이 이미 요정 체스 이름 인 Wazir 이라는 점에서 혼란 스럽습니다 .
Mark S.

답변:


33

공백 , 45 바이트

   
	
		   
			 
 	  
   	
	      	 
	 	 	
 	

온라인으로 사용해보십시오!

그런데 여기에 ⌈n² / 2⌉ 공식이 옳다는 증거가 있습니다.

  • 우리는 항상 적어도 ⌈n² / 2⌉의 wazirs를 배치 할 수 있습니다 : 바둑판 패턴으로 배치하십시오! 왼쪽 상단 타일이 흰색이라고 가정하면 n × n 보드 에 ⌈n² / 2⌉ 흰색 타일과 ⌊n² / 2⌋ 검은 색 타일이 있습니다. 그리고 우리가 흰 타일에 wazirs를 놓으면, 두 wazair는 모두 검은 타일을“보는”것처럼 서로를 공격하지 않습니다.

    5 x 5 보드에 13 개의 wazir를 배치하는 방법은 다음과 같습니다 (각 W는 wazir 임).

              13 wazirs on a 5 × 5 board

  • 우리는 더 잘 할 수 없습니다 : 바둑판을 임의로 2 × 1 도미노 조각으로 바둑판 식으로 배열하십시오. 선택적으로 홀수 길이 체스 판의 마지막 모서리에 1 × 1 조각을 사용하십시오.

              domino cover of a 5 × 5 board

    체스 판을 덮기 위해서는 ⌈n² / 2⌉ 도미노가 필요합니다. 분명히, 하나의 도미노에 두 개의 wazir를두면 서로 공격 할 수 있습니다! 각 도미노는 단지 우리가 할 수없는 의미를 가장 한 지르에 포함 할 수 있도록 가능한 보드에 대한 자세한 ⌈n² 이상 / 2⌉ wazirs 놓습니다.


마지막 부분에 비둘기 구멍 원리가 필요하지 않습니다. 타일 당 정확히 ⌈n² / 2⌉, 타일 당 최대 낙타가 있으므로 최대 ⌈n² / 2⌉ 낙타가 있습니다.
ShreevatsaR

8
@ShreevatsaR x> ⌈n² / 2⌉ 낙타를 ⌈n² / 2⌉ 타일에 넣을 수없는 이유는 무엇입니까? 그것은 비둘기
구멍

2
처음에는 코드가로드되지 않았다고 생각하여 페이지를 새로 고쳤지만 여전히로드되지 않았습니다. 그런 다음 상단에 어떤 언어 이름이 쓰여 졌는지 깨달았습니다.
Arthur

7
당신이 가서 증거 그림에서 C를로 변경해 주셔서 감사합니다 W.
Giuseppe

4
또한 W는 WHITESPACE에 대한 답변과 함께 WHITE SPACES에 있습니다.
corsiKa



9

APL (Dyalog) , 9 7 6 바이트

이제 Xcoder 씨의 공식을 사용합니다.

이것은 N을 인수로 사용하는 익명의 접두사 암묵 함수입니다.

2÷⍨×⍨

온라인으로 사용해보십시오!

×⍨ 정사각형 N (점등 곱셈 셀카, 즉 자기 곱하기)

2÷⍨ 2로 나누다

 천장 (반올림)


와우 난 당신이 어떻게했는지 몰라! 논리를하지 않았지만 한숨
사샤 R

젠장, 누군가 이미 패턴을 알아 냈습니다.
Feathercrown

1
허, 방금 공식이 OEIS 페이지에 있다는 것을 깨달았습니다. 아마 그것을 연결해서는 안됩니다.
Feathercrown





5

C (gcc) , 23 18 17 바이트

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

온라인으로 사용해보십시오!

C (gcc) , 22 바이트 (정의되지 않은 동작을 사용하지 않음)

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

온라인으로 사용해보십시오!

어떤 사람들은 특정 컴파일러 플래그를 사용할 때 특정 컴파일러의 정의되지 않은 bahavior를 이용하는 것을 정말로 좋아하지 않습니다. 그렇게하면 바이트가 절약됩니다.


3
응답 IMO를 제공하는 이상한 방법이지만 바이트를 저장하려면 f (n) {n = n * n + 1 >> 1;}입니다.
Tahg

1
@Tahg 감사합니다; 그래도 어떤 방법으로 대답을 이상하게 제공합니까?
Jonathan Frech

2
입력 인수를 변경하는 것이 C로 값을 반환하는 일반적인 방법이라고 생각하지 않았습니다.
Tahg

2
@YSC 그러나 컴파일러의 견해로는 이해할 만하고 작동하는 실행 파일을 만듭니다.
Jonathan Frech

5
@YSC PPCG는 프로그램이 하나의 통역사에서 작동하면 유효한 제출물이라고 생각합니다. 온라인 통역사에서 작동하므로 더 이상 언급하지 않아도 유효합니다.
코너 O'Brien


4

파이썬 3 , 19 바이트

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

온라인으로 사용해보십시오!

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)

Mr. Xcoder 덕분에 -1 바이트


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

@ Mr.Xcoder 마른 세수의 감사
HyperNeutrino

무엇에 대해 lambda x:x*x+1>>1?
Alix Eisenhardt

또는 lambda x:x*x+1//2 면책 조항 : 나는이 언어의 구문이나 작동 순서를 모른다. 나는 //2 두 번 부정하는 대신
Dan Henderson

@DanHenderson 여전히 괄호가 필요합니다. 그렇지 않으면으로 구문 분석 (x*x) + (1//2)되므로 실제로 짧지 않습니다.
Skyler

4

x86_64 기계 언어 (Linux), 9 8 바이트

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

하려면 온라인으로보십시오! 다음 C 프로그램을 컴파일하고 실행하십시오.

#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 바이트

익명의 암묵적 접두사 기능.

2>.@%~*:

온라인으로 사용해보십시오!

*: 광장

>.…  2로 나눈
@ 후  천장 (반올림)
2%~


대체 솔루션 : <.@-:@*:*:<.@%2:
코너 오브라이언

2
@ ConorO'Brien‽ 2>.@%~*:어디서 어디서 얻었습니까? 나는 그것을 읽을 수 없습니다 – 나에게 라인 노이즈처럼 보인다…
Adám

>.@-:@*:내 투표를 얻습니다.
Jonah

1
@Jonah 쪼그리고 앉으면 낙타를 볼 수 있습니다.
Adám


3

R , 22 21 바이트

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

온라인으로 사용해보십시오!

제곱, 증분, 정수 나누기. 쉬워요.

stdin에서 입력; 공간 또는 줄 바꿈으로 구분 된 입력을 취할 수 있으며 각 입력 보드 크기에 대한 최대 wazirs를 계산합니다. 표준 출력으로 출력합니다.

plannapus 덕분에 -1 바이트


@plannapus 고정, 감사합니다.
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

Japt, 4 bytes

Been sitting on these since the challenge was closed.

²Ä z

Try it

Explanation: Square, add 1, floor divide by 2


Alternative

²ÄÁ1

Try it

Explanation: Square, add 1, bit-shift right by 1.


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

OCaml, 19 bytes

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

Try it online!

I'm a bit bummed the name got changed from "camels" to "wazirs" before I managed to write this, but I figured I'd post it anyway.


1

TI-Basic, 7 bytes

round(Ans²/2,0

Alternatively (8 bytes):

int(Ans²/2+.5

-int(-.5Ans² also works
Oki

@Oki It sure does. I just wish they had a ceil( function.
Timtech

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.