Un graphique de chevalier sur un tableau N-by-N


20

Aux échecs, un chevalier ne peut se déplacer qu'aux positions marquées d'un X par rapport à sa position actuelle, marquées d'un ♞:

où un chevalier peut se déplacer


Un graphique de chevalier est un graphique qui représente tous les mouvements légaux de la pièce d'échecs de chevalier sur un échiquier. Chaque sommet de ce graphique représente un carré de l'échiquier, et chaque bord relie deux carrés éloignés l'un de l'autre d'un chevalier.

Le graphique ressemble à ceci pour une carte standard 8 x 8.

entrez la description de l'image ici


Défi:

Étant donné un entier N , où 3 ≤ N ≤ 8 , affichez une matrice N par N représentant une carte, où le nombre de mouvements possibles depuis chaque position est indiqué. Pour N = 8 , la sortie sera une matrice montrant les valeurs de chaque sommet dans le graphique ci-dessus.

Le format de sortie est flexible. La liste des listes ou même une liste aplatie, etc. sont des formats acceptés.


Ensemble complet de cas de test:

--- N = 3 ---
2 2 2
2 0 2
2 2 2
--- N = 4 ---
2 3 3 2
3 4 4 3
3 4 4 3
2 3 3 2
--- N = 5 ---
2 3 4 3 2
3 4 6 4 3
4 6 8 6 4
3 4 6 4 3
2 3 4 3 2
--- N = 6 ---
2 3 4 4 3 2
3 4 6 6 4 3
4 6 8 8 6 4
4 6 8 8 6 4
3 4 6 6 4 3
2 3 4 4 3 2
--- N = 7 ---
2 3 4 4 4 3 2
3 4 6 6 6 4 3
4 6 8 8 8 6 4
4 6 8 8 8 6 4
4 6 8 8 8 6 4
3 4 6 6 6 4 3
2 3 4 4 4 3 2
--- N = 8 ---
2 3 4 4 4 4 3 2
3 4 6 6 6 6 4 3
4 6 8 8 8 8 6 4
4 6 8 8 8 8 6 4
4 6 8 8 8 8 6 4
4 6 8 8 8 8 6 4
3 4 6 6 6 6 4 3
2 3 4 4 4 4 3 2

Il s'agit de donc la solution la plus courte dans chaque langue l'emporte. Les explications sont encouragées!


1
Défi connexe pour interroger le nombre de mouvements de chevalier depuis un carré sur un plateau de 8 * 8.
xnor

La sortie peut-elle être une liste plate de n * n éléments?
xnor

13
Ce ne sont que des cas marginaux! :)
Jonathan Allan

Réponses:


13

MATL , 17 16 octets

t&l[2K0]B2:&ZvZ+

Essayez-le en ligne!

(-1 octet grâce à @Luis Mendo.)

K

K=(0101010001000001000101010)

(Par rapport au centre de la matrice, chaque 1 est un mouvement de chevalier valide.)

t&l- Former une matrice nxn de tous les 1 (où n est l'entrée). Que ce soit M.

[2K0] - Poussez un tableau contenant [2, 4, 0] sur la pile

B - Convertissez tout en binaire, rembourrez avec 0 au besoin

0 1 0
1 0 0
0 0 0

2:&Zv- Miroir que sur les deux dimensions, sans répéter la dernière ligne / colonne ("indexation de plage symétrique"). Cela nous donne la matrice requise K.

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

Z+- Effectuez une convolution 2D de K sur la matrice précédente M ( conv2(M, K, 'same')), en résumant les 1 aux cibles de mouvement de chevalier légal pour chaque position

La matrice des résultats s'affiche implicitement.


vous pouvez encoder la matrice de convolution comme 11043370BP5emais ce n'est pas plus court ...
Giuseppe


8

JavaScript (ES6), 88 octets

Renvoie une chaîne.

n=>(g=k=>--k?[n>3?'-2344-6-6'[(h=k=>k*2<n?~k:k-n)(k%n)*h(k/n|0)]||8:k-4&&2]+g(k):2)(n*n)

Essayez-le en ligne!

Comment?

n=3

20

(222202222)

3<n8

(x,y)0x<n0y<nix,y

ix,y=min(x+1,nx)×min(y+1,ny)

n=8

(1234432124688642369121296348121616128448121616128436912129632468864212344321)

T

T=[0,2,3,4,4,0,6,0,6]

0

(x,y)

{T(ix,y)if ix,y88otherwise

JavaScript (ES7), 107 octets

Une implémentation naïve qui essaie réellement tous les mouvements.

n=>[...10**n-1+''].map((_,y,a)=>a.map((k,x)=>~[...b=i='01344310'].map(v=>k-=!a[x-v+2]|!a[y-b[i++&7]+2])+k))

Essayez-le en ligne!


6

Gelée ,  23 22 14  10 octets

²ḶdðạP€ċ2)

Un lien monadique donnant une liste plate - utilise l'idée d'abord utilisée par KSab dans leur réponse Python - les mouvements de chevalier ont des "côtés" 1 et 2, les seuls facteurs de 2.

Essayez-le en ligne! (le pied de page appelle le seul lien du programme, puis formate le résultat sous forme de grille)

²Ḷdðạ²§ċ5)5

