Esta é uma praça perdida?

19

Existe um jogo chamado Get Home que é jogado no tabuleiro de xadrez. Neste jogo, há uma única peça que é movida pelos dois jogadores em turnos. Existem algumas regras sobre como a peça pode ser movida. Em um turno, um jogador deve fazer um dos seguintes movimentos para n positivo .

  • n espaços acima

  • n espaços à esquerda

  • n espaços acima e à esquerda (uma diagonal)

O jogador que move a peça para o canto superior esquerdo do tabuleiro vence o jogo.

Agora vamos definir o conceito de um quadrado perdedor. Em este vídeo (de onde eu tive a idéia) um quadrado perder é definido como um quadrado sobre o qual, qualquer jogador que começa sua vez será forçado a fazer um movimento permitindo o seu adversário para forçar uma vitória. O exemplo mais simples de um quadrado perdedor seria o quadrado em (1,2). Uma peça em (1,2) pode ser movida para qualquer um dos seguintes lugares.

Ilustração

Todos os quais têm um caminho direto para a vitória para o próximo jogador.

Da mesma forma, qualquer quadrado que possua um caminho de um movimento para um quadrado perdedor permite que o jogador que começa nesse quadrado force uma vitória. Isso significa que qualquer quadrado que não esteja a um passo de um quadrado perdedor também é um quadrado perdedor.

Isso nos leva a essa definição bastante clara de um quadrado perdedor:

Um quadrado perdedor é um quadrado do qual nenhum movimento pode chegar a outro quadrado perdedor e (0,0) é um quadrado perdedor.

Tarefa

Dadas as coordenadas de um quadrado em um tabuleiro de xadrez de tamanho arbitrário, determine se é um quadrado perdedor. Saída dois valores um para perder quadrados e um para outros.

Isso é então as respostas serão pontuadas em bytes, com menos bytes sendo melhores.

Casos de teste

Aqui estão todos os quadrados perdidos em um tabuleiro de xadrez regular de 8 por 8 (marcado com 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

Aqui está uma imagem de uma placa de 100 por 100 com quadrados perdidos marcados em preto (cada quadrado tem 2 pixels por 2 pixels).

100 por 100 bordo

Assistente de Trigo
fonte
2
Não acho que haja casos de teste suficientes para encontrar um padrão. Acho que vejo um padrão, mas não posso dizer com certeza. É 10, 7um quadrado perdedor? É 10, 8? Que tal 15, 11?
DJMcMayhem
11
@WheatWizard Você se importa de aumentar a imagem?
Erik the Outgolfer
11
@WheatWizard eu quis dizer maiores pixels ... por exemplo 5x5 pixels em vez de 1x1, possivelmente algum grade também se não muito difícil (btw obrigado pela 100x100)
Erik o Outgolfer
2
Também relacionado (retorne o movimento ideal ou sinalize que a posição está perdendo).
Zgarb
11
Eu acho que é normal para permitir flutuante imprecisões pontuais para o desempenho dificultar mesmo com arbitrariamente grande capacidade inteiro ...
Jonathan Allan

Respostas:

8

Python 3 , 112 50 46 42 bytes

-4 bytes graças a Jonathan Allan !

-2 bytes graças ao xnor !

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

Experimente online!

Baseado na fórmula para posições frias no jogo de Wythoff e fazendo algumas modificações para produzir uma fórmula explícita. Explicação de entrada uma vez que eu realmente terminei uma metodologia adequada para a derivação da fórmula.

notjagan
fonte
Você não pode mudar 0<=xpara x>0e salvar um byte ou dois?
Jonathan Frech
@JonathanFrech Tem que ser um <=ou >=para incluir a posição 0, 0.
precisa saber é o seguinte
Você está certo, apenas um byte pode ser salvo.
Jonathan Frech
11
Um byte a menos com uma implementação diferente do mesmo:lambda r,c:int(abs(r-c)*(5**.5+1)**2/4)==max(r,c)
Jonathan Allan
11
/2//1parece o mesmo que //2.
Xnor
5

Gelatina , 8 bytes

ạ/×ØpḞ⁼Ṃ

Experimente online! ou veja os 60 por 60 no canto superior esquerdo como uma grade .

Quão?

Uma posição fria no jogo de Wythoff é uma posição perdida. As coordenadas [n,m]dão uma posição fria quando n = floor(kφ) = floor(mφ) - mou m = floor(kφφ) = ceil(nφ) = n + kpara algum número natural k, e a proporção áurea φ,. O primeiro mantém quando né menor que m; o último quando mé menor que n(ambos segurando em 0,0).

ké, portanto, a diferença absoluta entre ne me se floor(abs(n-m)φ)=min(n,m)a condição for atendida.

ạ/×Ø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?
Jonathan Allan
fonte
2

JavaScript (ES6), 64 bytes

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

Percebo agora que essa não é a melhor técnica, mas tive que elaborá-la porque perdi a Internet logo após carregar esta página. (Teria postado um tempo atrás, se não fosse por esses problemas da Internet ...)

Em um mundo perfeito, a precisão da flutuação não seria um problema e eu poderia salvar 9 bytes:

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

Mais 6 bytes poderiam ser salvos se JS suportasse o encadeamento de comparação do Python:

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

Pyth, 39 Bytes

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

Eu escrevi isso com uma função nomeada (ew) e era extremamente preguiçoso com o golfe. Planejando jogar fora vários bytes mais tarde hoje à noite

Experimente online, com meus próprios testes gerados, destinados a alternar Verdadeiro / Falso

Explicação:

As diagonais da matriz da solução têm um quadrado perdedor de acordo com a sequência de números repetidos no OEIS A005206 . De Latravés ;é uma notação polonesa bastante direta para definir y(b)=b-y(y(b-1)).

O restante da explicação segue

=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
Dave
fonte
0

Lote, 204 bytes

@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

Retorna via código de saída. Explicação: Como o Lote possui apenas aritmética inteira, tive que criar uma solução puramente aritmética. Excluindo a 0,0entrada, os pares de coordenadas quadradas perdedoras seguem a seguinte regra: se o próximo 11número binário livre for igual, adicione add 3,2caso contrário 2,1. Um teste para um 11número binário livre é se não houver carregamentos quando multiplicado por três, em outras palavras (i*2)+i==(i*2)^i. Aqui estão os primeiros 11números binários livres e suas coordenadas:

   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

Misteriosamente, essa regra é suficiente para tornar as seqüências complementares. Resta então calcular a sequência até que ela atinja a coordenada maior, momento em que podemos determinar se o quadrado está perdendo.

Neil
fonte