Windows Batch (CMD) jest prawdopodobnie najmniej odpowiednim językiem do gry w golfa.
Unikaj znaków nowej linii . Jeśli szukasz najkrótszego kodu w bajtach, w przeciwieństwie do znaków, będziesz chciał pozbyć się wszystkich niepotrzebnych zwrotów karetki (znaki nowego wiersza = 2 bajty). Możesz to zrobić za pomocą &
operacji, skracając jeden bajt dla każdego polecenia.
echo Hello&echo World.
Ustawianie zmiennych . Podczas ustawiania zmiennych za pomocą przełączników set
parser zignoruje spacje.
set /a a+=1
set /p b="User Input: "
:: Will be handled the same as..
set/aa+=1
set/pb="User Input: "
Zauważ, że te same reguły parsera nie dotyczą wszystkich poleceń - na przykład dla pętli wymagane są spacje. Z wyjątkiem między set, string, or command
(tj. Co jest w nawiasach) a słowem do
.
for /f %%a in (file.txt)do ...
Proste wyrażenia matematyczne . Zwróć też uwagę na wyrażenie, którego użyłem do zwiększania set /a
polecenia. Do prostych wyrażeń matematycznych użyj += -= *= /=
zamiast (na przykład) set /a a=%a%+1
.
Zbieranie danych wyjściowych polecenia . Aby uzyskać dane wyjściowe polecenia, czasami przydatne może być wyjście do pliku i odczytanie go z pliku, w innym przypadku można użyć pętli for do zebrania danych wyjściowych:
for /f %%a in ('echo test') do set a=%%a
:: Can be shortened to
echo test>f&set/pa=<f
echo test
wyślij stdout do pliku o nazwie f, >f
uruchom nowe polecenie &
i uzyskaj zawartość pliku w zmiennej set/pa=<f
. Oczywiście nie zawsze jest to przydatne. Ale może się zdarzyć, gdy potrzebujesz tylko jednego wiersza wyników.
Dane wyjściowe polecenia . Podczas tłumienia danych wyjściowych poleceń używaj @
przed poleceniami, chyba że musisz pominąć więcej niż 9 poleceń, w takim przypadku użyj @echo off
na początku skryptu. @echo off
ma długość 9 bajtów i dlatego na ogół zaoszczędzi więcej bajtów dzięki dłuższym skryptom.
Polecenia często robią coś więcej niż to, co oczywiste - pomyśl o tym, co robią twoje polecenia. Na przykład; jeśli musisz ustawić zmienną i wywołać echo innej zmiennej, zamiast:
set a=OUTPUT
echo %a%
echo test>f
set /p b=<f
Możesz użyć polecenia set z /p
przełącznikiem, aby uzyskać dane wyjściowe %a%
.
set a=OUTPUT
echo test>f
set /p b=%a%<f
Całkowicie golfowy ...
set a=OUTPUT&echo test>f&set/pb=%a%<f
Kilka przykładów - Policz sumę wszystkich cyfr - hipoteza Goldbacha .
Wszelkie inne wskazówki są mile widziane - będę je aktualizować, jeśli pomyślę o czymś innym.
Odpowiedzi:
Liczniki
Ilekroć masz zmienną, która będzie działać jako licznik zaczynając od,
0
możesz chcieć zapisać; można jednak wyeliminować pierwsze wiersze, ponieważ za każdym razem, gdy
set/a
używana jest z nieuzbrojoną zmienną, przyjmuje się, że jest to wartość0
Bloki kodu
Istnieje kilka sposobów na zmniejszenie liczby bajtów, gdy trzeba użyć bloków kodu.
Za każdym razem, gdy otwierasz blok kodu, nie musisz wstawiać podziału linii przed pierwszą linią kodu w tym bloku. Nawiasy zamykające również nie muszą znajdować się w osobnej linii.
można grać w golfa
Drukowanie bez końca nowej linii
Częstym tego przykładem jest
ale możesz zapisać 2 bajty zmieniając
echo
nacd
źródło
if
oświadczenie można pograć jeszcze bardziej. Najlepszym powinno być:if %a%==%b% (echo true)else echo false
Ampersands
Chociaż & sprawia, że kod wydaje się krótszy, ponieważ używa mniej linii, używa tyle samo znaków, co nowa linia. To znaczy że
jest tak długo jak
dzięki czemu kod może pozostać czytelny bez marnowania znaków.
Mogą istnieć wyjątki, ponieważ niektóre edytory tekstu łączą przesunięcie wiersza i zwrot karetki dla każdej nowej linii.
źródło
Wydrukuj bezpośrednio wynik obliczeń numerycznych
Jeśli wyzwanie wymaga podania liczby, która musi zostać obliczona, można użyć
cmd/c set/a
do wydrukowania wyniku obliczeń bezpośrednio zamiast zapisywania obliczeń, a następnie ich powtórzenia. Przykład:staje się
Edycja: Najwyraźniej nie są potrzebne żadne spacje, oszczędzając 2 kolejne bajty.
źródło
Opóźniona ekspansja
Zamiast długiego
setLocal enableDelayedExpansion
można użyćcmd /v on
(lubcmd/von
), który uruchomi nowego interpretera z włączonym opóźnionym rozszerzaniem zmiennych.Muszę to jeszcze zaimplementować, więc nie mam żadnych przykładów, ale możesz użyć tego w połączeniu z
/c
przełącznikiem. Przykład:Zwróć uwagę na użycie karatu przed znakiem ampersand. jeśli potrzebujesz użyć wielu znaków ampersands lub innych znaków specjalnych, lepiej umieścić wszystko po
/c
przełączeniu w cudzysłowie:Ta metoda ma również tę zaletę, że musi używać tylko jednego
@
znaku do maskowania wszystkich danych wejściowych, a zatem może być stosowana bez/von
krótszej alternatywy dla@echo off
(lub wielu@
symboli).9 znaków:
@echo off
6 znaków:
@cmd/c
W przypadku dłuższych skryptów, których nie można wykonać w jednym wierszu, można wykonać następujące czynności, aby zapisać niektóre bajty:
Lub bez golfa:
Zastąp
@echo off&setLocal enableDelayedExpansion
powyższym.Po pierwszym uruchomieniu skrypt w
!!
ogóle się nie rozwija, więc"!!"
pojawia się błąd, ponieważ nie jest poleceniem. Wyjście błędu jest następnie przesyłane do nul (2>nul
). Kiedy to pierwsze „polecenie” nie powiedzie się (||
), wywołuje nową instancję cmd, która wywołuje sam plik wsadowy (za pomocą,/v (on)
aby umożliwić opóźnione rozwijanie i/q
wyłączyć echo). Następnie!!
rozwinie się do zera, ponieważ nie wywołuje żadnej zmiennej<NULL>
. Reszta skryptu jest następnie uruchamiana. Po czym powróci do oryginalnej instancji cmd i (&&
) zakończy/b
warunek, aby okno pozostało otwarte (wyjście jest tak, że nie będzie kontynuowało uruchamiania skryptu w kontekście pierwszej instancji cmd z echo włączone i opóźnione rozszerzenie wyłączone).źródło
cmd /q /v on /c <filename>
powinno liczyć się tylko jako 2 bajty, ponieważ są to dwie „flagi” podobne do flag Perla,-pI
które mogłyby się liczyć tylko jako 2 dodatkowe bajty.Powtarzające się ciągi
Ustaw powtarzalne bloki kodu w zmiennych, gdzie liczba bajtów użytych do ustawienia zmiennej + liczba bajtów, które należy wyprowadzić, jest mniejsza niż liczba bajtów, aby bezpośrednio wywołać kod.
Na przykład zobacz: Rysuj kombinacje, które sumują się do 100
Zapisujesz 1 bajt na użycie polecenia set, jeśli utworzysz zmienną (nazwaną jednym znakiem, np. „S”), która zawiera
set<space>
. Generuje to wartość tylko wtedy, gdy użyjesz polecenia set więcej niż 12 razy. (Uwaga: na końcu łańcucha znajduje się znakset s=set
).Powyżej jest o 1 bajt krótszy niż ..
Jest to prawdopodobnie dość słaby przykład - ale ma sens.
źródło
Początek ciągu
Notacja
%var:~start,end%
wyodrębnia podciąg zmiennejvar
. Jeślistart
tak,0
to możesz to całkowicie pominąć. Wiemy już, że możesz pominąć,,end
jeśli chcesz resztę ciągu, co tworzy%var:~%
prawie bezużyteczny synonim%var%
, z wyjątkiem tego, że zwraca,~
gdy%var%
jest pusty. (Być może mógłbyś użyć go w teścieif %var:~%==~
:?)źródło
IF EQU
Oświadczenia skracająceUżycie
==
zamiastequ
oszczędza 3 bajty.Skracanie cytatów w
IF
wyciągachJest to tradycyjne tak zwane „bezpieczniejsze” porównanie
if
.Aby skrócić tę instrukcję, wykonaj następujące czynności, gdy dane wejściowe mogą być tylko alfanumeryczne / puste :
Zapisywanie w sumie 2 bajtów.
Wyzwania wymagające wydajności
Jeśli pytanie brzmi:
możesz po prostu to zrobić:
cd
Pokazuje bieżący katalogSTDOUT
.GOTO
wprowadzenie etykietyOto kilka metod
goto
wprowadzania etykiety uporządkowanych w kolejności malejącej bajtów.Powyższa metoda pozwala zaoszczędzić 1 bajt.
źródło
goto:l
co oszczędza ten sam 1 bajt i ma dodatkowąPominięcie spacji między poleceniem a parametrami z ukośnikami
Przepraszam za nieinformacyjny tytuł. Próbuję uzyskać, że w przypadku niektórych (nie wszystkich) poleceń systemu Windows można pominąć spację między nazwą polecenia / programu a parametrem, o ile parametr ten zaczyna się od ukośnika. Na przykład:
staje się
-1 bajt!
Przesyłanie danych wyjściowych zamiast używania ERRORLEVEL
Użycie ERRORLEVEL do ustalenia, czy polecenie zostało poprawnie uruchomione, nie jest najkrótszą ani najbardziej elegancką metodą. Zamiast tego możesz przesyłać dane wyjściowe. Działa to w następujący sposób (pamiętaj, że każde polecenie po
&&
operatorze jest wykonywane tylko wtedy, gdy polecenie poprzedzone&&
uruchomiono bez błędów.||
Z drugiej strony każde polecenie po operatorze będzie działać tylko wtedy, gdy polecenie przed nim NIE zadziałało poprawnie. Mój przykład to :Można to zastąpić:
-26 Bajtów, wow! Zauważ, że to nie działa z takimi poleceniami
choice
, gdzie ERRORLEVEL ma specjalną wartość zgodnie z niektórymi danymi wejściowymi.Pozdrawiam,
Gabe
źródło
Skuteczne stosowanie nawiasów
Witaj ponownie,
Przepraszam, że opublikowałem drugą odpowiedź, ale czułem, że ta zasługuje na to. Zauważyłem, że ludzie często używają jednej z następujących metod, aby wyświetlić dane wyjściowe polecenia bez wyświetlania tej irytującej
C:\Windows\System32>echo foo
linii przed każdym poleceniem.Pierwsza metoda (przy użyciu
echo off
):Druga metoda:
Jednak żadna z tych metod nie jest tak krótka jak:
Bardzo przydatna, prawda? Z drugiej strony można tego użyć do łatwego połączenia wielu linii danych wyjściowych z plikiem lub urządzeniem. Na przykład ten długi kod:
staje się znacznie krótszy:
Dziękuję za przeczytanie tej dość długiej odpowiedzi i mam nadzieję, że ci to pomoże. Pozdrawiam,
Gabe
źródło