Windows Batch (CMD) ist wahrscheinlich die am wenigsten geeignete Sprache für das Code-Golfen.
Vermeiden Sie Zeilenumbrüche . Wenn Sie nicht nach Zeichen, sondern nach dem kürzesten Code in Byte suchen, müssen Sie alle unnötigen Zeilenumbrüche (Zeilenumbrüche = 2 Byte) vermeiden. Mit &
dieser Operation können Sie für jeden Befehl ein Byte abschneiden.
echo Hello&echo World.
Variablen setzen . Beim Setzen von Variablen mit Hilfe von Schaltern set
ignoriert der Parser Leerzeichen.
set /a a+=1
set /p b="User Input: "
:: Will be handled the same as..
set/aa+=1
set/pb="User Input: "
Beachten Sie, dass die gleichen Parser-Regeln nicht für alle Befehle gelten - beispielsweise für Schleifen, die Leerzeichen erfordern. Außer zwischen dem set, string, or command
(dh was sich in den Klammern befindet) und dem Wort do
.
for /f %%a in (file.txt)do ...
Einfache mathematische Ausdrücke . Beachten Sie auch den Ausdruck, den ich zum Inkrementieren des set /a
Befehls verwendet habe. Für einfache mathematische Ausdrücke verwenden Sie += -= *= /=
statt (zum Beispiel) set /a a=%a%+1
.
Befehlsausgabe wird gesammelt . Um die Ausgabe eines Befehls zu erhalten, kann es manchmal nützlich sein, in eine Datei auszugeben und daraus zu lesen, wo Sie andernfalls möglicherweise eine for-Schleife verwendet haben, um die Ausgabe zu erfassen:
for /f %%a in ('echo test') do set a=%%a
:: Can be shortened to
echo test>f&set/pa=<f
echo test
Senden Sie stdout an eine Datei mit dem Namen f, >f
starten Sie einen neuen Befehl &
und rufen Sie den Inhalt der Datei in einer Variablen ab set/pa=<f
. Offensichtlich ist das nicht immer nützlich. Dies kann jedoch der Fall sein, wenn Sie nur eine einzige Ausgabezeile benötigen.
Befehlsausgabe . Verwenden @
Sie beim Unterdrücken der Befehlsausgabe vor den Befehlen, es sei denn, Sie müssen mehr als 9 Befehle unterdrücken. Verwenden Sie in diesem Fall @echo off
zu Beginn Ihres Skripts. @echo off
ist 9 Bytes lang und spart daher in der Regel mehr Bytes bei längeren Skripten.
Befehle tun oft mehr als nur das, was offensichtlich ist - denken Sie darüber nach, was Ihre Befehle tun. Beispielsweise; Wenn Sie eine Variable setzen und eine andere Variable ausgeben müssen, anstatt:
set a=OUTPUT
echo %a%
echo test>f
set /p b=<f
Sie können den Befehl set mit dem /p
Schalter verwenden, um %a%
für Sie auszugeben .
set a=OUTPUT
echo test>f
set /p b=%a%<f
Völlig golfen ...
set a=OUTPUT&echo test>f&set/pb=%a%<f
Ein paar Beispiele - Summe aller Ziffern zählen - Goldbachs Vermutung .
Alle anderen Tipps sind mehr als willkommen - ich werde dies weiter aktualisieren, wenn mir etwas anderes einfällt.
Antworten:
Zähler
Wann immer Sie eine Variable haben, die als Zähler fungiert,
0
möchten Sie vielleicht schreiben; Sie können jedoch die ersten Zeilen entfernen, da immer dann, wenn
set/a
eine nicht gesetzte Variable verwendet wird, angenommen wird, dass ihr Wert gleich ist0
Codeblöcke
Es gibt eine Reihe von Möglichkeiten, wie Sie ein paar Bytes sparen können, wenn Sie Codeblöcke verwenden müssen.
Wenn Sie einen Codeblock öffnen, müssen Sie vor der ersten Codezeile in diesem Block keinen Zeilenumbruch einfügen. Die schließenden Klammern müssen auch nicht in einer eigenen Zeile stehen.
kann golfen werden
Drucken ohne Zeilenumbruch
Das übliche Muster dafür ist
aber können Sie sparen 2 Bytes Wechsel
echo
zucd
quelle
if
Aussage weiter golfen werden kann. Das beste sollte sein:if %a%==%b% (echo true)else echo false
Etzeichen
Obwohl & den Code kürzer erscheinen lässt, da weniger Zeilen verwendet werden, verwendet er genauso viele Zeichen wie eine neue Zeile. Das bedeutet, dass
ist so lang wie
So bleibt Ihr Code lesbar, ohne Zeichen zu verschwenden.
Es kann Ausnahmen geben, da einige Texteditoren Zeilenvorschub und Zeilenumbruch für jede neue Zeile kombinieren.
quelle
Drucken Sie das Ergebnis einer numerischen Berechnung direkt aus
Wenn die Abfrage die Ausgabe einer zu berechnenden Zahl erfordert, können Sie
cmd/c set/a
das Ergebnis der Berechnung direkt ausgeben, anstatt die Berechnung zu speichern und anschließend zu wiederholen. Beispiel:wird
Bearbeiten: Anscheinend sind überhaupt keine Leerzeichen erforderlich, wodurch 2 weitere Bytes eingespart werden.
quelle
Verzögerte Expansion
Anstelle der Verwendung von longy können
setLocal enableDelayedExpansion
Siecmd /v on
(odercmd/von
) verwenden, um einen neuen Interpreter mit aktivierter verzögerter Variablenerweiterung zu starten.Ich muss dies noch implementieren, damit ich keine Beispiele habe, aber Sie können dies in Verbindung mit dem
/c
Schalter verwenden. Beispiel:Beachten Sie die Verwendung des Karats vor dem kaufmännischen Und. Wenn Sie mehrere kaufmännische Und-Zeichen oder andere Sonderzeichen verwenden müssen, sollten Sie nach dem
/c
Wechsel alles in Anführungszeichen setzen:Diese Methode hat auch den Vorteil, dass nur ein
@
Zeichen zum Maskieren aller Eingaben verwendet werden muss, und kann daher ohne/von
eine kürzere Alternative zu@echo off
(oder mehreren@
Symbolen) verwendet werden.9 Zeichen:
@echo off
6 Zeichen:
@cmd/c
Bei längeren Skripten, die Sie nicht in einer Zeile ausführen können, können Sie die folgenden Schritte ausführen, um einige Bytes zu sparen:
Oder ungolfed:
Ersetzen Sie
@echo off&setLocal enableDelayedExpansion
mit dem oben.Wenn Sie das Skript zum ersten Mal ausführen,
!!
wird es überhaupt nicht erweitert, sodass Sie einen Fehler erhalten, da"!!"
es sich nicht um einen Befehl handelt. Die Fehlerausgabe wird dann an nul (2>nul
) weitergeleitet. Wenn dieser erste 'Befehl' fehlschlägt (||
), ruft er eine neue Instanz von cmd auf, die die Batchdatei selbst aufruft (/v (on)
um die verzögerte Erweiterung zu aktivieren und/q
das Echo auszuschalten). Dann!!
wird zu nichts expandiert, da es keine aufgerufene Variable gibt<NULL>
. Der Rest Ihres Skripts wird dann ausgeführt. Danach kehrt es zur ursprünglichen Instanz von cmd zurück, und (&&
) wird mit der/b
Bedingung beendet, dass das Fenster geöffnet bleibt (beim Beenden wird das Skript nicht im Kontext der ersten cmd-Instanz mit Echo weiter ausgeführt ein und verzögerte Erweiterung aus).quelle
cmd /q /v on /c <filename>
Grund sollte das Ausführen von Batch-Dateien mit nur 2 Bytes zählen, da es sich um zwei "Flags" handelt, die den Perl-Flags ähneln und-pI
nur 2 zusätzliche Bytes umfassen.Wiederholte Zeichenfolgen
Setzen Sie sich wiederholende Codeblöcke in Variablen, wobei die Anzahl der zum Setzen der Variablen verwendeten Bytes + die Anzahl der zur Ausgabe der Variablen verwendeten Bytes kleiner ist als die Anzahl der Bytes, um den Code nur direkt aufzurufen.
Ein Beispiel finden Sie unter: Zeichnen Sie die Kombinationen, die 100 ergeben
Sie sparen 1 Byte pro Verwendung des Befehls set, wenn Sie eine Variable (benannt mit einem Zeichen, wie "s") erstellen, die enthält
set<space>
. Dies erzeugt nur dann einen Wert, wenn Sie den Befehl set mehr als 12 Mal verwenden. (Beachten Sie, dass am Ende der Zeichenfolge ein Zeichen stehtset s=set
.)Das obige ist 1 Byte kürzer als ..
Dies ist wahrscheinlich ein ziemlich schlechtes Beispiel - aber es bringt den Punkt auf den Punkt.
quelle
Beginn einer Zeichenfolge
Die Notation
%var:~start,end%
extrahiert einen Teil der Variablenvar
. Wenn dies jedoch der Fallstart
ist0
, können Sie es ganz weglassen. Wir wissen bereits, dass Sie weglassen können,,end
wenn Sie den Rest der Zeichenfolge verwenden möchten. Dies ist%var:~%
ein fast unbrauchbares Synonym für%var%
, mit der Ausnahme, dass die Zeichenfolge zurückgegeben wird,~
wenn sie%var%
leer ist. (Vielleicht könnten Sie es in einem Test verwendenif %var:~%==~
:?)quelle
Verkürzende
IF EQU
AussagenVerwenden
==
stattequ
spart 3 Bytes.Verkürzung von Anführungszeichen in
IF
AnweisungenDies ist ein traditioneller sogenannter "sicherer"
if
Vergleich.Gehen Sie folgendermaßen vor, um diese Anweisung zu verkürzen, wenn die Eingabe nur alphanumerisch / leer sein kann :
Es werden insgesamt 2 Bytes gespeichert.
Herausforderungen, die Leistung erfordern
Wenn die Frage so aussagt:
dann könntest du das einfach machen:
Das
cd
zeigt das aktuelle Verzeichnis anSTDOUT
.GOTO
ein EtikettHier sind einige Methoden zum
goto
Erstellen einer Bezeichnung, die in absteigender Reihenfolge der Bytes angeordnet sind.Die obige Methode spart 1 Byte.
quelle
goto:l
das gleiche 1 Byte speichern und den zusätzlichen Bonus erhalten, dass Ihr Doppelpunkt intakt bleibtLeerzeichen zwischen Befehl und Parametern mit Schrägstrichen weglassen
Entschuldigung für den nicht informativen Titel. Ich versuche zu verstehen, dass Sie bei einigen (nicht allen) Windows-Befehlen das Leerzeichen zwischen dem Befehls- / Programmnamen und dem Parameter weglassen können, solange dieser Parameter mit einem Schrägstrich beginnt. Beispielsweise:
wird
-1 Byte!
Piping-Ausgabe anstelle von ERRORLEVEL
Die Verwendung von ERRORLEVEL zum Ermitteln, ob ein Befehl ordnungsgemäß ausgeführt wurde, ist nicht die kürzeste oder eleganteste Methode. Stattdessen können Sie die Ausgabe weiterleiten. Dies funktioniert wie folgt (denken Sie daran, dass jeder Befehl nach dem
&&
Operator nur ausgeführt wird, wenn der Befehl vor dem&&
ohne Fehler ausgeführt wurde. Ein Befehl nach dem||
Operator wird dagegen nur ausgeführt, wenn der Befehl vor dem Operator NICHT ordnungsgemäß ausgeführt wurde. Mein Beispiel ist :Dies könnte ersetzt werden durch:
-26 Bytes, wow! Beachten Sie, dass dies mit Befehlen wie nicht funktioniert
choice
, bei denen der ERRORLEVEL einen bestimmten Wert hat, der bestimmten Eingaben entspricht.Grüße,
Gabe
quelle
Klammern effektiv nutzen
Hallo nochmal,
Es tut mir leid, eine zweite Antwort zu schreiben, aber ich hatte das Gefühl, diese verdient zu haben. Ich habe festgestellt, dass Benutzer häufig eine der folgenden Methoden verwenden, um die Befehlsausgabe anzuzeigen, ohne diese lästige
C:\Windows\System32>echo foo
Zeile vor jedem Befehl anzuzeigen .Die erste Methode (mit
echo off
):Die zweite Methode:
Keine dieser Methoden ist jedoch so kurz wie die folgenden:
Ziemlich praktisch, oder? Mit dieser Funktion können mehrere Ausgabezeilen auf einfache Weise an eine Datei oder ein Gerät weitergeleitet werden. Zum Beispiel dieser lange Code:
wird deutlich kürzer:
Vielen Dank, dass Sie diese ziemlich lange Antwort gelesen haben, und ich hoffe, das hilft Ihnen. Grüße,
Gabe
quelle