Windows Batch (CMD) es probablemente el lenguaje menos adecuado para el golf de código.
Evita los personajes de nueva línea . Si está buscando el código más corto en bytes, en lugar de caracteres, querrá deshacerse de todos los retornos de carro innecesarios (caracteres de nueva línea = 2 bytes). Puede usar la &operación para hacer esto, recortando un byte para cada comando.
echo Hello&echo World.
Configuración de variables . Cuando se configuran variables usando interruptores, el setanalizador ignorará los espacios.
set /a a+=1
set /p b="User Input: "
:: Will be handled the same as..
set/aa+=1
set/pb="User Input: "
Tenga en cuenta que las mismas reglas del analizador no se aplican a todos los comandos; por ejemplo, para los bucles se requieren espacios. Excepto entre el set, string, or command(es decir, lo que está dentro de los corchetes) y la palabra do.
for /f %%a in (file.txt)do ...
Expresiones matemáticas simples . Además, observe la expresión que usé para incrementar en el set /acomando. Para expresiones matemáticas simples, use en += -= *= /=lugar de (por ejemplo) set /a a=%a%+1.
Recopilación de salida del comando . Para obtener la salida de un comando, a veces puede ser útil enviar y leer desde un archivo, donde de lo contrario podría haber usado un bucle for para recopilar la salida:
for /f %%a in ('echo test') do set a=%%a
:: Can be shortened to
echo test>f&set/pa=<f
echo testenvíe stdout a un archivo llamado f, >finicie un nuevo comando &y obtenga el contenido del archivo en una variable set/pa=<f. Obviamente esto no siempre es útil. Pero puede ser cuando todo lo que necesita es una sola línea de salida.
Comando de salida . Al suprimir la salida del comando, úselo @antes de los comandos, a menos que necesite suprimir más de 9 comandos, en cuyo caso, úselo @echo offal comienzo de su script. @echo offtiene una longitud de 9 bytes y, por lo tanto, generalmente guardará más bytes con secuencias de comandos más largas.
Los comandos a menudo hacen más que lo que es obvio : piense en lo que están haciendo sus comandos. Por ejemplo; si necesita establecer una variable y hacer eco de otra variable, en lugar de:
set a=OUTPUT
echo %a%
echo test>f
set /p b=<f
Puede usar el comando set con el /pinterruptor para enviarlo %a%por usted.
set a=OUTPUT
echo test>f
set /p b=%a%<f
Completamente golf ...
set a=OUTPUT&echo test>f&set/pb=%a%<f
Un par de ejemplos: cuenta de suma de todos los dígitos , conjetura de Goldbach .
Cualquier otro consejo es más que apreciado. Seguiré actualizando esto si pienso en otra cosa.

