Sechseckiges Schach beschreibt eine Familie von Schachvarianten, die auf einem Brett gespielt werden, bei dem die Felder Sechsecke anstelle der traditionellen Felder sind. Es gibt viele solcher Varianten; Bei dieser Herausforderung konzentrieren wir uns auf die am häufigsten verwendete Variante von Gliński.
Das Brett besteht aus drei Farben (so dass die gleiche Farbe keine Kante hat), wobei die Kanten der Sechsecke den Spielern zugewandt sind. Das Board verfügt über 11 Dateien, gekennzeichnet durch die Buchstaben a
durch l
(Letter j
nicht verwendet wird ), und 11 Reihen (die 60 ° biegen bei Datei f
). Ränge 1
durch 6
enthalten jeweils 11 Zellen, Rang 7
hat 9 Zellen, Rang 8
hat 7, und so weiter. Der Rang 11
enthält genau eine Zelle: f11 . (Wenn es hilft, stellen Sie sich vor, dass jeder Rang eine sehr breite "V" -Form hat.)
Hier ist ein Beispielbild des Bretts mit dem Ritter in der mittleren Zelle. Die mit einem Punkt markierten Felder sind die erlaubten Züge dieses bestimmten Ritters. Der Springer bewegt sich ähnlich wie "normales" Schach, Two-Down-and-One-Over. In hexagonalen Schachbegriffen handelt es sich um eine orthogonale Bewegung (über eine Kante) und dann um eine diagonale Bewegung in dieselbe Richtung (die Bewegung, die der gleichen Farbe am nächsten kommt). Zum Beispiel mit dem Ritter unten, wird eine orthogonale Bewegung "auf" zu dem hellbraunen dann von einer diagonalen Bewegung "auf und rechts" oder "auf und links" zu dem nächsten hellbraunen begleitet.
Aus dem öffentlichen Bereich über https://commons.wikimedia.org/wiki/File:Glinski_Chess_Knight.svg
Dieser Springer steht bei f6 und die legalen Züge sind somit
c4, c5, d3, d7, e3, e8, g3, g8, h3, h7, i4, i5
Eingang
Eine einzige Eingabe, die die Startzelle unseres Ritters angibt. Dies kann eine einzelne Zeichenfolge "b6"
, zwei Zeichenfolgen "b", "6"
usw. in einem beliebigen geeigneten Format sein . Die eingegebenen Buchstaben können Groß- oder Kleinbuchstaben sein - Sie haben die Wahl.
Ausgabe
Eine Liste der gültigen Züge, die ein Ritter an diesem Ort ausführen kann. Dies kann ein Array von Zeichenfolgen sein, eine einzelne Zeichenfolge mit einem eindeutigen und konsistenten Trennzeichen, getrennte Zeichenfolgen durch Zeilenumbrüche usw., je nachdem, was am bequemsten ist. Die Ausgabe muss nicht unbedingt in sortierter Reihenfolge erfolgen und kann entweder in Groß- oder Kleinbuchstaben erfolgen - Sie haben die Wahl.
Regeln
- Angenommen, keine anderen Teile sind auf dem Brett oder stören die Bewegungen. Wir konzentrieren uns nur auf den Ritter.
- Es ist entweder ein vollständiges Programm oder eine Funktion zulässig. Bei einer Funktion können Sie die Ausgabe zurückgeben, anstatt sie zu drucken.
- Fügen Sie nach Möglichkeit einen Link zu einer Online-Testumgebung hinzu, damit andere Benutzer Ihren Code ausprobieren können!
- Standardlücken sind verboten.
- Dies ist Codegolf, daher gelten alle üblichen Golfregeln, und der kürzeste Code (in Byte) gewinnt.
Beispiele
b6
a3, c4, d5, d9, e7, e8
f6
c4, c5, d3, d7, e3, e8, g3, g8, h3, h7, i4, i5
f11
d8, e8, g8, h8
i1
f2, f3, g4, h4, l2, k3
quelle
Antworten:
JavaScript (ES6), 184 Byte
Nimmt die Datei
F
als Zeichen und den RangR
als Ganzzahl in der aktuellen Syntax(F)(R)
. Gibt ein Array von Zeichenfolgen zurück.Wie?
Schritt 1: Konvertieren Sie die Datei / den Rang in kartesische Koordinaten
Wir konvertieren die hexagonalen Schachkoordinaten in kartesische Koordinaten (x, y) mit x in [0 .. 10] und y in [0 .. 20] :
Schritt 2: Übernehmen Sie die Bewegungsvektoren
Unten ist die Liste der Bewegungsvektoren im kartesischen System:
Wir wenden jede auf die Quellkoordinaten (x, y) an und erhalten eine Liste der Zielkoordinaten (X, Y) .
Schritt 3: Testen Sie die Zielkoordinaten
Wir müssen jetzt überprüfen, welche Zielkoordinaten sich tatsächlich innerhalb der Tafel befinden. Dies erfolgt durch Testen von X + Y und X - Y :
Die Koordinaten sind gültig, wenn alle folgenden Vergleiche zutreffen:
Wir sollten auch sicherstellen, dass X in [0 .. 10] ist . Dies wird nicht explizit gemacht , weil
s[X]
ist nicht definiert , wenn es nicht ist, was schließlich in einem falsy Wert führt , die herausgefiltert wird.Schritt # 4: Konvertieren Sie zurück in hexagonale Schachkoordinaten
Schließlich werden die gültigen Zielkoordinaten unter Verwendung der Umkehrung der in Schritt 1 beschriebenen Formeln zurück in hexagonale Schachkoordinaten umgewandelt.
Testfälle
Code-Snippet anzeigen
quelle
Stapel. 403 Bytes
Passt das Koordinatensystem an, allerdings anders als bei @ Arnauld. Die
c
Subroutine nutzt die Symmetrie aus, indem sie die Spiegelreflexion jeder Bewegung versucht. (Ich habe auch versucht zu drehen, aber das hat zu viele Bytes gekostet.)quelle
JavaScript (ES6), 184 Byte
Ich dachte, ich würde meine Batch-Lösung auf ES6 portieren, um zu sehen, wie es verglichen wird ... Ich hätte nicht erwartet, dass es so eng wird ...
quelle
CJam, 77
Probieren Sie es online aus
Überblick:
Ich verwende ein Koordinatensystem, das wie folgt aussieht: a..f und 1..6 auf der linken Seite, ohne Biegung verlängert, Buchstaben durch Zahlen ersetzt und in 0-basiert geändert (b3 → [1 2], g1) → [6 1], k3 → [9 6]). Die relativen Bewegungen in diesem System sind [1 3], [2 -1], [2 3] und ihre Reflexionen (negativ und vertauscht, zB [1 3] → [-1 -3], [3 1], [- 3 -1]). Eine resultierende [xy] -Position ist gültig, wenn [xyz] ⊂ [0 1 .. 10] ist, wobei z = x-y + 5.
quelle
Dyalog APL, 72 Bytes
Versuchen
erstellt eine Liste
a
aller gültigen Zellen:'A1' 'A2' ... 'L6'
a
wird sowohl für die Eingabe als auch für die Ausgabe verwendetErstellt eine Liste
j
der entsprechenden Koordinatena
in einem System, in dem die x-Achse entlangA6-L1
und die y- Achse entlang istF1-F11
eine imaginäre dritte Koordinate ist die Differenz der ersten beiden
Wenn die Eingabezelle in Koordinaten übersetzt wird
0 0 0
, kann sich ein Ritter zu den Zellen bewegen, deren Produkt aus Koordinaten 6 oder -6 istquelle
Python 3.6, 149
Eine anonyme Funktion, die mit zwei Zeichenfolgen für die Datei und den Rang aufgerufen wird. gibt eine Liste von Zeichenketten zurück.
Ungolfed:
quelle