Agora, renomeie outros comandos que valham a pena renomear, por exemplo
& regsub R
& string S
& while W
Um comando vale a pena renomear se, dado seu comprimento n , e as ocorrências k , k (n-1) - (n + 4)> 0 . Resolvendo para k , a fórmula se torna k > (n+4)/(n-1)
. Aqui está uma tabela de referência que facilita:
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 maiores, aqui está um truque que eu pensei, mas ainda não apliquei:
proc unknown {c args} {eval [info commands $c*] $args}
Isso emula abreviações de comandos interativos! Custa 54 caracteres, mas agora você pode usar j
para join
, sp
para split
, st
para string
, w
para while
e assim por diante.
info script {};set tcl_interactive 1
unknown
rota: veja aqui e aqui .else é opcional
Como é dito na página de manual ,
else
está implícito nasif
construções de bloco. Então, o que éif ... {} else {}
pode se tornar
if ... {} {}
como você pode ver em algumas das minhas respostas.
fonte
Pode ser que deva ser integrado em outra resposta, mas aqui vai:
Quando a
proc
possui apenas um parâmetro, ele pode ser escrito comoao invés de
O mesmo se aplica a dois parâmetros
proc
usando uma barra invertida; pode ser escrito comoao invés de
Para um número maior de parâmetros, a
{}
renderização é mais curta.fonte
Às vezes, vale a pena substituir as duas
set
instruções para concatenar seqüências de caracteres por apenas umalappend
declaração. Em uma construção como, pode-se substituirpor
O
append
comando tem umincr
comportamento semelhante, que inicializa uma variável ainda não definida.Tome cuidado para não erro
append
porlappend
fonte
Se você estiver manipulando uma lista com uma operação que sintaticamente está intercalando entre cada elemento, às vezes você pode
join
elementos para executar uma operação específica, em vez de atravessá-la.Em /codegolf//a/127042/29325, há um exemplo:
Ele
read stdin
dá23 214 52
, então, dividir vai dar a lista{23 214 52}
. Depois,[join {23 214 52} +]
retornará a string23+214+52
. Finalmenteexpr 23+214+52
faz o trabalho de somarfonte
split
.Se você tem códigos grandes, é possível evitar vários usos de
expr
usarnamespace pat tcl::mathop
no início. Ele fornece operação de prefixo-sintaxe como uma função Tcl regular. Por exemplo:Veja a página oficial do doc mathop
fonte
Quando você tem várias variáveis que estão
set
nas linhas subseqüentes, pode usar uma emlassign
vez de váriasset
instruções para obter o mesmo efeito.Um exemplo é minha própria resposta /codegolf//a/105789/29325
Para decidir, basta ponderar o número de variáveis (assumindo variáveis de 1 letra, como é esperado no golfe):
<5
set
é golfista= 5
set
elassign
gere a mesma contagem de bytes> 5,
lassign
é golfistafonte