Ahora, cambie el nombre de otros comandos que vale la pena renombrar, por ejemplo
& regsub R
& string S
& while W
Vale la pena renombrar un comando si, dada su longitud n , y las ocurrencias k , k (n-1) - (n + 4)> 0 . Resolviendo para k , la fórmula se convierte en k > (n+4)/(n-1). Aquí hay una tabla de referencia que lo hace fácil:
length of minimum example(s)
command occurrences
------------------------------------------------
2 6 if (consider renaming to "?")
3 4 for, set (consider renaming to "=")
4 3 eval, expr, incr (consider renaming to "+"), info, join, proc, puts, scan
5 3 break, catch, lsort, split, subst, trace, unset, while
6 3 format, lindex, lrange, regexp, regsub, rename, return, string, switch
7 2 foreach, lappend, linsert, llength, lsearch, unknown
. 2 lreplace
. 2 continue
. 2
Para programas más grandes, aquí hay un truco en el que pensé pero que aún no he aplicado:
proc unknown {c args} {eval [info commands $c*] $args}
¡Esto emula abreviaturas de comandos interactivos! Cuesta 54 caracteres, pero ahora puede usar jpara join, sppara split, stpara string, wpara while, etc.
info script {};set tcl_interactive 1unknownruta: ver aquí y aquí .más es opcional
Como se dice en la página del manual ,
elseestá implícito eniflas construcciones de bloques. Entonces que esif ... {} else {}puede llegar a ser
if ... {} {}como puedes ver en algunas de mis respuestas.
fuente
Puede ser que debería integrarse en otra respuesta, pero aquí va:
Cuando a
procsolo tiene un parámetro, se puede escribir comoen lugar de
Lo mismo se aplica a dos parámetros
procusando una barra invertida; se puede escribir comoen lugar de
Para un mayor número de parámetros, el
{}código de representación más corto.fuente
A veces vale la pena reemplazar las dos
setdeclaraciones para concatenar cadenas por una solalappenddeclaración. En una construcción como, uno puede sustituirpor
El
appendcomando tiene unincrcomportamiento similar, que inicializa una variable aún no definida.Tenga cuidado de no equivocarse
appendporlappendfuente
Si está manejando una lista con una operación que se entrelaza sintácticamente entre cada elemento, a veces puede
joinhacer que los elementos realicen una operación específica, en lugar de atravesarla.En /codegolf//a/127042/29325 hay un ejemplo:
Se
read stdinda23 214 52entonces dividida dará la lista{23 214 52}. Después,[join {23 214 52} +]devolverá la cadena23+214+52. Finalmenteexpr 23+214+52hace el trabajo de resumirfuente
split.Si tiene códigos grandes, es posible evitar múltiples usos de
exprusonamespace pat tcl::mathopal principio. Proporciona la operación de sintaxis de prefijo como una función Tcl normal. Por ejemplo:Ver página oficial de documentación de mathop
fuente
Cuando tiene varias variables que han estado
seten líneas posteriores, puede usar una enlassignlugar de variassetinstrucciones para lograr el mismo efecto.Un ejemplo es mi propia respuesta /codegolf//a/105789/29325
Para decidir, uno solo necesita ponderar el número de variables (suponiendo variables de 1 letra, como se espera al jugar al golf):
<5,
setes más golfista= 5,
setylassigngenera el mismo número de bytes> 5,
lassignes más golfistafuente