一个N×N棋盘上可以放置多少个Wazirs?


30

假设将名为Wazir 的新童话棋子引入国际象棋。游荡者可以从(xy)位置移动到:
 (x +1,y
 (xy +1)
 (x -1,y
 (xy -1)

也就是说,它们像车子一样正交移动,但一次只能像国王一样移动一步。在N×N棋盘上可以放置多少个这样的游击手,以使两个游击手不能互相攻击?

 在1×1的板上,只能有1个这样的棋子。
 在2×2板上,可以有2个这样的块。
 在3×3板上,可以有5个这样的块。

给定N,返回可以放置在N×N棋盘上的游标的数量。

这是OEIS序列A000982

更多测试案例

725

832

1005000


4
那么骆驼对白鸦来说就像国王对女王一样?即只能正交移动,一次只能移动一个步骤。
2015年

2
@SashaR我可以将您的问题重写为正确的高尔夫挑战代码吗?
2015年

2
当然!这样,我还可以看到将来如何对相关问题进行单词编码
Sasha R

15
作为该站点的新用户,这次您幸运。该站点上的许多(离题)编程问题都已永久关闭和投票,而不是像挑战一样被编辑和挑战。正如其他人已经解释的那样,该站​​点仅用于编程比赛,而不是要求作业。您可以在发布挑战之前使用沙箱(位于codegolf.meta.stackexchange.com/questions/2140/…),以避免下次再次出现常见错误;并请注意,如您所见,该站点上的大多数用户使用“不可读”语言。
user202729

16
这个问题非常令人困惑,因为骆驼已经是像骑士这样跳远跳的棋子的标准童话国际象棋名称,而您描述的棋子已经有了童话国际象棋名称:Wazir
Mark S.

Answers:


33

空格,45字节

   
	
		   
			 
 	  
   	
	      	 
	 	 	
 	

在线尝试!

顺便说一下,这里证明⌈n²/2⌉公式正确。

  • 我们总是可以放置至少⌈n²/2⌉个wazirs:只需以棋盘状图案布置它们即可!假设左上角的瓷砖为白色,则n×n板上有⌈n²/2⌉白色瓷砖和⌊n²/2⌋黑色瓷砖。而且,如果我们将游击手放在白色瓷砖上,则不会有两个相互攻击,因为每个游骑兵只会“看到”黑色瓷砖。

    这是我们在5×5板上放置13个wazirs的方式(每个W是wazir)。

              13 wazirs on a 5 × 5 board

  • 我们不能做得更好:让我们任意用2×1多米诺骨牌平铺棋盘,或者在奇长棋盘的最后一角使用1×1棋盘格,如下所示:

              domino cover of a 5 × 5 board

    我们需要⌈n²/2⌉多米诺骨牌来覆盖棋盘。显然,在一个多米诺骨牌上放两个守卫者就可以使他们互相攻击!因此,每个骨牌只能包含最多一个瓦齐尔,这意味着我们不能可能将超过⌈n²/2⌉wazirs在黑板上。


最后一部分不需要信鸽原理:您拥有精确的⌈n²/2⌉瓦片,每个瓦片最多有骆驼,因此您最多有⌈n²/2⌉骆驼。
ShreevatsaR

8
@ShreevatsaR是什么确保您不能将x>⌈n²/2⌉骆驼放在⌈n²/2⌉瓷砖中?这是
信鸽的

2
我以为起初代码没有加载,所以我刷新了页面,但仍然没有加载。然后我意识到什么语言名称写在顶部。
亚瑟

7
感谢您在证明图中将您的更改CW
朱塞佩

4
我也很欣赏W都在白色空间中,并在WHITESPACE中给出了答案。
corsiKa



9

APL(Dyalog)9 7 6字节

现在使用Xcoder先生的公式。

这是一个匿名前缀默认函数,以N为参数。

2÷⍨×⍨

在线尝试!

×⍨ 平方N(照明自拍,即乘以自己)

2÷⍨ 除以2

 天花板(向上)


哇!我不知道你是怎么做到的!!虽然叹了口气
Sasha R

该死,有人已经发现了这种模式。
Feathercrown

1
呵呵,刚意识到公式在OEIS页面上。可能不应该链接到该链接。
Feathercrown


6

dc,6个字节

2^2~+p

2^正方形 2~:除以2,先推商再乘余数; +p:将余数添加到商并打印。

在线尝试!




5

C(gcc)23 18 17字节

  • 感谢Tahg节省了一个字节;打高尔夫球n/2+n%2n+1>>1
f(n){n=n*n+1>>1;}

在线尝试!

C(gcc),22个字节(不使用未定义的行为)

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

在线尝试!

当使用特定的编译器标志时,有些人真的不喜欢利用某个编译器的未定义行为。但是,这样做确实可以节省字节。


3
提供答案IMO的奇怪方法,但是:f(n){n = n * n + 1 >> 1;}保存一个字节。
塔赫格

1
@Tahg谢谢;尽管您觉得我提供答案的方式有些奇怪吗?
乔纳森·弗雷希

2
我不认为更改输入参数是在C中返回值的正常方法
。– Tahg

2
@YSC然而,在编译器看来,它是可以理解的,并创建了一个有效的可执行文件。
乔纳森·弗雷希

5
@YSC我们在PPCG上认为,如果该程序可以使用一个口译员,则表示该提交是有效的。它可以在在线解释器上运行,因此有效,无需任何其他说明。
Conor O'Brien


4

Python 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)

-1字节感谢Xcoder先生


x**2->x*x
Xcoder先生17年

@ Mr.Xcoder Facepalm感谢
HyperNeutrino

lambda x:x*x+1>>1
艾力克斯·艾森哈特

lambda x:x*x+1//2 免责声明:我不知道该语言的语法或操作顺序,所以我猜到了;我是说在您之前加1, //2 而不是两次否定。
丹·亨德森

@DanHenderson您仍然需要括号,否则将其解析为(x*x) + (1//2),因此实际上并不短。
斯凯勒

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

R22 21字节

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

在线尝试!

平方,增量,整数除法。十分简单。

来自stdin的输入;它可以使用空格或换行符分隔的输入,并且将计算每个输入电路板尺寸的最大游标。输出到标准输出。

-1字节归功于Plannapus


@plannapus已修复,谢谢。
朱塞佩






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.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.