Im Schach kann sich ein Ritter nur zu den mit X markierten Positionen relativ zu seiner aktuellen Position bewegen, die mit ♞ markiert ist:
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.
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 Code-Golf, also gewinnt die kürzeste Lösung in jeder Sprache. Erklärungen sind erwünscht!
Antworten:
MATL ,
1716 BytesProbieren Sie es online!
(-1 Byte dank @Luis Mendo.)
(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 StapelB
- Konvertieren Sie alle Dateien in Binärdateien und füllen Sie sie nach Bedarf mit Nullen auf2:&Zv
- Spiegeln Sie dies auf beide Dimensionen, ohne die letzte Zeile / Spalte zu wiederholen ("Symmetric Range Indexing"). Dies gibt uns die erforderliche Matrix K.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 PositionErgebnismatrix wird implizit angezeigt.
quelle
11043370BP5e
aber das ist nicht kürzer ...Python 2 , 81 Bytes
Probieren Sie es online!
quelle
JavaScript (ES6), 88 Byte
Gibt eine Zeichenfolge zurück.
Probieren Sie es online!
Wie?
Für ergibt dies:n = 8
Die Nachschlagetabelle ist definiert als:T
Dabei steht für einen nicht verwendeten Steckplatz.0
Wir setzen jede Zelle auf:( x , y)
JavaScript (ES7), 107 Byte
Eine naive Implementierung, die eigentlich alle Moves ausprobiert.
Probieren Sie es online!
quelle
Jelly ,
23 22 1410 BytesEine 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)
Wie?
Vorherige 22 byter
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,
wahrscheinlichdefinitiv schlagbar durch Berechnung (möglicherweise schlagbar durch Ändern der Logik "Land auf dem Brett").quelle
APL (Dyalog Classic) , 18 Byte
Probieren Sie es online!
⎕
ausgewerteter Eingang N2⍴⎕
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 jeweils2=
wo sind die 2er gibt eine boolesche (0/1) Matrix zurückBeachten 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 Dimensionquelle
RAD ,
514639 BytesProbieren 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:
quelle
Brachylog ,
654033 BytesDies bricht für N größer als 9 zusammen. Also ich bin froh, dass N nur zu 8 gehen kann =)
Probieren Sie es online!
Brachylog ,
4436 BytesDieser funktioniert auch für Nummern höher als 9
Probieren Sie es online!
quelle
⟨∋≡∋⟩
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!Netzhaut , 161 Bytes
Probieren Sie es online! Link enthält Testfälle. Erläuterung:
In Unary konvertieren.
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.Verketten Sie alle erfolgreichen Erfassungen und nehmen Sie die Länge.
quelle
Wolfram Language (Mathematica) , 34 Byte
Noch ein Mathematica eingebaut.
Gibt eine reduzierte Liste zurück.
Probieren Sie es online!
quelle
Python 2 ,
11410392 BytesProbieren Sie es online!
quelle
C (gcc) ,
133 bis125 BytesDiese Lösung sollte auf jeder Tafelgröße funktionieren.
Probieren Sie es online!
quelle