답변:
내 대답 /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
대화식 쉘을 사용하십시오. 이렇게하면 하나의 명령 만 나머지 문자로 시작하는 한 명령 이름을 축약 할 수 있습니다.
예:
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"
대신 문자열 ( )을 사용할 수 있습니다 [list a b c]
.foo${a}bar
.two\ words
대신 사용할 수 있습니다 "two words"
. (공백이없는 연속 된 문자열의 경우 큰 따옴표를 생략 할 수 있음을 일반적으로 기억하십시오.)for
s로 다시 쓸 수 있습니다 .while
while
for
더 큰 프로그램의 경우 여기에 내가 생각했지만 아직 적용하지 않은 트릭이 있습니다.
proc unknown {c args} {eval [info commands $c*] $args}
이것은 대화식 명령 약어를 에뮬레이트합니다! 그것은 54 개 문자 비용,하지만 지금은 당신이 사용할 수 j
에 대한 join
, sp
대한 split
, st
대한 string
, w
대한 while
, 등등.
가에 말했다됨에 경우 매뉴얼 페이지를 , else
에 암시 적 if
블록 구축합니다. 그래서 무엇입니까
if ... {} else {}
될 수있다
if ... {} {}
내 대답 중 일부에서 볼 수 있듯이.
구문 적으로 각 요소 사이에 인터리브되는 오퍼레이션으로 목록을 처리하는 경우 때때로 join
트래버스하지 않고 요소가 특정 오퍼레이션을 수행 할 수 있습니다 .
에 /codegolf//a/127042/29325 예제가있다 :
puts \n[expr [join [split [read stdin]] +]]
그것은 read stdin
부여합니다 23 214 52
다음 목록을 줄 것이다 분할 {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
경우 동일한 효과를 얻기 위해 여러 명령 대신 를 .
하나의 예는 내 자신의 답변입니다 /codegolf//a/105789/29325
결정하려면 변수 수에 가중치를 부여하면됩니다 (골프 할 때 예상되는 1 개의 문자 변수로 가정).
<5, set
골퍼입니다
= 5 set
와 lassign
동일한 바이트 수를 생성
> 5, lassign
골퍼입니다
info script {};set tcl_interactive 1