Jack und Jane beschlossen, eine Partie Schach zu spielen, um sich die Zeit zu vertreiben. Leider ist Jack ziemlich schlecht darin, sich etwas vorzustellen. Er findet es natürlich schwierig, herauszufinden, welche Züge für ein bestimmtes Stück außer einem Bauern möglich sind!
Ihre Herausforderung besteht darin, Jack dabei zu helfen, die möglichen Optionen für eine bestimmte Figur (außer einem Bauern) zu finden.
Falls man es vergessen hat, werden die verschiedenen Stücke bezeichnet mit:
- K: König
- F: Königin
- N: Ritter
- B: Bischof
- R: Turm
Als Beispiel wird der Ritter in dem folgende Bild angeordnet auf d4
und bewegen kann c2
, b3
, b5
, c6
, e6
, f5
, f3
, e2
. Für eine bestimmte Eingabe:
Nd4
du würdest produzieren:
Nc2 Nb3 Nb5 Nc6 Ne6 Nf5 Nf3 Ne2
Regeln:
- Die Reihenfolge der Ausgabe spielt keine Rolle, solange alle möglichen Züge aufgelistet sind
- Die möglichen Züge können durch Leerzeichen, Zeilenumbrüche oder andere Trennzeichen getrennt werden
- Die Eingabe kann als Parameter oder über an das Programm übergeben werden
STDIN
- Whitespace im Programm soll gezählt werden, nutzen Sie es also optimal
Das ist Code Golf. (Vermeiden Sie es, speziell für diesen Zweck entwickelte Tools / Dienstprogramme zu verwenden.) Die kürzeste Antwort gewinnt!
f(x)... case "Q": {f("B");f("R")}
Wenn die Funktion ein # enthält, sollten diese Teil der Byteanzahl sein.Antworten:
GolfScript,
9493 ZeichenMein erstes GolfScript-Programm! Ich habe viele Stunden gebraucht, um herumzufummeln, ohne wirklich zu wissen, was ich tat, aber ich bestand darauf und denke, ich habe es geschafft, die Grundlagen der Sprache zu lernen und es ziemlich gut zu spielen.
Vollgolfen :
Kommentierte und schönere Quelle :
Es mag aussehen wie Claudius Antwort, weil ich mich auf seine Antwort sowie auf meine (nicht eingereichte) C-Lösung bezogen habe, während ich meine Antwort gemacht habe. Er lieferte ein gutes Exemplar eines (relativ) komplexen, funktionierenden GolfScript-Programms, und es half mir, viel über die Sprache zu lernen. Also danke, Claudiu!
Da Sie noch kein GolfScript-Neuling sind, würde ich mich über Feedback freuen!
quelle
Python,
217212220217213 ZeichenHat die 213-Byte-Mathematica-Lösung gebunden
Ich begann damit, alle gültigen Züge zu generieren, die aber zu groß wurden, sodass der Ansatz dem von Mathematica ziemlich ähnlich ist.
quelle
Mathematica,
278272264260215213 ZeichenUngolfed-Version:
Anwendungsbeispiel:
Die ungolfed version erstellt ein volles Board und wählt dann die richtigen Positionen mit aus
Cases
, wohingegen die golfed version ungültige Züge sofort imTable
Kommando fallen lässt, indem sie absetzt##&[]
, was einfach verschwindet.quelle
N4d
? Sollte es nichtNd4
stattdessen sein?Nd4
.ChessboardDistance
Abs
in Mathematica nicht, weil sie Alternativen in einem Muster bezeichnen.Haskell
225 220 208 205 200182Es wird schwierig sein, Mathematica zu berühren, wenn Schachzüge eingebaut sind: rollseyes: (gut gespielt m.buettner)Ich nehme alles zurück. Schlage Mathematica um 31!Letzte Änderung: Ersetzte Groß- / Kleinschreibung durch eine inline Filterfunktion zum Verständnis, um den Eintrag in R zu übertreffen;)
Verwendung:
Ungolfed (entspricht der 208-Zeichen-Version vor dem Einfügen von 'u'):
quelle
piece
der Liste etwas hinzufügen ,[piece,newfile, newrank]
wenn Sie sie nicht für den Mustervergleich verwenden, um Zeichen zu sparen?Bash, 238
Wie es funktioniert
Die Idee ist, jedes Feld auf der Tafel durch einen numerischen Wert darzustellen, wobei seine Koordinaten als Zahl zur Basis 20 genommen und 200 subtrahiert werden. Auf diese Weise
a1
wird20 * 10 + 1 - 200 = 1
,h8
wird20 * 17 + 8 - 200 = 148
, usw.Jetzt können die möglichen Züge des Bischofs durch (positive oder negative) Vielfache von 19 - gleiche Anzahl von Schritten (+20) und nach links (-1) - oder 21 - gleiche Anzahl von Schritten (+20) dargestellt werden ) und rechts (+1).
Die Platzierung der Figur nach dem Zug ist einfach die Summe ihrer ursprünglichen Position und der Bewegung. Nachdem wir diese Zahlen addiert haben, müssen wir überprüfen, ob ihre Summe einem gültigen Feld auf der Tafel entspricht.
Da die Basis (20) mehr als doppelt so groß ist wie die höchstmögliche Zahl (8), kann die Summe nicht um das Brett gewickelt werden. Wenn Sie z. B. Bh1 sieben Schritte nach rechts und oben bewegen , wird die Position des Bretts ungültig.
Die Linie
listet alle möglichen Züge der Teile auf, die durch positive Zahlen dargestellt werden.
Die Befehle
Speichert den Stückidentifikator in der Variablen a , die numerische Darstellung der ursprünglichen Position in b und die Buchstaben a bis h im Array d .
Nach der Klammererweiterung
eval{,} echo '$'$a
wirdeval eval echo '$'$a
(doppelt böse), was z. B.eval echo $K
auswertet, was auswertetecho 1 19 20 21
.for i in $c -${c// / -};do …; done
Schleifen über alle möglichen Bewegungen und ihre negativen Gegenstücke.echo $a${d[$[(i+=b)/20]]}$[i%20]
gibt die endgültige Position nach der Bewegung an.grep '[a-h][1-8]$'
stellt sicher, dass wir eine gültige Boardposition haben.quelle
Golfscript,
144135 ZeichenAnstatt meine Python-Lösung weiter zu testen, übersetzte ich sie in Golfscript:
Unkomplizierte Übersetzung ohne viel Golfspiel, sodass es höchstwahrscheinlich noch weiter entfallen kann. Nimmt die Eingabe von stdin ohne eine neue Zeile an, probieren Sie es hier aus (die ersten beiden Zeilen imitieren stdin).
quelle
C
634632629625600 ZeichenIrgendwelche Vorschläge, wie man das verbessern kann? Ich sende zum ersten Mal eine Antwort.
quelle
C
Kann mit dem ternären Operator?:
und dem Rückgabewert von stark vereinfacht werdenprintf
. (printf
Gibt die Anzahl der Zeichen geschrieben, so dass in diesem Fall ist es immer ungleich Null.)C(P,c,r){return(0<=c)&(c<8)&(0<r)&(r<9)?printf("%c%c%d ",P,c+'a',r):0;}
. Eine kleine Änderung: Es gibt ein zusätzliches LeerzeichenM
nach demif
, das Sie entfernen können.Haskell,
300269 ZeichenVielen Dank an bazzargh für die Hilfe beim Verlust von 31 Charakteren ...
Gleicher Algorithmus wie die Mathematica-Version. Beispielausgabe von ghci:
(Sie haben nicht um Überprüfung der geistigen Gesundheit gebeten!)
quelle
Haskell, 446 Zeichen
Wird über die
j
Funktion aufgerufenIch habe seit einigen Monaten nicht mehr mit Haskell zusammengearbeitet, daher war es nicht so kurz wie die meisten anderen Lösungen, aber ich bin sicher, dass es einige Optimierungen gibt, die hauptsächlich mit Haskell vorgenommen werden müssen
h
. Ich könnte es ein bisschen verkürzen.quelle
q & k [
311262 Zeichen]Es besteht die Möglichkeit, weitere Zeichen zu reduzieren. Ich werde es in der nächsten Iteration reduzieren.
Verwendung
Turm
König
Ritter
Bischof
Königin
quelle
R 203 Zeichen
Ungolfed-Version:
Verwendung:
Die Lösung ist sogar gut lesbar. Ich habe jedoch einige Klammern und Kommentare für Leser hinzugefügt, die mit R-Code nicht vertraut sind (auf der ungolfed-Version).
quelle
Haskell (hypothetisch), 248 Zeichen
Leider hat jeder Haskell-Compiler, den ich gerade in die Finger bekomme, Probleme mit Unicode-String-Literalen. Hier ist die (längere) Version, die tatsächlich funktioniert:
Die Definition
h x y=...
ist eine Hash-Funktion. Bei gültigen Zügen werden die in der 41-stelligen Zeichenfolge enthaltenen Zeichennummern mit einem Hash versehen. Dadurch entfällt die Notwendigkeit einer "case" -Anweisung oder einer gleichwertigen Anweisung.Ich habe momentan nicht vor, weiter daran zu arbeiten. Es würde Spaß machen zu sehen, ob jemand eine Hash-Funktion in einer präziseren Sprache verwenden kann, um eine kürzere Lösung zu finden.
quelle