À la recherche de Leapers


19

J'ai récemment reçu un échiquier irrégulier vraiment bizarre. Ses carrés sont partout et même pas tous connectés. Au moins, ils sont toujours disposés sur une grille régulière. Je veux adapter les règles d'échecs pour pouvoir jouer sur le plateau, mais pour commencer, j'ai besoin d'un morceau qui peut réellement aller n'importe où sur le plateau, et il semble qu'un saut soit mon meilleur pari pour cela.

Les sauteurs sont la généralisation des échecs féeriques des chevaliers. Les sauts sont paramétrés par deux entiers m et n et peuvent déplacer m carrés dans une direction, puis encore n carrés dans l'une ou l'autre direction perpendiculaire. Pour le chevalier standard, nous avons (m, n) = (2, 1) . L'ensemble du mouvement est considéré comme un saut unique de sorte qu'aucun des carrés sur le chemin de la cible n'a besoin d'être vide ou même d'exister.

Le défi

On vous donne un "échiquier" sous la forme d'une liste de coordonnées entières 2D positives qui représentent les carrés qui font partie du plateau. Votre tâche consiste à trouver un sauteur qui, avec suffisamment de mouvements, peut atteindre n'importe quelle case du plateau.

Regardons quelques exemples. L'échiquier standard utilise une grille régulière de carrés 8x8 (notez que nous ne faisons pas de distinction entre les carrés blancs et noirs pour ce défi):

########
########
########
########
########
########
########
########

Le chevalier standard peut atteindre tous ces éléments, ce (2, 1)serait donc une sortie valide. Cependant, (1, 1)par exemple, ne serait pas valide, car une telle pièce ne peut atteindre que la moitié des carrés, peu importe où elle commence. (1, 0)d'autre part, serait également une sortie valide, car tous les carrés sont connectés orthogonalement.

Maintenant, si nous avons une planche irrégulière comme:

#   #
 # # #
  # # #
 # #
    #

Les solutions possibles sont alors (1, 1)et (3, 1). Nous pouvons également avoir une carte avec des régions complètement déconnectées comme:

#### ####
#### ####
#### ####
#### ####

Le chevalier standard (2, 1)peut toujours atteindre tous les carrés ici, ce qui est en fait la seule solution.

Et enfin, le simple tableau suivant ne peut être complètement atteint par aucun sauteur:

#
 ##

Notez que le format d'entrée ne sera pas une représentation ASCII mais une liste de coordonnées à la place. Par exemple, le deuxième exemple ci-dessus pourrait être donné comme suit:

[[1, 1], [5, 1], [2, 2], [4, 2], [6, 2], [3, 3], [5, 3], [7, 3], [2, 4], [4, 4], [5, 5]]

Règles

Vous pouvez écrire un programme ou une fonction, en prenant une entrée via STDIN (ou l'alternative la plus proche), un argument de ligne de commande ou un argument de fonction et en sortant le résultat via STDOUT (ou l'alternative la plus proche), la valeur de retour de la fonction ou le paramètre de la fonction (out).

