Windows Batch (CMD) est probablement le langage le moins approprié pour jouer au code.
Évitez les caractères de nouvelle ligne . Si vous recherchez le code le plus court en octets, par opposition aux caractères, vous voudrez vous débarrasser de tous les retours chariot inutiles (caractères de nouvelle ligne = 2 octets). Vous pouvez utiliser l' &
opération pour ce faire, en supprimant un octet pour chaque commande.
echo Hello&echo World.
Définition des variables . Lors de la définition de variables à l'aide de commutateurs, l' set
analyseur ignorera les espaces.
set /a a+=1
set /p b="User Input: "
:: Will be handled the same as..
set/aa+=1
set/pb="User Input: "
Notez que les mêmes règles d'analyse ne s'appliquent pas à toutes les commandes - par exemple, pour les boucles nécessitent des espaces. Sauf entre set, string, or command
(c'est-à-dire ce qui est à l'intérieur des crochets) et le mot do
.
for /f %%a in (file.txt)do ...
Expressions mathématiques simples . Notez également l'expression que j'ai utilisée pour incrémenter dans la set /a
commande. Pour des expressions mathématiques simples, utilisez += -= *= /=
plutôt (par exemple) set /a a=%a%+1
.
Collecte de la sortie de commande . Pour obtenir la sortie d'une commande, il peut parfois être utile de sortir et de lire à partir d'un fichier, où vous auriez sinon pu utiliser une boucle for pour rassembler la sortie:
for /f %%a in ('echo test') do set a=%%a
:: Can be shortened to
echo test>f&set/pa=<f
echo test
envoyer stdout dans un fichier appelé f, >f
démarrer une nouvelle commande &
et obtenir le contenu du fichier dans une variable set/pa=<f
. Évidemment, ce n'est pas toujours utile. Mais cela peut être lorsque tout ce dont vous avez besoin est une seule ligne de sortie.
Sortie de commande . Lors de la suppression de la sortie des commandes, utilisez @
avant les commandes, sauf si vous devez supprimer plus de 9 commandes, auquel cas utilisez-les @echo off
au début de votre script. @echo off
est de 9 octets de long et économisera donc généralement plus d'octets avec des scripts plus longs.
Les commandes font souvent plus que ce qui est évident - pensez à ce que font vos commandes. Par exemple; si vous devez définir une variable et faire écho à une autre variable, au lieu de:
set a=OUTPUT
echo %a%
echo test>f
set /p b=<f
Vous pouvez utiliser la commande set avec le /p
commutateur pour sortir %a%
pour vous.
set a=OUTPUT
echo test>f
set /p b=%a%<f
Entièrement golfé ...
set a=OUTPUT&echo test>f&set/pb=%a%<f
Quelques exemples - Compter la somme de tous les chiffres - Conjecture de Goldbach .
Tout autre conseil est plus qu'apprécié - je continuerai à le mettre à jour si je pense à autre chose.
Réponses:
Compteurs
Chaque fois que vous avez une variable qui servira de compteur à partir de
0
vous voudrez peut-être écrire; cependant, vous pouvez éliminer les premières lignes car chaque fois qu'il
set/a
est utilisé avec une variable non définie, sa valeur est supposée être0
Blocs de code
Il existe plusieurs façons de raser quelques octets lorsque vous devez utiliser des blocs de code.
Chaque fois que vous ouvrez un bloc de code, vous n'avez pas besoin d'insérer un saut de ligne avant la première ligne de code dans ce bloc. Les parenthèses fermantes ne doivent pas non plus être sur une ligne propre.
peut être joué au golf à
Impression sans nouvelle ligne
Le schéma courant est
mais, vous pouvez enregistrer 2 octets
echo
encd
la source
if
déclaration peut être approfondie. Le meilleur devrait être:if %a%==%b% (echo true)else echo false
Esperluettes
Bien que & rend le code plus court, car il utilise moins de lignes, il utilise autant de caractères qu'une nouvelle ligne. Cela signifie que
est aussi long que
afin que votre code puisse rester lisible sans perdre de caractères.
Il peut y avoir des exceptions, car certains éditeurs de texte combinent le saut de ligne et le retour de la cartouche pour chaque nouvelle ligne.
la source
Imprimer directement le résultat d'un calcul numérique
Si le défi vous oblige à sortir un nombre qui doit être calculé, vous pouvez utiliser
cmd/c set/a
pour sortir le résultat du calcul directement au lieu d'enregistrer le calcul, puis de le répéter. Exemple:devient
Modifier: Apparemment, aucun espace n'est nécessaire, ce qui permet d'économiser 2 octets supplémentaires.
la source
Expansion retardée
Au lieu d'utiliser le long,
setLocal enableDelayedExpansion
vous pouvez utilisercmd /v on
(oucmd/von
) qui démarrera un nouvel interpréteur avec l'expansion de variable retardée activée.Je n'ai pas encore implémenté cela, donc je n'ai pas d'exemples, mais vous pouvez l'utiliser en conjonction avec le
/c
commutateur. Exemple:Remarquez l'utilisation du carat avant l'esperluette. si vous devez utiliser plusieurs esperluettes ou tout autre caractère spécial, il est préférable de tout mettre
/c
entre guillemets après le commutateur:Cette méthode présente également l'avantage de ne devoir utiliser qu'un seul
@
caractère pour masquer toutes les entrées, et peut donc être utilisée, sans/von
, comme alternative plus courte à@echo off
(ou plusieurs@
symboles).9 caractères:
@echo off
6 caractères:
@cmd/c
Pour des scripts plus longs, que vous ne pouvez pas faire sur une seule ligne, vous pouvez faire ce qui suit pour enregistrer quelques octets:
Ou, non golfé:
Remplacez
@echo off&setLocal enableDelayedExpansion
par ce qui précède.Lorsque vous exécutez pour la première fois votre script
!!
ne se développera pas du tout, vous recevez donc une erreur car il"!!"
ne s'agit pas d'une commande. La sortie d'erreur est ensuite dirigée vers nul (2>nul
). Lorsque cette première 'commande' échoue (||
), elle appelle une nouvelle instance de cmd, qui appelle le fichier batch lui-même (en utilisant/v (on)
pour activer l'expansion retardée et/q
pour désactiver l'écho). Puis!!
se développera à rien, car aucune variable n'est appelée<NULL>
. Le reste de votre script s'exécute ensuite. Après quoi, il reviendra à l'instance d'origine de cmd, et (&&
) quitter avec la/b
condition pour garder la fenêtre ouverte (la sortie est donc elle ne continue pas à parcourir votre script dans le contexte de la première instance de cmd, avec echo activé et retardé l'expansion désactivée).la source
cmd /q /v on /c <filename>
ne devrait compter que pour 2 octets car ce sont deux "drapeaux" similaires aux drapeaux Perl comme-pI
qui ne compteraient que pour 2 octets supplémentaires.Chaînes répétitives
Définissez des blocs de code répétitifs dans les variables, où le nombre d'octets utilisés pour définir la variable + le nombre d'octets pour sortir la variable sont inférieurs au nombre d'octets pour simplement appeler le code directement.
Pour un exemple, voir: Dessiner les combinaisons qui totalisent jusqu'à 100
Vous économisez 1 octet par utilisation de la commande set, si vous créez une variable (nommée avec un caractère, comme "s") qui contient
set<space>
. Cela ne génère de la valeur que si vous utilisez la commande set plus de 12 fois. (Notez qu'il y a un caractère à la fin de la chaîneset s=set
).Ce qui précède est 1 octet plus court que ..
C'est probablement un assez mauvais exemple - mais il fait passer le message.
la source
Début d'une chaîne
La notation
%var:~start,end%
extrait une sous-chaîne de la variablevar
. Cependant, sistart
c'est le cas,0
vous pouvez l'omettre complètement. Nous savons déjà que vous pouvez omettre,end
si vous voulez le reste de la chaîne, ce qui en fait%var:~%
un synonyme presque inutile%var%
, sauf qu'il renvoie~
quand%var%
est vide. (Peut-être pourriez-vous l'utiliser dans un testif %var:~%==~
:?)la source
raccourcissant
IF EQU
déclarationsUtiliser
==
au lieu d'equ
enregistrer 3 octets.Raccourcir les citations dans les
IF
déclarationsIl s'agit d'une
if
comparaison dite «plus sûre» traditionnelle .Pour raccourcir cette instruction, procédez comme suit lorsque l'entrée ne peut être que alphanumérique / vide :
Enregistrement d'un total de 2 octets.
Défis nécessitant une sortie
Si la question dit quelque chose comme:
alors vous pouvez simplement faire ceci:
Le
cd
affiche le répertoire actuel versSTDOUT
.GOTO
une étiquetteVoici quelques méthodes de
goto
création d'une étiquette, triées par ordre décroissant d'octets.La méthode ci-dessus enregistre 1 octet.
la source
goto:l
ce qui enregistre le même 1 octet et a l'avantage supplémentaire de garder vos deux points intactsOmettre l'espace entre la commande et les paramètres avec des barres obliques
Désolé pour le titre non informatif. Ce que j'essaie de comprendre, c'est que pour certaines commandes (pas toutes) de Windows, vous pouvez omettre l'espace entre le nom de la commande / du programme et le paramètre, tant que ce paramètre commence par une barre oblique. Par exemple:
devient
-1 octet!
Sortie de tuyauterie au lieu d'utiliser ERRORLEVEL
L'utilisation de ERRORLEVEL pour déterminer si une commande s'est exécutée correctement n'est pas la méthode la plus courte ou la plus élégante. Au lieu de cela, vous pouvez diriger la sortie. Cela fonctionne comme suit (rappelez-vous que toute commande après l'
&&
opérateur ne s'exécute que si la commande avant l'exécution&&
s'est déroulée sans erreur. En||
revanche, toute commande après l' opérateur ne s'exécutera que si la commande avant son exécution n'a PAS été exécutée correctement. Mon exemple est :Cela pourrait être remplacé par:
-26 octets, wow! Notez que cela ne fonctionne pas avec des commandes comme
choice
, où ERRORLEVEL a une valeur spéciale en fonction de certaines entrées.Cordialement,
Gabe
la source
Utiliser efficacement les parenthèses
Re-bonjour,
Désolé de poster une deuxième réponse mais j'ai senti que celle-ci le méritait. J'ai remarqué que les gens utilisent souvent l'une des méthodes suivantes pour afficher la sortie de commande sans afficher cette
C:\Windows\System32>echo foo
ligne embêtante avant chaque commande.La première méthode (en utilisant
echo off
):La deuxième méthode:
Cependant, aucune de ces méthodes n'est aussi courte que les suivantes:
Assez pratique, non? Sur une autre note, cela peut être utilisé pour diriger facilement plusieurs lignes de sortie vers un fichier ou un périphérique. Par exemple, ce long code:
devient beaucoup plus court:
Merci d'avoir lu cette réponse assez longue, et j'espère que cela vous aidera. Cordialement,
Gabe
la source