Comment?

²ḶdðạP€ċ2) - Link: integer, n (any non-negative) e.g. 8
²          - square n                                 64
 Ḷ         - lowered range                            [0,    1,    2,    3,    4,    5,    6,    7,    8,    9,    10,   11,   12,   13,   14,   15,   16,   17,   18,   19,   20,   21,   22,   23,   24,   25,   26,   27,   28,   29,   30,   31,   32,   33,   34,   35,   36,   37,   38,   39,   40,   41,   42,   43,   44,   45,   46,   47,   48,   49,   50,   51,   52,   53,   54,   55,   56,   57,   58,   59,   60,   61,   62,   63]
  d        - divmod (vectorises) i.e. x->[x//n,x%n]   [[0,0],[0,1],[0,2],[0,3],[0,4],[0,5],[0,6],[0,7],[1,0],[1,1],[1,2],[1,3],[1,4],[1,5],[1,6],[1,7],[2,0],[2,1],[2,2],[2,3],[2,4],[2,5],[2,6],[2,7],[3,0],[3,1],[3,2],[3,3],[3,4],[3,5],[3,6],[3,7],[4,0],[4,1],[4,2],[4,3],[4,4],[4,5],[4,6],[4,7],[5,0],[5,1],[5,2],[5,3],[5,4],[5,5],[5,6],[5,7],[6,0],[6,1],[6,2],[6,3],[6,4],[6,5],[6,6],[6,7],[7,0],[7,1],[7,2],[7,3],[7,4],[7,5],[7,6],[7,7]]
   ð     ) - new dyadic chain for each - call that L ( & e.g. R = [1,2] representing the "2nd row, 3rd column" ...-^ )
    ạ      -   absolute difference (vectorises)       [[1,2],[1,1],[1,0],[1,1],[1,2],[1,3],[1,4],[1,5],[0,2],[0,1],[0,0],[0,1],[0,2],[0,3],[0,4],[0,5],[1,2],[1,1],[1,0],[1,1],[1,2],[1,3],[1,4],[1,5],[2,2],[2,1],[2,0],[2,1],[2,2],[2,3],[2,4],[2,5],[3,2],[3,1],[3,0],[3,1],[3,2],[3,3],[3,4],[3,5],[4,2],[4,1],[4,0],[4,1],[4,2],[4,3],[4,4],[4,5],[5,2],[5,1],[5,0],[5,1],[5,2],[5,3],[5,4],[5,5],[6,2],[6,1],[6,0],[6,1],[6,2],[6,3],[6,4],[6,5]]
     P€    -   product of €ach                        [2,    1,    0,    1,    2,    3,    4,    5,    0,    0,    0,    0,    0,    0,    0,    0,    2,    1,    0,    1,    2,    3,    4,    5,    4,    2,    0,    2,    4,    6,    8,    10,   6,    3,    0,    3,    6,    9,    12,   15,   8,    4,    0,    4,    8,    12,   16,   20,   10,   5,    0,    5,    10,   15,   20,   25,   12,   6,    0,    6,    12,   18,   24,   30]
       ċ2  -   count 2s                          6:    ^-...1                  ^-...2                                                                  ^-...3                  ^-...4                        ^-...5      ^-...6
           - )                                                                                                     v-...that goes here
           -   ->                                  -> [2,    3,    4,    4,    4,    4,    3,    2,    3,    4,    6,    6,    6,    6,    4,    3,    4,    6,    8,    8,    8,    8,    6,    4,    4,    6,    8,    8,    8,    8,    6,    4,    4,    6,    8,    8,    8,    8,    6,    4,    4,    6,    8,    8,    8,    8,    6,    4,    3,    4,    6,    6,    6,    6,    4,    3,    2,    3,    4,    4,    4,    4,    3,    2]

Précédent 22 octets

2RżN$Œp;U$+,ḟ€³R¤Ẉ¬Sðþ

Un programme complet (dû à ³).

Essayez-le en ligne! (le pied de page appelle le seul lien du programme, puis formate le résultat sous forme de grille)

Trouve tous les coups et compte ceux qui atterrissent sur le plateau probablement définitivement battables en calculant (peut-être battable en changeant la logique "atterrir sur le plateau").


4

APL (Dyalog Classic) , 18 octets

+/+/2=×/¨|∘.-⍨⍳2⍴⎕

Essayez-le en ligne!

entrée évaluée N

2⍴⎕ deux exemplaires de N

⍳2⍴⎕ les indices d'une matrice N × N - une matrice de vecteurs de longueur 2

∘.-⍨ soustrayez chaque paire d'indices de chaque autre paire, obtenez un tableau N × N × N × N

