Ein Rittergraph auf einem N-by-N-Brett

20

Im Schach kann sich ein Ritter nur zu den mit X markierten Positionen relativ zu seiner aktuellen Position bewegen, die mit ♞ markiert ist:

Wo sich ein Ritter bewegen kann


Ein Ritter Graph ist ein Graph, der alle legalen Züge des Ritter Schachfigur auf einem Schachbrett darstellt. Jeder Scheitelpunkt dieses Diagramms stellt ein Quadrat des Schachbretts dar, und jede Kante verbindet zwei Quadrate, die die Bewegung eines Ritters voneinander entfernt sind.

Das Diagramm sieht für ein Standard-8-mal-8-Board so aus.

Bildbeschreibung hier eingeben


Herausforderung:

Bei einer gegebenen Ganzzahl N , bei der 3 ≤ N ≤ 8 ist , wird eine N-mal-N- Matrix ausgegeben, die eine Platine darstellt, wobei die Anzahl der möglichen Bewegungen von jeder Position gezeigt wird. Für N = 8 ist die Ausgabe eine Matrix, die die Werte jedes Scheitelpunkts in der obigen Grafik zeigt.

Das Ausgabeformat ist flexibel. Listenlisten oder sogar eine abgeflachte Liste usw. sind akzeptierte Formate.


Kompletter Satz von Testfällen:

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

Das ist also gewinnt die kürzeste Lösung in jeder Sprache. Erklärungen sind erwünscht!

Stewie Griffin
quelle
1
Verwandte Herausforderung , um die Anzahl der Ritterzüge von einem Feld auf einem 8 * 8-Brett abzufragen.
xnor
Kann die Ausgabe eine flache Liste von n * n Elementen sein?
xnor
13
Dies ist buchstäblich nur Randfälle! :)
Jonathan Allan

Antworten:

13

MATL , 17 16 Bytes

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

Probieren Sie es online!

(-1 Byte dank @Luis Mendo.)

K

K=(0101010001000001000101010)

(Bezogen auf die Mitte der Matrix ist jede 1 ein gültiger Springerzug.)

t&l- Bilden Sie eine nxn-Matrix aller Einsen (wobei n die Eingabe ist). Lass das M sein.

[2K0] - Schieben Sie ein Array mit [2, 4, 0] auf den Stapel

B - Konvertieren Sie alle Dateien in Binärdateien und füllen Sie sie nach Bedarf mit Nullen auf

0 1 0
1 0 0
0 0 0

2:&Zv- Spiegeln Sie dies auf beide Dimensionen, ohne die letzte Zeile / Spalte zu wiederholen ("Symmetric Range Indexing"). Dies gibt uns die erforderliche Matrix 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+- Führe eine 2D-Faltung von K über die frühere Matrix M ( conv2(M, K, 'same')) durch und addiere die Einsen bei legalen Ritterbewegungszielen für jede Position

Ergebnismatrix wird implizit angezeigt.

Sundar - Setzen Sie Monica wieder ein
quelle
Sie können die Faltungsmatrix als kodieren, 11043370BP5eaber das ist nicht kürzer ...
Giuseppe
12

Python 2 , 81 Bytes

lambda n:[sum(2==abs((i/n-k/n)*(i%n-k%n))for k in range(n*n))for i in range(n*n)]

Probieren Sie es online!

KSab
quelle
8

JavaScript (ES6), 88 Byte

Gibt eine Zeichenfolge zurück.

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)

Probieren Sie es online!

Wie?

n=3

20

(222202222)

3<n8

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

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

Für ergibt dies:n=8

(1234432124688642369121296348121616128448121616128436912129632468864212344321)

Die Nachschlagetabelle ist definiert als:T

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

Dabei steht für einen nicht verwendeten Steckplatz.0

Wir setzen jede Zelle auf:(x,y)

{T(ix,y)if ix,y88otherwise

JavaScript (ES7), 107 Byte

Eine naive Implementierung, die eigentlich alle Moves ausprobiert.

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

Probieren Sie es online!

Arnauld
quelle
6

Jelly ,  23 22 14  10 Bytes

²ḶdðạP€ċ2)

Eine monadische Verbindung, die eine flache Liste ergibt - verwendet die Idee, die zuerst von KSab in ihrer Python-Antwort verwendet wurde - Ritterzüge haben "Seiten" 1 und 2, die einzigen Faktoren von 2.

Probieren Sie es online! (Fußzeile ruft den einzigen Link des Programms auf und formatiert das Ergebnis als Raster)

²Ḷdðạ²§ċ5)5

Wie?

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

Vorherige 22 byter

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

Ein volles Programm (wegen ³).

Probieren Sie es online! (Fußzeile ruft den einzigen Link des Programms auf und formatiert das Ergebnis als Raster)

