Il grafico di un cavaliere su una tavola N-by-N


20

Negli scacchi, un cavaliere può spostarsi solo nelle posizioni contrassegnate con X rispetto alla sua posizione attuale, contrassegnate con ♞:

dove un cavaliere può muoversi


Il grafico di un cavaliere è un grafico che rappresenta tutte le mosse legali del pezzo degli scacchi cavaliere su una scacchiera. Ogni vertice di questo grafico rappresenta un quadrato della scacchiera e ogni bordo collega due quadrati che sono una mossa del cavaliere uno dall'altro.

Il grafico è simile al seguente per una scheda standard 8 per 8.

inserisci qui la descrizione dell'immagine


Sfida:

Dato un numero intero N , dove 3 ≤ N ≤ 8 , emette una matrice N-per-N che rappresenta una scheda, in cui viene mostrato il numero di mosse possibili da ciascuna posizione. Per N = 8 , l'output sarà una matrice che mostra i valori di ciascun vertice nel grafico sopra.

Il formato di output è flessibile. Elenco di elenchi o anche un elenco appiattito ecc. Sono formati accettati.


Set completo di casi di 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

Questo è quindi vince la soluzione più breve in ogni lingua. Le spiegazioni sono incoraggiate!


1
Sfida correlata per interrogare il numero di mosse del cavaliere da un quadrato su una tavola 8 * 8.
xnor

L'output può essere un elenco semplice di n * n elementi?
xnor

13
Questo è letteralmente solo casi limite! :)
Jonathan Allan l'

Risposte:


13

MATL , 17 16 byte

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

Provalo online!

(-1 byte grazie a @Luis Mendo.)

La parte principale del codice sta creando una matrice per la convoluzione:K

K=(0101010001000001000101010)

(Rispetto al centro della matrice, ogni 1 è una mossa valida per un cavaliere.)

t&l- Forma una matrice nxn di tutti gli 1 (dove n è l'input). Lascia che sia M.

[2K0] - Inserire un array contenente [2, 4, 0] in pila

B - Converti tutto in binario, imbottitura con 0 se necessario

0 1 0
1 0 0
0 0 0

2:&Zv- Rifletti su entrambe le dimensioni, senza ripetere la riga / colonna finale ("indicizzazione dell'intervallo simmetrico"). Questo ci dà la matrice richiesta 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+- Esegui la convoluzione 2D di K sulla matrice precedente M ( conv2(M, K, 'same')), sommando gli 1 a bersagli di movimento del cavaliere legale per ogni posizione

La matrice dei risultati viene visualizzata implicitamente.


puoi codificare la matrice di convoluzione come 11043370BP5ema non è più breve ...
Giuseppe


8

JavaScript (ES6), 88 byte

Restituisce una stringa.

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)

Provalo online!

Come?

n=3

20

(222202222)

3<n8

(X,y)0X<n0y<nioX,y

ioX,y=min(X+1,n-X)×min(y+1,n-y)

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 byte

Un'implementazione ingenua che in realtà prova tutte le mosse.

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))

Provalo online!


6

Gelatina ,  23 22 14  10 byte

²ḶdðạP€ċ2)

Un collegamento monadico che fornisce un elenco semplice - usa l'idea usata per la prima volta da KSab nella loro risposta Python - le mosse del cavaliere hanno "lati" 1 e 2, gli unici fattori di 2.

Provalo online! (il piè di pagina chiama l'unico link del programma e quindi formatta il risultato come una griglia)

²Ḷdðạ²§ċ5)5

Come?

²Ḷ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]

22 byte precedenti

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

Un programma completo (dovuto a ³).

Provalo online! (il piè di pagina chiama l'unico link del programma e quindi formatta il risultato come una griglia)

Trova tutte le mosse e conta quelle che atterrano sul tabellone probabilmente sicuramente battibili calcolando (forse battibile cambiando la logica "terra sul tabellone").


4

APL (Dyalog Classic) , 18 byte

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

Provalo online!

input valutato N

2⍴⎕ due copie di N

⍳2⍴⎕ gli indici di una matrice N × N - una matrice di lunghezza-2 vettori

∘.-⍨ sottrarre ogni coppia di indici dall'altra coppia, ottenere un array N × N × N × N

| valore assoluto

×/¨ prodotto ciascuno

2=dove sono i 2? restituisce una matrice booleana (0/1)

Nota che un cavaliere si sposta di ± 1 su un asse e di ± 2 sull'altro, quindi il valore assoluto del prodotto di quei passi è 2. Dato che 2 non può essere preso in considerazione in nessun altro modo, questo è valido solo per i movimenti del cavaliere.

+/+/ somma lungo l'ultima dimensione, due volte


3

RAD , 51 46 39 byte

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

Provalo online!

Come?

Conta il numero di mosse del cavaliere valide per ogni quadrato vedendo quali mosse del cavaliere sarebbero atterrate sul tabellone:

{+/(⍵∘+¨(⊖,⊢)(⊢,-)(⍳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 byte

Questo si rompe per N maggiore di 9. Quindi sono felice che N possa essere solo andare a 8 =)

⟦₅⟨∋≡∋⟩ᶠ;?z{{hQ&t⟦₅↰₁;Qz-ᵐ×ȧ2}ᶜ}ᵐ
  • -25 byte passando alla formula di KSab
  • -7 byte appiattendo l'array grazie a Sundar

Provalo online!


Brachylog , 44 36 byte

Questo funziona anche con un numero superiore a 9

gP&⟦₅⟨∋≡∋⟩ᶠ;z{{hQ&t⟦₅↰₁;Qz-ᵐ×ȧ2}ᶜ}ᵐ
  • -8 byte appiattendo l'array grazie a Sundar

Provalo online!


1
Puoi anche utilizzare le ⟨∋≡∋⟩prime fasi per generare anche le coordinate della matrice e salvare 7 byte complessivi (l'output è un elenco semplice, consentito dall'OP): provalo online!
Sundar - Ripristina Monica il

2

Retina , 161 byte

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

Provalo online! Il link include casi di test. Spiegazione:

.+
*

Converti in unario.

L$`_
$=

Elencare il valore una volta per ciascuno _nel valore, ovvero creare un quadrato.

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

A partire _dal centro della regex, prova ad abbinare un contesto sufficiente per determinare se ciascuna delle otto mosse del cavaliere è possibile. Ogni modello cattura un singolo personaggio se la corrispondenza ha esito positivo. Ho provato a utilizzare gruppi denominati in modo che il numero di acquisizioni sia direttamente uguale al risultato desiderato ma che costa 15 byte.

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

Concatena tutte le catture riuscite e prendine la lunghezza.


2

Wolfram Language (Mathematica) , 34 byte

Ennesimo Mathematica integrato.

VertexDegree@KnightTourGraph[#,#]&

Restituisce un elenco appiattito.

Provalo online!


In realtà ho fatto un commento sotto la sfida con questa risposta (anche se non è una sintassi corretta poiché non conosco WL). L'ho rimosso dopo un po ', dal momento che ho pensato che qualcun altro avrebbe potuto pubblicarlo come una vera risposta.
Stewie Griffin,


1

C (gcc) , 133 125 byte

Questa soluzione dovrebbe funzionare su schede di qualsiasi dimensione.

#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);}

Provalo online!


@ceilingcat Certo, grazie! Ma non vedo cosa cambia il secondo suggerimento
Curtis Bechtel il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.