Einführung
Aron Nimzowitsch war ein führender Schachmeister und ein einflussreicher Schachautor.
In seinem Buch "Mein System" befasst sich das erste Kapitel mit der Bedeutung des Zentrums und warum Sie es dominieren sollten. Der einfache Grund ist, dass Ihre Figuren in der Mitte mehr Möglichkeiten für direkte nächste Züge haben, was dem Spieler wiederum mehr Kraft verleiht.
Dies wird sehr deutlich, wenn man sich die verschiedenen Positionen eines Ritters und seine möglichen nächsten Züge (in Pink dargestellt) auf einem leeren Brett ansieht:
Zielsetzung
Bewerten Sie die Anzahl möglicher direkter nächster Züge eines Ritters auf einem leeren Brett anhand seiner Position.
Eingangsspezifikationen
Die Position des Ritters.
Zuerst das x (Spalte) und dann das y (Zeile). 0 0
ist die linke untere Ecke.
Der Einfachheit halber habe ich die Bezeichnungen eines Schachbretts nur in Zahlen geändert. Für unsere Beispiele und Testfälle verwenden wir einen 0-basierten Index. Sie können jedoch auch einen 1-basierten Index verwenden.
Sie können alle möglichen Eingabeformate, ein Array, Funktionsargumente usw. verwenden.
Ausgangsspezifikationen
Die Anzahl der möglichen direkten nächsten Züge eines Ritters auf einem leeren Brett.
Testfälle
3 4 => 8
4 6 => 6
7 7 => 2
1 0 => 3
Testfälle verwenden einen 0-basierten Index. Das vollständige Werteraster ist:
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
Antworten:
Python 2 , 35 Bytes
Probieren Sie es online!
Python 2 , 39 Bytes
Probieren Sie es online!
Nimmt Eingänge mit 0-Index.
Der Ausdruck
x*(7-x)/5
übernimmt die Koordinatenwerte0..7
bis(
min(x,7-x,2)
macht dasselbe, ist aber länger.) Summiert dies fürx
undy
ergibt das richtige Muster, aber mit den falschen Zahlen(Siehe Neils Lösung für eine bessere Begründung, warum dies das richtige Muster ergibt.)
Das Mapping
a -> 50/(8-a)-4
mit Floor-Division liefert schließlich die richtigen WerteEine alternative, gleich lange Lösung mit 1-indizierten Eingaben:
quelle
(7-a)*a/5
ist 3 Bytes kürzer alsmin(a,7-a,2)
.*l
Tatsächlich kostet dich ein Byte insgesamtlambda a,b:"23468"[(7-a)*a/5+(7-b)*b/5]
nur 41 Bytes.x*(9-x)/6
, einseitig indiziert.<strike>
wie alle anderen, um Golffortschritte zu zeigen?MATL ,
17141312 BytesDanke an @Neil für 1 Byte!
Die Eingabe ist 1-basiert.
Probieren Sie es online!
Erläuterung
Dies berechnet den euklidischen Abstand von der Eingabe zu jeder der 64 Positionen im Schachbrett und ermittelt, wie viele dieser Werte der Quadratwurzel von 5 entsprechen.
Da es sich bei den Koordinaten um ganzzahlige Werte handelt, können wir sicher sein, dass die beiden Gleitkommawerte, die die Quadratwurzel von 5 darstellen (die aus den Koordinaten berechnet wurden und die direkt berechnet wurden), tatsächlich identisch sind.
quelle
double
Zahl sind. Ant es speichert ein ByteMathematica
6343 BytesMit 20 Bytes gespart dank Vorschlägen von Martin Ender!
Oben finden Sie die Anzahl der Quadrate, die 1 Sprung von der angegebenen Zelle entfernt sind, in der vollständigen Ritter-Tour-Grafik.
g=KnightTourGraph[8,8,VertexLabels->"Name",Axes->True]
Zeigt das vollständige Tourdiagramm des Ritters mit Scheitelpunktnamen und Koordinaten an. Beachten Sie, dass Mathematica standardmäßig eine einseitige Indexierung für die Koordinaten verwendet.
#+1+8#2&[r,f]
converts gibt den Scheitelpunkt zurück, der dem Quadrat in Rang (Zeile)r
und Datei (Spalte) entsprichtf
, wobei nullbasierte Werte als Eingabe verwendet werden.Zum Beispiel
#+1+8#2&[2,1]
gibt 11 zurück.EdgeCount
gibt die Anzahl der Kanten im Nachbarschaftsgraphen an.Die Kanten für Rang 2, Datei 1 (Quadrat 11):
Die hervorgehobenen Kanten:
Methode 2: Euklidischer Abstand
70 Bytes
Diese Methode ist länger, aber möglicherweise von Interesse. Der Ansatz besteht darin, den euklidischen Abstand zwischen der Mitte des Schachbretts und der interessierenden Zelle zu überprüfen.
Vorbildlich
2
8
Zur Veranschaulichung, wie weit der Abstand von der Mitte des Schachbretts ausreicht, um einen Wert zuzuweisen.
Kreis [{4.5, 4.5}, 4],
Kreis [{4.5, 4.5}, 4.6], Abflachen [f / @ {2, 3, 4, 6, 8}, 1]}, Achsen -> Wahr, AchsenOrigin -> {-1, -1}]
Die Zahlen 2.2, 3, 4 und 4.6 sind die Radien der Kreise.
quelle
KnightTourGraph
Mathematica und seine eingebauten ... :-)#
am Ende Ihres Quellcodes (kurz vor dem]
). Sie sollten in der Lage sein,IncidenceList
anstatt zu verwendenEdgeList@NeighborhoodGraph
. (Alternativ gibt es auchEdgeCount
, aber ich denke, das wird länger.)EdgeCount[8~KnightTourGraph~8,#+1+8#2<->_]&
EdgeCount
ist sehr cool!JavaScript (ES6), 38 Byte
Nimmt 0-indizierte Eingaben entgegen. Erklärung: Schauen Sie sich die Quadrate der Abstände zum Zentrum an:
Die Anzahl der erreichbaren Felder ist in fünf Bereiche unterteilt:
Ich berechne tatsächlich 24,5 - (3,5 - x) ** 2 - (3,5 - y) ** 2 = (7 - x) * x + (7 - y) * y, da es eine kürzere Berechnung ist, aber alles, was es tut, ist umgekehrt die Reihenfolge der Bands.
quelle
x*(7-x)
nur eine Operation vorgestellt, die wie ein abwärts gerichteter Bogen aussieht0..7
und eine Kurvenanpassung durchführt, aber dies erklärt, warum sie ein so schönes Muster ergibt, wenn sie fürx
und summiert wirdy
.Gelee, 10 Bytes
1-indiziert. Nimmt ein einzelnes Argument des Formulars an
[x,y]
. Probieren Sie es hier aus.Dennis hat ein Byte gespeichert!
quelle
Mathematica,
44-40BytesMomentan habe ich drei Lösungen mit derselben Byteanzahl:
All dies sind unbenannte Funktionen, die ein Koordinatenpaar annehmen
{3, 4}
, das auf 1 basiert.Ich habe versucht, eine etwas explizite Formel zu finden. Das allgemeine Muster auf dem gesamten Board sieht folgendermaßen aus:
Die tatsächlichen Werte dieser Farben (von hell bis dunkel) sind
2, 3, 4, 6, 8
. Das ist:Wir nutzen die Symmetrie zunächst aus, indem wir den Ursprung in die Mitte verschieben, den absoluten Wert nehmen und das Ergebnis von subtrahieren
4
. Dies gibt uns Koordinaten,0.5
um3.5
von jeder Ecke zuzunehmen. Um die Mittelpunktkoordinaten die gleiche müssen wir Karte zu machen0.5
und1.5
auf unterschiedliche Werte und2.5
und3.5
auf den gleichen Wert. Dies kann leicht durch Multiplikation mit0.8
(ergibt{0.4, 1.2, 2., 2.8}
) und Bodenbildung des Ergebnisses erreicht werden. Jetzt haben wir also{0, 1, 2, 2}
möglichst große Entfernungen vom Zentrum. Wenn wir die Koordinaten in jeder Zelle addieren, erhalten wir diese Tabelle:Dies hat eindeutige Werte für alle möglichen Ergebnisse, daher verwenden wir sie einfach als Index für
2[3,4,6,8]
.In der zweiten Version verwenden wir Decke statt Boden. Auf diese Weise
2
,3
und4
ist schon richtig, aber wir bekommen5
und6
statt6
und8
, so dass wir diejenigen manuell mit einer Substitutionsregel korrigieren.Schließlich wird in der dritten Version, wir erweitern
5
und6
nach oben6
und8
durch Potenzierung von einem anderen Stockwerk Operation folgt.quelle
APL, 21 Zeichen
Auf Englisch:
(⍳8 8)
: 8x8 Rang-2-Array mit den Koordinaten aller Zellen;+/¨×⍨(⍳8 8)-⊂⍵
: Quadrat der euklidischen Abstände der gegebenen Zelle in Bezug auf jede Zelle auf dem Brett;5=
: Matrix von 0/1, wobei die Einsen in quadratischen Abständen gleich 5 erscheinen;+/,
: summiere die abgeflachte MatrixTest (in Ursprung 1):
In dieser Form:
Das linke Argument kann die Abmessungen der Platine angeben. Daher
8 8 f
wird für das Standardquadrat Schachbrett arbeiten. Auf einer größeren und rechteckigen Tafel würden die Testfälle jedoch unterschiedliche Ergebnisse liefern. Zum Beispiel auf einer 12x10 Karte:quelle
≢⍸5=+/¨×⍨-∘⎕¨⍳8 8
Online ausprobieren!Java -
160 bis150 BytesUngolfed:
Der ungolfed Code ist identisch, außer dass die Grenzen der for-Schleife geändert werden, um 4 Bytes zu sparen. Durchläuft jede mögliche Bewegung und führt eine Grenzprüfung durch (> 0 und <8). Verwendet die Tatsache, dass die Offsets (1, 2), (2, 1), (-1, 2), (-2, 1) usw. sind und in der Lage sind, 2 Züge für jeden Wert von i und j zu überprüfen.
Edit: 10 Bytes gespeichert dank Vorschlägen von Leaky Nun und u902383.
quelle
int m=0,i=-1,j;
um ein paar Bytes zu rettenC, 44 Bytes
Aber das ist besser:
quelle
;
. Kompiliert nicht.Haskell,
4948 Bytesquelle
[0..7]
für 1 Byte in einer Variablen speichern.Java, 81 Zeichen (113 Bytes)
Codieren Sie die gesamte Ergebnistabelle als Unicode-Tabelle und erhalten Sie dann die entsprechenden Bytes, indem Sie bitweise Operationen ausführen.
Sie können es hier online sehen: https://ideone.com/K9BojC
quelle
Python, 94 Bytes
Verwendet 1-basierte Indizierung.
Demo unter https://repl.it/C6gV .
quelle
Pyth -
3315 BytesVielen Dank an @LeakyNun für die Reduzierung meiner Größe um die Hälfte.
Das Umstellen der Karten und der Karten
V
wird wahrscheinlich dazu führen, dass das Golfen ein wenig ausfällt.Test Suite .
quelle
APL (Dyalog Unicode) , 15 Byte SBCS
Probieren Sie es online!
quelle
J , 23 Bytes
Probieren Sie es online!
Hommage an Lynns Methode, umgewandelt in J
quelle
Eigentlich 18 Bytes
Probieren Sie es online!
Dies implementiert die gleiche Formel , dass viele andere Antworten wurden mit:
50/(8-x*(7-x)//5+y*(7-y))//5)-4
. Die Eingabe wird als Liste genommen:[x,y]
(oder ein beliebiges iterierbares Literal in Python, wie(x,y)
oderx,y
).Erläuterung:
quelle
Perl 6 , 44 Bytes
Probieren Sie es online!
quelle