Benennen Sie nun andere Befehle um, die es wert sind, umbenannt zu werden, z
& regsub R
& string S
& while W
Ein Befehl ist es wert, umbenannt zu werden, wenn aufgrund seiner Länge n und Vorkommen k , k (n-1) - (n + 4)> 0 . Wenn man nach k auflöst, erhält man die Formel k > (n+4)/(n-1)
. Hier ist eine Referenztabelle, die es einfach macht:
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
Für größere Programme ist hier ein Trick, den ich mir überlegt habe, aber noch nicht angewendet habe:
proc unknown {c args} {eval [info commands $c*] $args}
Dies emuliert interaktive Befehlsabkürzungen! Es kostet 54 Zeichen, aber jetzt können Sie j
für join
, sp
für split
, st
für string
, w
für while
usw. verwenden.
info script {};set tcl_interactive 1
unknown
Route nicht gestoßen bin : siehe hier und hier .sonst ist optional
Wie es auf der Manualpage steht ,
else
ist dies beiif
Blockkonstrukten implizit . Also was istif ... {} else {}
kann werden
if ... {} {}
Wie Sie auf einigen meiner Antworten sehen können.
quelle
Vielleicht sollte es in eine andere Antwort integriert werden, aber hier ist es:
Wenn a
proc
nur einen Parameter hat, kann es als geschrieben werdenAnstatt von
Gleiches gilt für zwei Parameter
proc
mit einem Backslash. es kann geschrieben werden alsAnstatt von
Für eine höhere Anzahl von Parametern wird der
{}
Code kürzer gerendert.quelle
Manchmal lohnt es sich, die beiden
set
Anweisungen zu ersetzen, um Zeichenfolgen durch nur einelappend
Anweisung zu verketten . Bei einer Konstruktion wie dieser kann man ersetzendurch
Das
append
Befehl hat einincr
ähnliches Verhalten, das eine noch nicht definierte Variable initialisiert.Achten Sie darauf, nicht Fehler
append
durchlappend
quelle
Wenn Sie eine Liste mit einer Operation bearbeiten, die syntaktisch zwischen den einzelnen Elementen verschachtelt, ist dies manchmal möglich
join
Elemente für eine bestimmte Operation verwenden, anstatt sie zu durchlaufen.Unter /codegolf//a/127042/29325 finden Sie ein Beispiel:
Es
read stdin
gibt23 214 52
dann Split wird die Liste geben{23 214 52}
. Nach[join {23 214 52} +]
wird die Zeichenfolge zurückgegeben23+214+52
. Endlichexpr 23+214+52
die Aufgabe des Summierensquelle
split
.Wenn Sie große Codes haben, ist es möglich , mehrere Nutzungen zu vermeiden ,
expr
indemnamespace pat tcl::mathop
am Anfang. Es bietet eine Präfix-Syntax-Operation als reguläre Tcl-Funktion. Beispielsweise:Siehe offizielle Mathop-Dokumentseite
quelle
Wenn Sie mehrere Variablen in
set
aufeinanderfolgenden Zeilen haben, können Sie einelassign
anstelle mehrererset
Anweisungen verwenden, um den gleichen Effekt zu erzielen.Ein Beispiel ist meine eigene Antwort /codegolf//a/105789/29325
Um zu entscheiden, muss man nur die Anzahl der Variablen gewichten (unter der Annahme von 1-Buchstaben-Variablen, wie es beim Golfen zu erwarten ist):
<5
set
ist Golfspieler= 5
set
undlassign
generiere die gleiche Byteanzahl> 5
lassign
ist Golfspielerquelle