回答:
私の答え/codegolf//a/107557/29325で私は実証することができます:
通常set j 0;while \$j<$n;{...;incr j}
、同等のものよりも短いfor {set j 0} {$j<$n} {incr j} {...}
ループ変数が1で始まるとき、私たちはの一部として増分を行うことができますwhile
前に、書き込みに避け、試験条件set i 1
不必要:while {[incr i]<=$n} {...}
の代わりに、set i 1;while \$i<=$n;{...;incr i}
注意:外側のループの場合は2.しかできません!j
独自の内部ループの外側で変数を1にリセットする必要があるため、変数に適用できませんでした!そしてincr j
、未定義の変数j
を取得して0
それを仮定してインクリメントする代わりに、内側のループの最後のステップで設定された値を取得します1
!
対話型シェルを使用します。これにより、残りの文字で始まるコマンドが1つだけである限り、コマンド名を短縮できます。
例:
gets
-> ge
lassign
-> las
expr
-> exp
puts
-> pu
インタラクティブなソリューションは無料です:P
背景:
ときにtclsh
入力装置としての端末で実行され、それは、変数を設定tcl_interactive
します1
。これにより、unknown
(コマンドが見つからない場合に呼び出されるデフォルトの手順)その名前で始まるコマンドを検索します。
欠点:すべての行の結果を印刷し、;
改行の代わりに使用します。
ああ、それはのような外部コマンドを呼び出すかもしれません。w
これはの略語ですwhile
。
私はTcl 8.0.5を使用していますが、以下はすべての最新バージョンに適用できると思います。
rename
名前の変更に使用rename
:
rename rename &
&
任意の識別子であってもよいです。&
Cの「参照」を思い出させるだけです。
rename
名前を変更するには、名前を変更したを使用しますset
。
& set =
繰り返しますが、は=
任意の識別子です。=
私には直感的です。
さて、リネーム価値がある他のコマンド、名前の変更などを
& regsub R
& string S
& while W
コマンドの名前を変更する価値は、その長さがnで、オカレンスがkである場合、k(n-1)-(n + 4)> 0です。kを解くと、式はになりk > (n+4)/(n-1)
ます。簡単にする参照表を次に示します。
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
次に、次のような頻繁に使用されるコンパクトなサブコマンド
= I index
= L length
あなたは次のようなことができます
S $I $x 7
S $L $x
明らかなその他:
lappend
リストがまだ存在しない場合(初期化する必要はありません)、リストの最初の要素を設定できます。array
、例えば set doesNotExist(7) 43
。"a b c"
代わりにstring()を使用できます[list a b c]
。foo${a}bar
。two\ words
ではなくを使用できます"two words"
。(一般に、スペースのない連続した文字列の場合、二重引用符は省略できることに注意してください!)for
、while
sをsとして書き換えて1つまたは2つの文字を保存while
できfor
ます。大規模なプログラムの場合、私が考えていたがまだ適用されていないトリックがあります:
proc unknown {c args} {eval [info commands $c*] $args}
これは、対話型コマンドの省略形をエミュレートします!54文字ですが、今ではj
for join
、sp
for split
、st
for string
、w
for while
、などを使用できます。
構文的に各要素間でインターリーブしている操作でリストを処理している場合join
は、要素を走査する代わりに、特定の操作を実行できる要素がある場合があります。
上/codegolf//a/127042/29325例があります:
puts \n[expr [join [split [read stdin]] +]]
それread stdin
が与えると23 214 52
、splitはリストを与えます{23 214 52}
。後に、[join {23 214 52} +]
文字列を返します23+214+52
。最後expr 23+214+52
に合計の仕事をします
split
。
大きなコードがある場合、最初にexpr
使用namespace pat tcl::mathop
する複数の使用法を避けることができます。通常のTcl機能としてプレフィックス構文操作を提供します。例えば:
namespace pat tcl::mathop
set sum [+ 1 2 3]
set prod [* {*}{1 2 3 4}]
puts $sum\ $prod
set
後続の行にある変数が複数ある場合lassign
、複数のset
命令の代わりに1つの変数を使用して同じ効果を得ることができます。
1つの例は私自身の答えです/codegolf//a/105789/29325
決定するには、変数の数に重みを付けるだけです(ゴルフで予想されるように、1文字の変数を想定しています)。
<5、set
ゴルファーです
= 5、同じバイトカウントset
をlassign
生成
> 5、lassign
ゴルファーです
info script {};set tcl_interactive 1