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!


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.


Sie können die Faltungsmatrix als kodieren, 11043370BP5eaber das ist nicht kürzer ...
Giuseppe


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!


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


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


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

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!


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.


2

Wolfram Language (Mathematica) , 34 Byte

Noch ein Mathematica eingebaut.

VertexDegree@KnightTourGraph[#,#]&

Gibt eine reduzierte Liste zurück.

Probieren Sie es online!


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


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!


@ceilingcat Natürlich danke! Aber ich verstehe nicht, was der zweite Vorschlag ändert
Curtis Bechtel
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.