这是输家吗?


19

在棋盘上有一个名为“回家”的游戏。在这个游戏中,两个玩家轮流移动一个棋子。关于如何移动作品有一些规则。转牌时,玩家必须进行以下任一动作来使n为正。

  • n个空格

  • 左边n个空格

  • n在左上方(对角线)间隔

将棋子移到棋盘左上角的玩家将赢得比赛。

现在,我们将定义丢失正方形的概念。在此视频中(我从中得到了这个主意),将输方定义为一个方格,在该方格上,任何开始转牌的玩家将被迫采取行动,允许对手强制获胜。丢失正方形的最简单示例是(1,2)处的正方形。(1,2)处的作品可以移动到以下任意位置。

插图

所有这些都为下一位玩家赢得胜利提供了直接途径。

同样可以得出结论,凡是具有一条通向输掉方格的单向方格的方格,都允许玩家从该方格开始,以强制获胜。这意味着,只要不离开亏损方格的任何方格也是亏损方格。

这使我们对损失平方的定义更加简洁:

丢失的正方形是一个不能从任何移动到达另一个丢失的正方形的正方形,而(0,0)是一个丢失的正方形。

任务

给定任意大小的棋盘上正方形的坐标,确定它是否为丢失的正方形。输出两个值,一个用于丢失平方,另一个用于其他平方。

这是因此答案将以字节计分,而字节数越少越好。

测试用例

这是常规的8 x 8棋盘(标记为0)上的所有丢失方格。

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

这是一个100 x 100板的图像,其中用黑色标记的丢失正方形(每个正方形是2像素x 2像素)。

100乘100板


2
我认为没有足够的测试用例来找到模式。我认为我看到了一个模式,但我不能肯定地说。是10, 7输家吗?是10, 8吗 那15, 11
DJMcMayhem

1
@WheatWizard您介意将图像放大一点吗?
暴民埃里克(Erik the Outgolfer)'17年

1
@WheatWizard我的意思是更大的像素...例如5x5像素而不是1x1,如果不是太难的话,可能还有一些网格(感谢100x100)
Erik the Outgolfer

2
也相关(返回最佳移动或发出位置丢失的信号)。
Zgarb

1
我认为,即使具有任意大的整数功能,也允许浮点数误差妨碍性能...
Jonathan Allan

Answers:


8

Python 3中112个 50 46 42字节

-4个字节感谢Jonathan Allan

-2个字节感谢xnor

lambda r,c:abs(r-c)*(3+5**.5)//2==max(r,c)

在线尝试!

根据Wythoff游戏中的平仓公式,并进行一些修改以生成明确的公式。我实际上完成了公式推导的正确方法后,便收到了说明。


您不能更改0<=xx>0并保存一两个字节吗?
乔纳森·弗雷希

@JonathanFrech必须为<=>=以便包含position 0, 0
notjagan

没错,只能保存一个字节
乔纳森·弗雷希

1
少一个字节,使用相同的不同实现:lambda r,c:int(abs(r-c)*(5**.5+1)**2/4)==max(r,c)
Jonathan Allan

1
/2//1看起来和一样//2
xnor

5

果冻,8 字节

ạ/×ØpḞ⁼Ṃ

在线尝试!,或将左上角的60乘60视为一个网格

怎么样?

Wythoff的游戏中,一个寒冷的职位是他的输家。[n,m]n = floor(kφ) = floor(mφ) - mm = floor(kφφ) = ceil(nφ) = n + k对于某个自然数时,坐标给出冷位置k,而黄金比例给出φ。前者n小于时m; 后者when m小于n(均保持0,0)。

k因此之间的绝对差nm,并且如果floor(abs(n-m)φ)=min(n,m)条件满足。

ạ/×ØpḞ⁼Ṃ - Link: list, c ([n,m])
 /       - reduce c by:
ạ        -   absolute difference = abs(n-m)
   Øp    - golden ratio yield
  ×      - multiply
     Ḟ   - floor
       Ṃ - minimum of c = min(n,m)
      ⁼  - equal?

2

JavaScript(ES6),64字节

f=(x,y,p=5**.5/2+.5)=>x<y?f(y,x):y/p%p<1&(y/p%p-x*p%++p)**2<1e-9

我现在知道这不是最好的技术,但是我必须自己提出来,因为在加载此页面后不久我就失去了互联网。(如果不是针对这些互联网问题,将会在不久前发布...)

在理想情况下,浮点精度不会成为问题,我可以节省9个字节:

f=(x,y,p=5**.5/2+.5)=>x<y?f(y,x):y/p%p<1&y/p%p==x*p%++p

如果JS支持Python的比较链,则可以再保存6个字节:

f=(x,y,p=5**.5/2+.5)=>x<y?f(y,x):y/p%p==x*p%++p<1

0

Pyth,39个字节

=SQL?!b0-byytb;q@myd+0.fqyZytZ@Q1)-F_Qh

我用一个命名函数(ew)编写了此文件,并且对打高尔夫球非常懒惰。计划今晚晚些时候打高尔夫球

使用我自己生成的测试在线尝试,以交替选择True / False

说明:

根据OEIS A005206中重复数字的顺序,解决方案矩阵的对角线有一个丢失的平方。从L通过;非常简单波兰表示法来定义y(b)=b-y(y(b-1))

其余的解释如下

=SQL?!b0-byytb;q@myd+0.fqyZytZ@Q1)-F_Qh    Full program, take stdin as [x, y], output True or False to stdout
=SQ                                        Sort input
   L?!b0-byytb;                            Named lambda as explained above
                    +0.f                   Make sequence of first max(x, y) numbers, starting with 0, 
                        qy y               For which are equal 
                          Z tZ             each element and the previous are equal
                myd                        Map this sequence to the y(index), not just index numbers
             q                             Check if are equal 
              @                  )-F_Q     the x-yth element of sequence (x-y represents which diagonal) 
                                     h(Q)  and the lower of [x,y] (Q is added by the interpreter to fix arity issues

0

批处理,204字节

@if %1 lss %2 %0 %2 %1
@if %1==0 exit/b0
@set/au=l=i=0
:g
@set/au+=2+i%%2,l+=1+i%%2
@if %1==%n% if %2==%m% exit/b0
@if %1 leq %n% exit/b1
:l
@set/a"k=3*i^2*i^i,i+=1
@if %k%==0 goto g
@goto l

通过退出代码返回。说明:由于Batch仅具有整数算术运算,因此我不得不设计一个纯粹的算术解。除0,0条目外,成对的丢失平方坐标遵循以下规则:如果下一个11自由二进制数是偶数,则加,3,2否则加2,1。一个11无二进制数的检验是:将其乘以3时是否没有进位(i*2)+i==(i*2)^i。以下是前几个11-free二进制数及其坐标:

   0     2,1  + 3,2 =  5,3
   1     5,3  + 2,1 =  7,4
  10     7,4  + 3,2 = 10,6
 100    10,6  + 3,2 = 13,8
 101    13,8  + 2,1 = 15,9
1000    15,9  + 3,2 = 18,11
1001    18,11 + 2,1 = 20,12
1010    20,12 + 3,2 = 23,14

神秘地,该规则足以使序列互补。然后需要计算序列,直到到达更大的坐标为止,此时我们可以确定平方是否丢失。

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.