Findet alle Züge und zählt diejenigen, die auf dem Brett landen, wahrscheinlich definitiv schlagbar durch Berechnung (möglicherweise schlagbar durch Ändern der Logik "Land auf dem Brett").

Jonathan Allan
quelle
4

APL (Dyalog Classic) , 18 Byte

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

Probieren Sie es online!

ausgewerteter Eingang N

2⍴⎕ zwei Exemplare von N

⍳2⍴⎕ die Indizes einer N × N-Matrix - eine Matrix von Längen-2-Vektoren

∘.-⍨ Subtrahiere jedes Paar von Indizes von jedem anderen Paar, um ein N × N × N × N-Array zu erhalten

| Absolutwert

×/¨ Produkt jeweils

2=wo sind die 2er gibt eine boolesche (0/1) Matrix zurück

Beachten Sie, dass sich ein Ritter um ± 1 auf einer Achse und um ± 2 auf der anderen Achse bewegt, sodass der absolute Wert des Produkts dieser Schritte 2 beträgt. Da 2 in keiner anderen Weise berücksichtigt werden kann, gilt dies nur für Ritterzüge.

+/+/ Addiere zweimal entlang der letzten Dimension

ngn
quelle
3

RAD , 51 46 39 Bytes

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

Probieren Sie es online!

Wie?

Zählt die Anzahl der gültigen Ritterzüge für jedes Feld, indem ermittelt wird, welche Ritterzüge auf dem Brett landen würden:

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

Brachylog , 65 40 33 Bytes

Dies bricht für N größer als 9 zusammen. Also ich bin froh, dass N nur zu 8 gehen kann =)

⟦₅⟨∋≡∋⟩ᶠ;?z{{hQ&t⟦₅↰₁;Qz-ᵐ×ȧ2}ᶜ}ᵐ
  • -25 Bytes durch Umschalten auf die KSab-Formel
  • -7 Bytes durch Abflachen des Arrays dank Sundar

Probieren Sie es online!


Brachylog , 44 36 Bytes

Dieser funktioniert auch für Nummern höher als 9

gP&⟦₅⟨∋≡∋⟩ᶠ;z{{hQ&t⟦₅↰₁;Qz-ᵐ×ȧ2}ᶜ}ᵐ
  • -8 Bytes durch Abflachen des Arrays dank Sundar

Probieren Sie es online!

Kroppeb
quelle
1
Mit dem ⟨∋≡∋⟩Early On können Sie auch die Matrixkoordinaten generieren und insgesamt 7 Bytes einsparen (Ausgabe ist eine flache Liste, die von OP erlaubt wird): Probieren Sie es online aus!
Sundar - Wiedereinsetzung von Monica
2

Netzhaut , 161 Bytes

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

Probieren Sie es online! Link enthält Testfälle. Erläuterung:

.+
*

In Unary konvertieren.

L$`_
$=

Listen Sie den Wert für jeden Wert einmal auf _, dh erstellen Sie ein Quadrat.

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

Beginnen Sie _in der Mitte des regulären Ausdrucks und versuchen Sie, genügend Kontext zu finden, um festzustellen, ob jeder der acht Springerzüge möglich ist. Jedes Muster erfasst ein einzelnes Zeichen, wenn die Übereinstimmung erfolgreich ist. Ich habe versucht, benannte Gruppen zu verwenden, damit die Anzahl der Erfassungen direkt dem gewünschten Ergebnis entspricht, das aber 15 Byte kostet.

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

Verketten Sie alle erfolgreichen Erfassungen und nehmen Sie die Länge.

Neil
quelle
2

Wolfram Language (Mathematica) , 34 Byte

Noch ein Mathematica eingebaut.

VertexDegree@KnightTourGraph[#,#]&

Gibt eine reduzierte Liste zurück.

Probieren Sie es online!

Alephalpha
quelle
Ich habe mit dieser Antwort tatsächlich einen Kommentar unter der Herausforderung abgegeben (obwohl die Syntax nicht korrekt ist, da ich WL nicht kenne). Ich habe es nach einer Weile entfernt, da ich dachte, dass jemand anderes es als echte Antwort posten möchte.
Stewie Griffin
2

Python 2 , 114 103 92 Bytes

lambda n:[sum((d*c>d)+(d*c>c)for d in(y%n,n-y%n-1)for c in(y/n,n-y/n-1))for y in range(n*n)]

Probieren Sie es online!

ovs
quelle
1

C (gcc) , 133 bis 125 Bytes

Diese Lösung sollte auf jeder Tafelgröße funktionieren.

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

Probieren Sie es online!

Curtis Bechtel
quelle
@ceilingcat Natürlich danke! Aber ich verstehe nicht, was der zweite Vorschlag ändert
Curtis Bechtel