Est-ce un carré perdant?

19

Il y a un jeu appelé Get Home qui se joue sur un échiquier. Dans ce jeu, il y a une seule pièce qui est déplacée par les deux joueurs à tour de rôle. Il existe certaines règles pour déplacer la pièce. Lors d'un tour, un joueur doit effectuer l'un des mouvements suivants pour n positif .

  • n s'espace

  • n espaces à gauche

  • n espaces vers le haut et vers la gauche (une diagonale)

Le joueur qui déplace la pièce dans le coin supérieur gauche du plateau remporte la partie.

Nous allons maintenant définir le concept d'un carré perdant. Dans cette vidéo (d'où j'ai eu l'idée), une case perdante est définie comme une case sur laquelle, tout joueur commençant son tour sera obligé de faire un mouvement permettant à son adversaire de forcer une victoire. L'exemple le plus simple d'un carré perdant serait le carré en (1,2). Une pièce en (1,2) peut se déplacer vers l'un des endroits suivants.

Illustration

Tous ont un chemin direct vers la victoire pour le prochain joueur.

Il s'ensuit également que n'importe quelle case qui a un chemin d'un mouvement vers une case perdante permet au joueur commençant sur cette case de forcer une victoire. Cela signifie que tout carré qui n'est pas éloigné d'un carré perdu est également un carré perdant.

Cela nous amène à cette définition plutôt soignée d'un carré perdant:

Une case perdante est une case d'où aucun mouvement ne peut arriver sur une autre case perdante et (0,0) est une case perdante.

Tâche

Étant donné les coordonnées d'un carré sur un échiquier de taille arbitraire, déterminez s'il s'agit d'un carré perdant. Sortez deux valeurs, une pour les carrés perdus et une pour les autres.

Il s'agit de donc les réponses seront notées en octets avec moins d'octets étant meilleurs.

Cas de test

Voici tous les carrés perdants sur un échiquier régulier de 8 x 8 (marqué par 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

Voici une image d'une carte de 100 par 100 avec des carrés perdus marqués en noir (chaque carré fait 2 pixels par 2 pixels).

Tableau 100 par 100

Assistant de blé
la source
2
Je ne pense pas qu'il y ait suffisamment de cas de test pour trouver un modèle, je pense que je vois un modèle, mais je ne pourrais pas le dire avec certitude. Est 10, 7un carré perdant? Est-ce 10, 8? Et alors 15, 11?
DJMcMayhem
1
@WheatWizard Cela vous dérange-t-il de rendre l'image un peu plus grande?
Erik the Outgolfer
1
@WheatWizard Je voulais dire des pixels plus grands ... par exemple 5x5 pixels au lieu de 1x1, peut-être aussi une grille si ce n'est trop dur (merci pour le 100x100)
Erik the Outgolfer
2
Également lié (retour de mouvement optimal ou signal de perte de position).
Zgarb
1
Je pense qu'il est normal d'autoriser les inexactitudes en virgule flottante à entraver les performances, même avec une capacité de nombres arbitrairement grands ...
Jonathan Allan

Réponses:

8

Python 3 , 112 50 46 42 octets

-4 octets merci à Jonathan Allan !

-2 octets grâce à xnor !

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

Essayez-le en ligne!

Basé sur la formule des positions froides dans le jeu de Wythoff et en faisant quelques modifications afin de produire une formule explicite. Explication entrante une fois que j'ai effectivement terminé une méthodologie appropriée pour le calcul de la formule.

notjagan
la source
Ne pourriez - vous changer 0<=xpour x>0et enregistrer un octet ou deux?
Jonathan Frech
@JonathanFrech Il doit être soit <=ou >=afin d'inclure la position 0, 0.
notjagan
Vous avez raison, un seul octet peut être enregistré.
Jonathan Frech
1
Un octet de moins avec une implémentation différente de la même:lambda r,c:int(abs(r-c)*(5**.5+1)**2/4)==max(r,c)
Jonathan Allan
1
/2//1ressemble à //2.
xnor
5

Gelée , 8 octets

ạ/×ØpḞ⁼Ṃ

Essayez-le en ligne! ou voyez la partie supérieure gauche 60 par 60 sous forme de grille .

Comment?

Une position froide dans le jeu de Wythoff est une position perdante. Les coordonnées [n,m]donnent une position de froid lorsque n = floor(kφ) = floor(mφ) - mou m = floor(kφφ) = ceil(nφ) = n + kpendant un certain nombre naturel, ket le nombre d' or, φ. Le premier tient quand nest inférieur à m; ce dernier quand mest inférieur à n(les deux se tenant à 0,0).

kest donc la différence absolue entre net met si floor(abs(n-m)φ)=min(n,m)la condition est remplie.

ạ/×Ø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
la source
2

JavaScript (ES6), 64 octets

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

Je vois maintenant que ce n'est pas la meilleure technique, mais j'ai dû l'inventer moi-même car j'ai perdu Internet peu de temps après le chargement de cette page. (J'aurais posté il y a quelque temps sans ces problèmes Internet ...)

Dans un monde parfait, la précision du flotteur ne serait pas un problème et je pourrais économiser 9 octets:

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

6 octets supplémentaires pourraient être enregistrés si JS supportait le chaînage de comparaison de Python:

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

Pyth, 39 octets

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

J'ai écrit ceci avec une fonction nommée (ew), et j'étais extrêmement paresseux avec le golf. Je prévois de jouer au golf un certain nombre d'octets plus tard ce soir

Essayez-le en ligne, avec mes propres tests générés, destinés à alterner Vrai / Faux

Explication:

Les diagonales de la matrice de solution ont un carré perdant selon la séquence de nombres répétés dans OEIS A005206 . De Ltravers ;est une notation polonaise assez simple à définir y(b)=b-y(y(b-1)).

Le reste de l'explication suit

=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
la source
0

Lot, 204 octets

@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

Renvoie via le code de sortie. Explication: Étant donné que Batch n'a qu'une arithmétique entière, j'ai dû concevoir une solution purement arithmétique. Hors le0,0 entrée, les paires de coordonnées carrées perdantes suivent la règle suivante: si le prochain 11nombre binaire libre est pair, alors ajoutez 3,2sinon 2,1. Un test pour un 11nombre binaire libre est s'il n'y a pas de portage lorsqu'il est multiplié par trois, c'est-à-dire que (i*2)+i==(i*2)^i. Voici les premiers 11nombres binaires libres et leurs coordonnées:

   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

etc. Mystérieusement, cette règle suffit à rendre les séquences complémentaires. Il reste alors à calculer la séquence jusqu'à ce qu'elle atteigne la coordonnée la plus grande, point auquel nous pouvons déterminer si le carré perd.

Neil
la source