Respuestas:
Contadores
Siempre que tenga una variable que actuará como un contador a partir de
0tal vez quiera escribir; sin embargo, puede eliminar las primeras líneas porque siempre que
set/ase usa con una variable no establecida se supone que su valor es0Bloques de código
Hay varias formas en que puede reducir algunos bytes cuando tiene que usar bloques de código.
Siempre que abra un bloque de código, no necesita insertar un salto de línea antes de la primera línea de código en ese bloque. Los paréntesis de cierre tampoco tienen que estar en una línea propia.
se puede jugar golf
Imprimir sin arrastrar nueva línea
El patrón común para esto es
pero puedes guardar 2 bytes cambiando
echoacdfuente
ifdeclaración se puede seguir jugando. El mejor debería ser:if %a%==%b% (echo true)else echo falseAmonestaciones
Aunque 's hace que el código parezca más corto, ya que usa menos líneas, usa tantos caracteres como una nueva línea. Esto significa que
es tan largo como
para que su código pueda seguir siendo legible sin desperdiciar caracteres.
Puede haber excepciones porque algunos editores de texto combinan el avance de línea y el retorno de cartucho para cada nueva línea.
fuente
Imprima directamente el resultado de un cálculo numérico
Si el desafío requiere que ingrese un número que necesita ser calculado, puede usarlo
cmd/c set/apara generar el resultado del cálculo directamente en lugar de guardar el cálculo y luego repetirlo. Ejemplo:se convierte
Editar: aparentemente no se necesitan espacios, ahorrando 2 bytes más.
fuente
Expansión retrasada
En lugar de usar el extenso
setLocal enableDelayedExpansion, puede usarcmd /v on(ocmd/von) que iniciará un nuevo intérprete con la expansión variable retardada habilitada.Todavía tengo que implementar esto, así que no tengo ningún ejemplo, pero podría usar esto junto con el
/cinterruptor. Ejemplo:Observe el uso del quilate antes del signo "&". Si necesita usar varios símbolos de unión o cualquier otro carácter especial, es mejor que incluya todo después del
/ccambio entre comillas:Este método también tiene la ventaja de tener que usar un solo
@carácter para enmascarar toda la entrada y, por lo tanto, puede usarse sin/vonuna alternativa más corta@echo off(o varios@símbolos).9 caracteres:
@echo off6 caracteres:
@cmd/cPara secuencias de comandos más largas, que no puede hacer en una línea, puede hacer lo siguiente para guardar algunos bytes:
O, no golfista:
Reemplazar
@echo off&setLocal enableDelayedExpansioncon lo anterior.Cuando ejecuta su script por primera vez
!!, no se expandirá en absoluto, por lo que recibirá un error porque"!!"no es un comando. La salida del error se canaliza a nul (2>nul). Cuando este primer 'comando' falla (||), llama a una nueva instancia de cmd, que llama al archivo por lotes en sí mismo (/v (on)para habilitar la expansión retardada y/qdesactivar el eco). Luego!!se expandirá a nada, ya que no hay una variable llamada<NULL>. El resto de su script se ejecuta. Después de lo cual volverá a la instancia original de cmd, y (&&) saldrá con la/bcondición de mantener la ventana abierta (la salida es para que no continúe ejecutándose a través de su script en el contexto de la primera instancia de cmd, con echo encendido y retraso de la expansión apagado).fuente
cmd /q /v on /c <filename>solo debería contar como 2 bytes porque son dos "banderas" similares a las banderas de Perl como las-pIque solo contarían como 2 bytes adicionales.Cuerdas repetitivas
Establezca bloques de código repetitivo en variables, donde el número de bytes utilizados para establecer la variable + el número de bytes para generar la variable son menores que el número de bytes para simplemente llamar al código directamente.
Para ver un ejemplo, vea: Dibuje las combinaciones que suman 100
Usted ahorra 1 byte por uso del comando set, si crea una variable (nombrada con un carácter, como "s") que contiene
set<space>. Esto solo genera valor si usa el comando set más de 12 veces. (Tenga en cuenta que hay un carácter al final de la cadenaset s=set).Lo anterior es 1 byte más corto que ...
Este es probablemente un ejemplo bastante pobre, pero deja claro el punto.
fuente
Inicio de una cadena
La notación
%var:~start,end%extrae una subcadena de la variablevar. Sin embargo, sistartes0así, puede omitirlo por completo. Ya sabemos que puede omitir,endsi desea el resto de la cadena, lo que hace%var:~%un sinónimo casi inútil para%var%, excepto que regresa~cuando%var%está vacío. (Tal vez podría usarlo en una pruebaif %var:~%==~:?)fuente
IF EQUDeclaraciones de acortamientoUsar en
==lugar deequguardar 3 bytes.Acortando citas en
IFdeclaracionesEsta es una comparación tradicional llamada "más segura"
if.Para acortar esta declaración, haga lo siguiente cuando la entrada solo puede ser alfanumérica / vacía :
Ahorrando un total de 2 bytes.
Desafíos que requieren resultados
Si la pregunta dice algo como:
entonces podrías hacer esto:
El
cdmuestra el directorio actual aSTDOUT.GOTOing una etiquetaAquí hay algunos métodos para
gotocrear una etiqueta, ordenados en orden descendente de bytes.El método anterior ahorra 1 byte.
fuente
goto:lque ahorra el mismo 1 byte y tiene la ventaja adicional de mantener intacto su colonOmitir espacio entre comando y parámetros con barras inclinadas
Perdón por el título poco informativo. A lo que estoy tratando de llegar es que para algunos (no todos) comandos de Windows, puede omitir el espacio entre el nombre del comando / programa y el parámetro, siempre que ese parámetro comience con una barra inclinada. Por ejemplo:
se convierte
-1 Byte!
Salida de tubería en lugar de usar ERRORLEVEL
Usar ERRORLEVEL para determinar si un comando se ejecutó correctamente no es el método más corto o más elegante. En cambio, puede canalizar la salida. Esto funciona de la siguiente manera (recuerde que cualquier comando después del
&&operador solo se ejecuta si el comando anterior a&&ejecutó sin errores. Cualquier comando posterior al||operador, por otro lado, se ejecutará solo si el comando anterior NO se ejecutó correctamente. Mi ejemplo es :Esto podría ser reemplazado por:
-26 Bytes, ¡guau! Tenga en cuenta que esto no funciona con comandos como
choice, donde ERRORLEVEL tiene un valor especial de acuerdo con alguna entrada.Saludos,
Gabe
fuente
Usar paréntesis de manera efectiva
Hola de nuevo,
Lamento publicar una segunda respuesta, pero sentí que esta se lo merecía. He notado que las personas a menudo usan uno de los siguientes métodos para mostrar la salida del comando sin mostrar esa molesta
C:\Windows\System32>echo foolínea antes de cada comando.El primer método (usando
echo off):El segundo método:
Sin embargo, ninguno de estos métodos es tan corto como el siguiente:
Bastante útil, ¿verdad? En otra nota, esto se puede usar para canalizar fácilmente múltiples líneas de salida a un archivo o dispositivo. Por ejemplo, este largo código:
se vuelve significativamente más corto:
Gracias por leer esta respuesta bastante larga, y espero que esto te ayude. Saludos,
Gabe
fuente