Geben Sie bei zwei verschiedenen Positionen auf einem Schachbrett und der Art der Figur die minimale Anzahl von Zügen aus, die diese Figur benötigt, um von einer Position zur nächsten zu gelangen.
Regeln
Das gegebene Stück kann König, Königin, Turm, Ritter und Bischof sein. (Diese Eingabe kann als 5 beliebige eindeutige Zeichen verwendet werden.)
Die 2 Positionen können in jedem beliebigen Format eingenommen werden.
Example:
a8 b8 c8 d8 ... h8
a7 b7 c7 d7 ... h7
...
...
a1 b1 c1 d1 ... h1
Falls das Stück nicht dorthin gelangen kann, geben Sie etwas anderes als eine positive ganze Zahl aus.
Beispiele
i/p ---- o/p
King
a1,a4 3
a1,h6 7
b3,h5 6
Queen
a1,a4 1
a1,h6 2
b3,f7 1
Rook
a1,a4 1
a1,h6 2
h2,c7 2
Knight
a1,a4 3
a1,h6 4
b2,d3 1
b2,c3 2
b3,c3 3
a1,b2 4
Bishop
a1,a4 -1
a1,h6 2
b2,d3 -1
e1,h4 1
Antworten:
JavaScript (Node.js) ,
183180179 ByteProbieren Sie es online!
Vielen Dank an Arnauld für die Prüfung. Ritterprüfung
quelle
max
durch ein ternäres ersetzen .APL (Dyalog Classic) ,
117107105103989795928987 ByteProbieren Sie es online!
linkes Argument ist Stückart: 0 = König, 1 = Königin, 2 = Turm, 3 = Ritter, 4 = Bischof; Das rechte Argument ist eine 2x2-Matrix von Koordinaten, wobei jede Zeile eine Position darstellt. gibt 0 für nicht erreichbar zurück
|-⌿⍵
berechnet das Paar [abs (∆x), abs (∆y)](⍎⍺⊃
...)⊣
wählt einen Ausdruck aus der Liste "..."; Wenn es eine Funktion ist, wird sie angewendet|-⌿⍵
; Wenn es sich um einen Wert handelt (dies gilt nur für einen Ritter),⊣
geben Sie diesen stattdessen zurück|-⌿⍵
König: max (
⌈/
) der abs ∆-sKönigin: Entferne Nullen (
~∘0
) und zähle (≢
) einzigartig (∪
)Turm: Summe (
+/
) von Signa (monadisch×
; 0 für 0, 1 für positiv)Ritter:
{⍺∊⍵:0⋄1+⍺∇i/⍨∨⌿2=|×/↑⍵∘.-i←,⍳8 8}/,¨⊂¨↓⍵
- Beginne mit der Anfangsposition und berechne rekursiv Generationen von Ritterzügen, bis die Endposition im Satz ist; Rekursionstiefe zurückgebenbischof: sind die paritäten der beiden gleich? (
2=.|⊢
, äquivalent zu=/2|⊢
) multipliziere das boolesche Ergebnis (0 oder 1) mit dem count-unique (≢∘∪
)quelle
⍎⍺⊃
. Sehr schlau.Java (JDK) , 229 Byte
Probieren Sie es online!
Erklärungen
Code:
Credits
quelle
Kohle , 108 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:
Listen Sie alle 64 Felder der Tafel in der vordefinierten leeren Listenvariablen auf.
Erstellen Sie eine Liste von Listen, deren erster Eintrag eine Liste mit der Startposition ist.
Wiederholen, bis der letzte Eintrag der Liste die Endposition enthält.
Filtern Sie alle Brettpositionen, die ein Ritter von einem Eintrag im letzten Eintrag der Listenliste entfernt hat, und verschieben Sie diese Liste in die Listenliste. Dies schließt Positionen ein, die zuvor besucht wurden, an denen wir uns jedoch ohnehin nicht interessiert haben, sodass wir am Ende eine umfassende erste Suche des Boards nach der Endposition durchführen.
Berechnen Sie die absoluten Koordinatendifferenzen zwischen Start- und Endposition.
Wählen Sie basierend auf dem Eingabestück.
Wenn es ein König ist, dann drucken Sie die maximale absolute Koordinatendifferenz.
Wenn es sich um eine Dame handelt, drucken Sie 2, es sei denn, die beiden Unterschiede sind gleich oder einer ist Null.
Wenn es sich um einen Turm handelt, drucken Sie 2, es sei denn, einer der Unterschiede ist Null.
Wenn es ein Läufer ist, dann drucke 0, wenn die Quadrate von entgegengesetzter Parität sind, andernfalls drucke 2, es sei denn, die beiden Unterschiede sind gleich.
Wenn es ein Ritter ist, drucken Sie die Anzahl der Schleifen, um die Endposition zu finden.
quelle
Japt , 67 Bytes
Probieren Sie es online!
Das war eine ziemliche Erfahrung. Ich habe mich sehr von der hervorragenden APL-Antwort inspirieren lassen . Ich vermute, dass gerade im Knight-Code noch viel Golf möglich ist.
Die Positionen sind die erste Eingabe im Formular
[[x1,x2],[y1,y2]]
. Es sollte auch gut funktionieren[[y1,y2],[x1,x2]]
. Die Teileauswahl ist die zweite Eingabe, mit 0 = König, 1 = Dame, 2 = Ritter, 3 = Turm, 4 = Bischof. Beachten Sie, dass Ritter und Turm im Vergleich zur APL-Antwort vertauscht sind.Erläuterung:
quelle
á
sich das Ergebnis[[1,2][2,1]]
erheblich verkürzte .á
, nette!U
Ist nach implizit@
, so dass Sie zwei Bytes in der Ritterfunktion speichern können. Sie können es auch mit starten@=ã ü;
, um ein anderes zu speichern. (Derã
Trick ist auch klug :-))