Dies ist Hole-3 von The Autumn Turnier von APL CodeGolf . Ich bin der ursprüngliche Autor des Problems dort und darf es daher hier erneut posten.
Gegeben:
eine Anzahl von Umdrehungen (bitte geben Sie an, wenn keine Bewegung 0 ist, ansonsten nehmen wir an, dass es 1 heißt) und
eine Liste von einer oder mehreren Startpositionen (in beliebiger Form, z. B. 0 oder 1 indexierte Koordinaten oder 64 fortlaufende Zahlen / Zeichen oder A1 – H8 - geben Sie an, welche) auf einem 8-mal-8-Schachbrett,
Gibt (in beliebiger Reihenfolge) die Liste der eindeutigen Positionen zurück (im selben Format wie die Eingabe), an denen sich der Ritter nach der angegebenen Anzahl von Runden befinden kann.
Jeder Ritter muss sich mit jedem Zug bewegen, aber Sie müssen sich keine Sorgen machen, dass mehrere Ritter dasselbe Feld besetzen.
Ein Ritter kann sich nur zu den mit X markierten Positionen relativ zu seiner aktuellen Position bewegen, die mit ♞ markiert ist:
Beispiele (1-indizierte Koordinaten)
1
umziehen von [[1,1]]
: [[2,3],[3,2]]
2
bewegt sich von [[1,1]]
: [[1,1],[1,3],[1,5],[2,4],[3,1],[3,5],[4,2],[4,4],[5,1],[5,3]]
1
umziehen von [[1,1],[5,7]]
: [[2,3],[3,2],[3,6],[3,8],[4,5],[6,5],[7,6],[7,8]]
2
bewegt sich von [[1,1],[5,7]]
: [[1,1],[1,3],[1,5],[1,7],[2,4],[2,6],[2,8],[3,1],[3,3],[3,5],[3,7],[4,2],[4,4],[4,6],[4,8],[5,1],[5,3],[5,5],[5,7],[6,4],[6,6],[6,8],[7,3],[7,7],[8,4],[8,6],[8,8]]
0
bewegt sich von [[3,4]]
: [[3,4]]
quelle
[[1,1]], 2 -> [[2,3],[3,2]]
Antworten:
Wolfram-Sprache (Mathematica) , 45 Bytes
Da die andere Lösung falsch ist (siehe Martins Kommentar unten), entscheide ich mich, meine Lösung zu posten:
Probieren Sie es online!
Ultimative Infixnotation ...
Nimmt 2 Eingabe, die erste ist eine Liste von Zahlen in Reichweite,
[1,64]
beschreiben Sie die Startpositionen des Ritters, die zweite ist die Anzahl der Schritte.Diese Lösung basiert auf dem extremen Komfort der in Mathematica integrierten Funktionen:
AdjacencyList
may nimmt eine Liste von Scheitelpunkten auf der rechten Seite und gibt eine Liste von Scheitelpunkten zurück, die an die bereits entfernten und sortierten Scheitelpunkte angrenzen .KnightTourGraph
ist ein Builtin. Kein Wunder.Nest
Nest[f, expr, n]
Nimmt Argumente in die##
richtige Reihenfolge , die wir über ihre rechte Seite als splatNest[f, ##]
.a~b~c~d~e
as(a~b~c)~d~e
, sodass keine eckige Klammer erforderlich ist. Ohne Infixnotation und Abflachung##
wäre esNest[AdjacencyList[KnightTourGraph[8, 8], #] &, #, #2]&
.quelle
JavaScript (ES7), 99 Byte
Eingabe- / Ausgabeformat: Quadrate Indizes in [0 ... 63] .
Testfälle
Dieses Snippet enthält zwei Hilfsfunktionen zum Übersetzen von und in das vom OP bereitgestellte Format.
Code-Snippet anzeigen
Wie?
Ein Zug von (x, y) nach (X, Y) ist ein gültiger Ritterzug, wenn wir entweder:
Durch Quadrieren anstelle von Absolutwerten kann dies ausgedrückt werden als:
Da 1 und 4 die einzigen perfekten Quadrate sind, die zusammen mit XOR 5 ergeben, haben wir einen gültigen Springerzug, wenn:
(xX) ²XOR (yY) ²XOR 5 = 0
Wir wenden diese Formel auf jedes Quadrat p = 8y + x auf dem Brett und jedes Ritterquadrat P = 8Y + X an, um die neuen möglichen Ritterzielquadrate abzuleiten, und wiederholen diesen Vorgang n- mal rekursiv .
quelle
Oktave, 69 Bytes
Online Demo!
Der Ein- / Ausgang ist die Konfiguration der Karte am Anfang / Ende als binäre 8 * 8-Matrix.
Erläuterung:
n
Wiederholen Sie für Schritte die morphologische Erweiterung der Platte mit der folgenden Maske:quelle
Retina ,
147102 BytesProbieren Sie es online! Nimmt die Eingabe als 8x8-Tafel
:
mit den mit markierten Rittern vorN
s , mit einer Ziffer für die Anzahl der Runden in der nächsten Zeile (es macht keinen Sinn, mehr als 9 Runden zu haben, aber wenn Sie darauf bestehen, kann ich es für eine zusätzliche unterstützen Byte). Beachten Sie, dass die Ausgabe zusätzliche Leerzeichen enthält. Bearbeiten: 45 Bytes dank @MartinEnder gespeichert. Erläuterung: In der ersten Stufe wird die Anzahl der Umdrehungen in unäre Zeichen umgewandelt, wobei jedoch Tabulatorzeichen verwendet werden, damit sie später nicht versehentlich abgeglichen werden, während in der zweiten Stufe rechts auf der Tafel Leerzeichen eingefügt werden, um zu verhindern, dass sich die Regex-Zeichen überschneiden die Kante. Die dritte Stufe ersetzt alleN
s und:
s, die ein Springer von einemN
mit einemn
während die vierte Stufe alle verbleibendenN
s löscht , die ändertn
s zuN
s und subtrahiert 1 von der Bewegungszahl. Dies wiederholt sich, bis der Bewegungszähler Null ist.quelle
Gelee , 29 Bytes
Probieren Sie es online!
0-indizierte Koordinaten. Mit ziemlicher Sicherheit ist dies nicht optimal.
-1 Byte dank user202729
Erläuterung
quelle
Ç
.05AB1E ,
2725 BytesVielen Dank an Emigna für das Speichern von 2 Bytes!
Verwendet 1-indizierte Koordinaten.
Code:
Verwendet die 05AB1E- Codierung.Probieren Sie es online!
Erläuterung:
Dies gibt uns das folgende Array:
Welches sind die Deltas der Bewegungen des Ritters.
quelle
•eĆ•SÍü‚
anstelle vonƵ‡4в2ô<D(«
2 Bytes speichern.Python 3, 105 Bytes
Für die Rekursion muss ein benanntes Lambda verwendet werden. Ich bin mir nicht sicher, ob das disqualifizierend ist. Übergeben Sie die Startpositionen als 0-indizierte Quadratzahlenliste. 0 zählt als keine Züge.
quelle
Java (OpenJDK 8) , 124 Byte
Probieren Sie es online!
Eingabe- / Ausgabeformat
Die Eingabe / Ausgabe wird als Bits in a
long
(64 Bits) dargestellt: gesetzte Bits bedeuten, dass ein Pferd vorhanden ist, nicht gesetzte Bits bedeuten, dass kein Pferd vorhanden ist. Beispiel:Erklärungen
Credits
(X-x)²+(Y-y)²==5
Trick aus Arnauld's JavaScript-Antwort wurde wiederverwendetint[]
auf 64-Bitlong
.quelle
(m,p)->{for(;m-->0;){int i=64,a[]=p,x,y,u[]={1,3,5,9,15,19,21,23};for(p=new int[i];i-->0;)for(int z:u)if((((x=i/8+z/5-2)|(y=i%8+z%5-2))&-8)==0)p[x*8+y]|=a[i];}return p;}
(m,p)->{for(int i,j,a[],x;m-->0;)for(a=p,p=new int[i=64];i-->0;)for(j=64;j-->0;)p[j]|=(x=i%8-j%8)*x+(x=i/8-j/8)*x==5?a[i]:0;return p;}
int[]
durchlong
:(m,p)->{for(long i,j,a;m-->0;)for(a=p,p=i=0;i<64;i++)for(j=64;j-->0;)p|=(p=i%8-j%8)*p+(p=i/8-j/8)*p==5?(a>>i&1)<<j:0;return p;}
Jelly ,
2928 BytesProbieren Sie es online!
Die Anzahl der Umdrehungen erfolgt durch STDIN, und die Quadrate sind ein Argument.
Dies verbindet die @ HyperNeutrino Jelly-Lösung mit einem anderen Ansatz.Schlage jetzt @HyperNeutrino um 1 ganzes Byte!
Vorschläge, um ein paar Bytes abzuschlagen, sind erwünscht!
Link 1 (Das Schachbrett)
Link 2 (Generierung verschieben)
Link 3 (Viereckprüfung)
quelle
Schale , 18 Bytes
Verwendet die 1-basierte Indizierung von Quadraten und Schritten. Probieren Sie es online!
Erläuterung
quelle
R ,
145183134 BytesDies ist das Ergebnis von Giuseppes exzellentem Golfspiel mit meinem anfänglichen, nicht allzu golfenen Algo (siehe Kommentar unten).
Probieren Sie es online!
Eingang und Ausgang sind 1 ... 64-basiert. Nimmt einen Positionsvektor mit der Notation 1 ... 64 auf. Ordnet es einer 1: 576-Notation zu, dh einem Super-Board aus neun Boards. In dieser Notation sollte jeder Ritter bei jeder Iteration in der Lage sein, sich um +/- 22,26,47,49 zu bewegen. Geben Sie zukünftige Positionen in der Notation 1 ... 64 zurück, mit Ausnahme derjenigen, die von der zentralen Tafel fallen. Das TIO-Beispiel zeigt das Ergebnis mit einer 8x8-Matrix an.
quelle
[0...63]
stattdessen in Notation nehmen.[1..64]
für die Eingabe und Ausgabe. +1, aber das ist eine ausgezeichnete Antwort.