| valeur absolue

×/¨ produit chacun

2=où sont les 2? retourne une matrice booléenne (0/1)

Notez qu'un chevalier se déplace de ± 1 sur un axe et de ± 2 sur l'autre, de sorte que la valeur absolue du produit de ces étapes est 2. Comme 2 ne peut pas être pris en compte d'une autre manière, cela n'est valable que pour les mouvements de chevalier.

+/+/ somme le long de la dernière dimension, deux fois


3

RAD , 51 46 39 octets

{+/(⍵∘+¨(⊖,⊢)(⊢,-)(⍳2)(1¯2))∊,W}¨¨W←⍳⍵⍵

Essayez-le en ligne!

Comment?

Compte le nombre de mouvements de chevalier valides pour chaque case en voyant quels mouvements de chevalier arriveraient sur le plateau:

{+/(⍵∘+¨(⊖,⊢)(⊢,-)(⍳2)(1¯2))∊,W}¨¨W←⍳⍵⍵
 +/                                     - The number of ...
                            ∊,W         - ... in-bounds ...
        (⊖,⊢)(⊢,-)(⍳2)(1¯2)             - ... knight movements ...
   (⍵∘+¨                   )            - ... from ...
{                              }¨¨W←⍳⍵⍵ - ... each square

3

Brachylog , 65 40 33 octets

Cela se décompose pour N plus grand que 9. Donc, je suis heureux que N ne puisse aller qu'à 8 =)

⟦₅⟨∋≡∋⟩ᶠ;?z{{hQ&t⟦₅↰₁;Qz-ᵐ×ȧ2}ᶜ}ᵐ
  • -25 octets en passant à la formule de KSab
  • -7 octets en aplatissant le tableau grâce à Sundar

Essayez-le en ligne!


Brachylog , 44 36 octets

Celui-ci fonctionne également pour un nombre supérieur à 9

gP&⟦₅⟨∋≡∋⟩ᶠ;z{{hQ&t⟦₅↰₁;Qz-ᵐ×ȧ2}ᶜ}ᵐ
  • -8 octets en aplatissant le tableau grâce à Sundar

Essayez-le en ligne!


1
Vous pouvez également utiliser le ⟨∋≡∋⟩début pour générer les coordonnées de la matrice et économiser 7 octets au total (la sortie est une liste plate autorisée par OP): Essayez-la en ligne!
sundar

2

Rétine , 161 octets

.+
*
L$`_
$=
(?<=(¶)_+¶_+)?(?=(?<=(¶)_*¶_*)__)?(?<=(¶)__+)?(?=(?<=(¶)_*)___)?_(?=(?<=___)_*(¶))?(?=__+(¶))?(?=(?<=__)_*¶_*(¶))?(?=_+¶_+(¶))?
$.($1$2$3$4$5$6$7$8)

Essayez-le en ligne! Le lien inclut des cas de test. Explication:

.+
*

Convertissez en unaire.

L$`_
$=

Listez la valeur une fois pour chacune _dans la valeur, c'est-à-dire créez un carré.

(?<=(¶)_+¶_+)?
(?=(?<=(¶)_*¶_*)__)?
(?<=(¶)__+)?
(?=(?<=(¶)_*)___)?
_
(?=(?<=___)_*(¶))?
(?=__+(¶))?
(?=(?<=__)_*¶_*(¶))?
(?=_+¶_+(¶))?

En commençant au _milieu de l'expression régulière, essayez de faire correspondre suffisamment de contexte pour déterminer si chacun des huit mouvements du chevalier est possible. Chaque motif capture un seul caractère si la correspondance réussit. J'ai essayé d'utiliser des groupes nommés pour que le nombre de captures soit directement égal au résultat souhaité, mais cela coûte 15 octets.

$.($1$2$3$4$5$6$7$8)

Concatène toutes les captures réussies et prends la longueur.


2

Wolfram Language (Mathematica) , 34 octets

Encore un autre Mathematica intégré.

VertexDegree@KnightTourGraph[#,#]&

Renvoie une liste aplatie.

Essayez-le en ligne!


En fait, j'ai fait un commentaire sous le défi avec cette réponse (bien que la syntaxe ne soit pas correcte car je ne connais pas WL). Je l'ai retiré après un peu, car je pensais que quelqu'un d'autre pourrait le poster comme une vraie réponse.
Stewie Griffin


1

C (gcc) , 133 125 octets

Cette solution devrait fonctionner sur n'importe quelle planche.

#define T(x,y)(x<3?x:2)*(y<3?y:2)/2+
a,b;f(i){for(a=i--;a--;)for(b=i+1;b--;)printf("%i ",T(a,b)T(i-a,b)T(a,i-b)T(i-a,i-b)0);}

Essayez-le en ligne!


@ceilingcat Bien sûr, merci! Mais je ne vois pas ce que la deuxième suggestion change
Curtis Bechtel
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.