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 set
analizador 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 /a
comando. 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 test
envíe stdout a un archivo llamado f, >f
inicie 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 off
al comienzo de su script. @echo off
tiene 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 /p
interruptor 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
0
tal vez quiera escribir; sin embargo, puede eliminar las primeras líneas porque siempre que
set/a
se usa con una variable no establecida se supone que su valor es0
Bloques 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
echo
acd
fuente
if
declaración se puede seguir jugando. El mejor debería ser:if %a%==%b% (echo true)else echo false
Amonestaciones
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/a
para 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
/c
interruptor. 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
/c
cambio 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/von
una alternativa más corta@echo off
(o varios@
símbolos).9 caracteres:
@echo off
6 caracteres:
@cmd/c
Para 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 enableDelayedExpansion
con 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/q
desactivar 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/b
condició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-pI
que 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, sistart
es0
así, puede omitirlo por completo. Ya sabemos que puede omitir,end
si 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 EQU
Declaraciones de acortamientoUsar en
==
lugar deequ
guardar 3 bytes.Acortando citas en
IF
declaracionesEsta 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
cd
muestra el directorio actual aSTDOUT
.GOTO
ing una etiquetaAquí hay algunos métodos para
goto
crear una etiqueta, ordenados en orden descendente de bytes.El método anterior ahorra 1 byte.
fuente
goto:l
que 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 foo
lí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