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 j
para join
, sp
para split
, st
para string
, w
para while
, etc.
info script {};set tcl_interactive 1
unknown
ruta: ver aquí y aquí .más es opcional
Como se dice en la página del manual ,
else
está implícito enif
las 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
proc
solo tiene un parámetro, se puede escribir comoen lugar de
Lo mismo se aplica a dos parámetros
proc
usando 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
set
declaraciones para concatenar cadenas por una solalappend
declaración. En una construcción como, uno puede sustituirpor
El
append
comando tiene unincr
comportamiento similar, que inicializa una variable aún no definida.Tenga cuidado de no equivocarse
append
porlappend
fuente
Si está manejando una lista con una operación que se entrelaza sintácticamente entre cada elemento, a veces puede
join
hacer que los elementos realicen una operación específica, en lugar de atravesarla.En /codegolf//a/127042/29325 hay un ejemplo:
Se
read stdin
da23 214 52
entonces dividida dará la lista{23 214 52}
. Después,[join {23 214 52} +]
devolverá la cadena23+214+52
. Finalmenteexpr 23+214+52
hace el trabajo de resumirfuente
split
.Si tiene códigos grandes, es posible evitar múltiples usos de
expr
usonamespace pat tcl::mathop
al 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
set
en líneas posteriores, puede usar una enlassign
lugar de variasset
instrucciones 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,
set
es más golfista= 5,
set
ylassign
genera el mismo número de bytes> 5,
lassign
es más golfistafuente