Les coordonnées d'entrée peuvent être prises dans n'importe quel format de liste (liste plate, liste de paires, liste d'entiers complexes, chaîne avec séparateurs cohérents, etc.).

La sortie doit être les deux entiers m et n qui identifient le saut si une solution existe (comme deux entiers séparés, une liste, une chaîne avec un délimiteur non numérique, etc.). Si aucune solution n'existe, vous pouvez sortir n'importe quelle valeur cohérente qui ne peut pas être un saut valide. Cela inclut la paire d'entiers (0, 0)dans votre format normal, ainsi que tout ce qui n'est pas une paire d'entiers non négatifs.

Votre programme doit gérer l'un des cas de test en une minute . C'est une restriction quelque peu floue, mais faites preuve de bon sens: si cela prend 2 minutes sur votre machine, je pense que nous pouvons supposer qu'il pourrait fonctionner en moins de 1 sur quelqu'un d'autre, mais s'il en faut 20, c'est moins probable. Il ne devrait pas être difficile de résoudre chaque cas de test en quelques secondes, donc cette règle n'agit que pour exclure la force brute naïve.

Les règles de standard s'appliquent.

Cas de test

Chaque cas de test est de la forme board => all valid leapers. N'oubliez pas que vous n'avez besoin d'en afficher qu'un. Si la liste des sauts est vide, assurez-vous de renvoyer quelque chose qui n'est pas un saut valide.

Examples above:
[[1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [1, 7], [1, 8], [2, 1], [2, 2], [2, 3], [2, 4], [2, 5], [2, 6], [2, 7], [2, 8], [3, 1], [3, 2], [3, 3], [3, 4], [3, 5], [3, 6], [3, 7], [3, 8], [4, 1], [4, 2], [4, 3], [4, 4], [4, 5], [4, 6], [4, 7], [4, 8], [5, 1], [5, 2], [5, 3], [5, 4], [5, 5], [5, 6], [5, 7], [5, 8], [6, 1], [6, 2], [6, 3], [6, 4], [6, 5], [6, 6], [6, 7], [6, 8], [7, 1], [7, 2], [7, 3], [7, 4], [7, 5], [7, 6], [7, 7], [7, 8], [8, 1], [8, 2], [8, 3], [8, 4], [8, 5], [8, 6], [8, 7], [8, 8]] => [[0, 1], [1, 2], [1, 4], [2, 3], [3, 4]]
[[1, 1], [5, 1], [2, 2], [4, 2], [6, 2], [3, 3], [5, 3], [7, 3], [2, 4], [4, 4], [5, 5]] => [[1, 1], [1, 3]]
[[1, 1], [2, 2], [3, 2]] => []
[[1, 1], [1, 2], [1, 3], [1, 4], [2, 1], [2, 2], [2, 3], [2, 4], [3, 1], [3, 2], [3, 3], [3, 4], [4, 1], [4, 2], [4, 3], [4, 4], [6, 1], [6, 2], [6, 3], [6, 4], [7, 1], [7, 2], [7, 3], [7, 4], [8, 1], [8, 2], [8, 3], [8, 4], [9, 1], [9, 2], [9, 3], [9, 4]] => [[1, 2]]

Square boards:
[[1, 1], [1, 2], [2, 1], [2, 2]] => [[0, 1]]
[[1, 1], [1, 2], [1, 3], [2, 1], [2, 2], [2, 3], [3, 1], [3, 2], [3, 3]] => [[0, 1]]
[[1, 1], [1, 2], [1, 3], [1, 4], [2, 1], [2, 2], [2, 3], [2, 4], [3, 1], [3, 2], [3, 3], [3, 4], [4, 1], [4, 2], [4, 3], [4, 4]] => [[0, 1], [1, 2]]
[[1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [2, 1], [2, 2], [2, 3], [2, 4], [2, 5], [3, 1], [3, 2], [3, 3], [3, 4], [3, 5], [4, 1], [4, 2], [4, 3], [4, 4], [4, 5], [5, 1], [5, 2], [5, 3], [5, 4], [5, 5]] => [[0, 1], [1, 2]]
[[1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [2, 1], [2, 2], [2, 3], [2, 4], [2, 5], [2, 6], [3, 1], [3, 2], [3, 3], [3, 4], [3, 5], [3, 6], [4, 1], [4, 2], [4, 3], [4, 4], [4, 5], [4, 6], [5, 1], [5, 2], [5, 3], [5, 4], [5, 5], [5, 6], [6, 1], [6, 2], [6, 3], [6, 4], [6, 5], [6, 6]] => [[0, 1], [1, 2], [2, 3]]
[[1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [1, 7], [2, 1], [2, 2], [2, 3], [2, 4], [2, 5], [2, 6], [2, 7], [3, 1], [3, 2], [3, 3], [3, 4], [3, 5], [3, 6], [3, 7], [4, 1], [4, 2], [4, 3], [4, 4], [4, 5], [4, 6], [4, 7], [5, 1], [5, 2], [5, 3], [5, 4], [5, 5], [5, 6], [5, 7], [6, 1], [6, 2], [6, 3], [6, 4], [6, 5], [6, 6], [6, 7], [7, 1], [7, 2], [7, 3], [7, 4], [7, 5], [7, 6], [7, 7]] => [[0, 1], [1, 2], [2, 3]]

Miscellaneous:
[[1, 1], [2, 1]] => [[0, 1]]
[[1, 1], [1, 2]] => [[0, 1]]
[[1, 1], [12, 35]] => [[11, 34]]
[[1, 1], [1, 2], [2, 1], [2, 2], [6, 1], [6, 2], [6, 3], [6, 4], [7, 1], [7, 2], [7, 3], [7, 4], [8, 1], [8, 2], [8, 3], [8, 4], [9, 1], [9, 2], [9, 3], [9, 4]] => []
[[1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [2, 1], [2, 2], [2, 3], [2, 4], [2, 5], [2, 6], [3, 1], [3, 2], [3, 5], [3, 6], [4, 1], [4, 2], [4, 5], [4, 6], [5, 1], [5, 2], [5, 3], [5, 4], [5, 5], [5, 6], [6, 1], [6, 2], [6, 3], [6, 4], [6, 5], [6, 6]] => [[0, 1], [1, 2], [1, 4]]
[[2, 2], [2, 4], [2, 6], [2, 8], [4, 2], [4, 4], [4, 6], [4, 8], [6, 2], [6, 4], [6, 6], [6, 8], [8, 2], [8, 4], [8, 6], [8, 8]] => [[0, 2], [2, 4]]

Random boards:
[[1, 5], [1, 9], [2, 6], [2, 8], [2, 10], [2, 12], [3, 5], [3, 7], [3, 9], [3, 11], [3, 13], [4, 2], [4, 4], [4, 6], [4, 8], [4, 14], [5, 1], [5, 3], [5, 5], [5, 7], [6, 2], [6, 4], [7, 1], [8, 2]] => [[1, 1], [1, 3]]
[[1, 3], [1, 4], [1, 5], [1, 6], [1, 7], [2, 1], [2, 2], [2, 3], [2, 4], [2, 7], [3, 1], [3, 2], [3, 3], [3, 4], [3, 6], [3, 7], [4, 2], [4, 3], [4, 4], [4, 5], [4, 6], [5, 3], [5, 4], [5, 6]] => [[0, 1], [1, 2]]
[[1, 8], [2, 6], [2, 10], [3, 3], [3, 4], [3, 8], [4, 1], [4, 11], [5, 3], [5, 9], [6, 12], [8, 11], [10, 10], [11, 12], [12, 6], [12, 8], [13, 6], [13, 8], [13, 10], [13, 11], [14, 5], [14, 7], [14, 8], [14, 13], [14, 14], [15, 7], [15, 9], [15, 11], [15, 12], [16, 6], [16, 7], [16, 9], [16, 13], [16, 14], [17, 10], [17, 12], [18, 8], [18, 12], [20, 9], [21, 11], [22, 13], [23, 10], [23, 11], [23, 15], [24, 12]] => [[1, 2]]
[[1, 17], [1, 21], [3, 11], [3, 15], [3, 19], [3, 23], [5, 13], [5, 21], [7, 11], [7, 15], [7, 19], [9, 1], [9, 13], [9, 17], [11, 3], [11, 7], [11, 15], [11, 19], [13, 5], [13, 9], [13, 13], [13, 17], [13, 21], [15, 11], [15, 15], [15, 19], [17, 13], [17, 17]] => [[2, 2], [2, 6], [2, 10]]
[[1, 3], [2, 4], [2, 5], [3, 6], [4, 1], [5, 3], [5, 6], [5, 7], [6, 12], [6, 14], [6, 21], [7, 9], [7, 19], [8, 9], [8, 15], [8, 17], [8, 18], [8, 24], [9, 12], [9, 19], [10, 12], [10, 14], [10, 17], [10, 21], [11, 22], [12, 15], [12, 17], [12, 24], [13, 16], [14, 20], [14, 21], [14, 26], [15, 13], [15, 19], [16, 18], [16, 23], [17, 16], [17, 24]] => [[2, 3]]
[[1, 11], [3, 13], [4, 10], [6, 14], [8, 12], [9, 9], [9, 15], [12, 8], [13, 5], [13, 19], [13, 21], [14, 8], [15, 1], [15, 17], [16, 4], [16, 14], [16, 18], [16, 20], [17, 21], [18, 2], [18, 16], [18, 18], [19, 9], [19, 13], [19, 15], [20, 12], [21, 1], [21, 17], [22, 4], [22, 10], [23, 7]] => [[1, 3]]
[[1, 39], [6, 37], [8, 32], [10, 27], [11, 31], [11, 35], [12, 22], [16, 21], [16, 29], [16, 33], [18, 34], [21, 3], [21, 9], [21, 19], [23, 8], [23, 14], [23, 22], [23, 24], [23, 36], [24, 6], [25, 13], [25, 17], [26, 1], [26, 11], [28, 6], [28, 20], [28, 26], [28, 30], [28, 34], [30, 11], [30, 15], [30, 21], [32, 6], [33, 28], [33, 32], [35, 13], [35, 23]] => [[2, 5]]

Dans un cas particulier, notez que pour une carte composée d'une seule cellule, tout saut fonctionne, mais votre sortie doit correspondre à un saut réel, donc [0, 0]n'est pas une sortie valide.


Question rapide. Comment va un chevalier (2,1)? Corrigez-moi si je me trompe, mais je suis presque sûr que les chevaliers peuvent déplacer 3 carrés dans n'importe quelle direction, puis 1 carré dans n'importe quelle direction perpendiculaire à la précédente, ce devrait donc être le cas (3,1).
R. Kap

1
@ R.Kap Vous vous trompez. ;) en.wikipedia.org/wiki/Knight_(chess)#Movement
DLosc

@DLosc Ok, wow. Je suppose que je l'étais. Merci pour ça!
R. Kap

Pouvons-nous afficher tous les sauts valides dans une liste? Si nous le faisons, pouvons-nous produire des sauts équivalents comme [[1, 0], [0, 1]]?
FryAmTheEggman

@FryAmTheEggman Juste (n'importe lequel) d'entre eux, s'il vous plaît.
Martin Ender

Réponses:


12

Pyth, 41 35

hfqQu@+G+VM*s_BM*F_BMTGQ]hQ)maVhQdt

Quitte en cas d'erreur s'il n'y a pas de sauts valides, donnant la chaîne vide si STDERR est ignoré.

Essayez-le ici ou exécutez une suite de tests

6 octets enregistrés grâce à isaacg ! Fondamentalement, il suffit de trouver tous les candidats de sauts en sélectionnant chaque saut valide de la première tuile à l'autre tuile. Ensuite, pour chacun d'eux, il fait les huit configurations de [x, y]décalages que le sauteur pourrait prendre. Il trouve ensuite tous les mouvements à partir de la première tuile qui suit le mouvement et rejette ceux qui ne sont pas dans l'entrée. Il continue ainsi jusqu'à ce que le résultat ne change pas. Si cette liste finale est la même que l'entrée, le saut était valide.

L'échiquier standard a pris le plus de temps lorsque je testais, cela a pris environ 3 secondes sur mon ordinateur pas très impressionnant.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.