TI-BASIC에서의 골프 팁


26

TI-83 / 84 + 시리즈 계산기를위한 TI-BASIC 골프에 대한 일반적인 팁은 무엇입니까? 코드 골프 문제에 적용 할 수 있고 적어도 TI-BASIC에 특정한 아이디어를 찾고 있습니다 (예 : "댓글 제거"는 답이 아닙니다).

답변 당 하나의 팁을 게시하십시오.


6
참조하고 있는 버전 을 항상 포함하십시오 !
flawr

답변:


22

계산기는 줄 끝을 유추하는 데있어 매우 영리하므로 아주 적은 문자를 생략 할 수 있습니다.

:Disp "HELLO WORLD    //is the same as...
:Disp "HELLO WORLD"

For(루프는 다음과 같은 구문을 For(variable, start, end, increment)갖지만 증가를 생략 할 수 있으며 1을 사용합니다.

:For(A,1,5     //is the same as...
:For(A,1,5,1)

보드 전체에서 끝 괄호 (줄 끝)를 생략 할 수 있습니다.

:Output(1,1,A
:int(A
:round(A
etc.

TI-84 Silver Edition 계산기에서 테스트

이것이 하나 이상의 아이디어라고 생각되면 (엔딩을 유추하는) 아이디어를 나눕니다.


5
.... 이것은 잘못입니다 😭
Beta Decay

2
또한 가장 적은 수의 닫는 괄호를 사용하도록 코드를 다시 작성하십시오. 모든 행의 마지막 표현식에서만 괄호를 무료로 사용할 수 있으므로 가장 중첩 된 명령문을 끝으로 이동하십시오. 즉, not(iPart(B))+(A=5될 수 있습니다 (A=5)+not(iPart(B.
lirtosiast

4
이는 괄호뿐만 아니라 닫는 것이 필요한 모든 것 (즉 {lists}, "strings"[[matrices]])에 적용됩니다. 개행, 콜론 (개행의 스탠드 인, 콜론을 포함 할 수 있으므로 문자열에는 적용되지 않음) 또는 STO ▶`버튼으로 입력 한 변수 할당 화살표 ()에 도달하면 표현식이 자동으로 닫힙니다. ). 언어의 그런 이상한 특징.
MI Wright

14

용도 Ans

다음 줄에서만 표현식을 사용하려면 변수에 저장하지 마십시오! 특수 Ans 변수는 평가 된 마지막 표현식의 값을 저장하는 1 바이트 토큰입니다. 그러므로:

Xsin(A)->R
Disp R+tanh(R

될 수있다

Xsin(A)
Disp Ans+tanh(Ans

2 바이트 절약.


9

부동 소수점 숫자로 인코딩 된 룩업 테이블 사용

약간 고급 팁 :

작은 조회 테이블은 코드 골프에 유용합니다. 예를 들어 0에서 1, 1에서 2, 2에서 1 및 그 밖의 모든 것을 0으로 매핑하는 함수가 필요합니다. 그러나 TI-BASIC 배열은 적합하지 않습니다. 이 목적을 위해 : 하나는 하나를 기반으로하며 다른 하나는 배열이 저장 Ans되거나 목록 변수에 저장 될 때까지 값을 추출 할 수 없습니다 .

내 대답에 여기에 , 나는 간단하게 사용할 값을 나열베이스 (11)의 마법 상수에 작은 조회 테이블을 저장,

{0,-1,5,-1,-1,2,9,-1,8,6}

유용한 형식으로 변환

{1,0,6,0,0,3,10,0,9,7}

원하는 자료를 작성하십시오 (베이스 11)

.106003A097

베이스 10으로 변환

-1+int(11fPart(11^Ans.0954191904

최단 배열 방식은 8 바이트 더 깁니다!

{1,0,6,0,0,3,10,0,9,7}-1:Ans(X+1

TI-BASIC은 부동 소수점을 14 진수로만 저장하므로 최대 44ish 비트는 14 자리 만 저장할 수 있습니다.

이 기법은 종종 기본 N 인코딩이 아닌 마법 상수를 찾기 위해 무차별 대입 검색을 사용하여 더 향상 될 수 있습니다. 나는 여전히 위의 답변을 골프로 처리하는 과정에 있지만 렌티큘러 TI-BASIC 골퍼 Weregoose 는이 방법사용6, 4, 2, 4, 2, 4, 6, 2 하여 wiki / 포럼 TI-BASIC 에서 30 (즉, 반복 목록)의 숫자 coprime 사이의 차이를 생성했습니다. 이 스 니펫을 가진 개발자 :

2+2iPart(3fPart(576e^(fPart(I/8

마법 상수 576은 Mathematica를 사용하여 찾았지만 사본이없는 경우 선호하는 언어의 스크립트를 사용하십시오.


5

반복되는 식 방정식 변수를 넣습니다.

전의:

Remainder(randInt(1,9),1
Remainder(randInt(1,9),5
Remainder(randInt(1,9),10

가능 :

"randInt(1,9→u
Remainder(u,1
Remainder(u,5
Remainder(u,10

참고 : 이것에 대한 좋은 사용법을 찾기는 어렵지만 방정식 변수를 잊어야한다는 것을 의미하지는 않습니다 : P

출처 : http://tibasicdev.wikidot.com/selfmodify

옴니 마가에서 -c4ooo


이 예에서는 함수 n와 함께 첫 번째 표현식 에 추가 하여 더 많은 비용을 절약 할 수 Remainder(있습니다.
Conor O'Brien

5

불필요한 변수 초기화 건너 뛰기

현재의 합의는 모든 코드가 새로운 통역사에서 실행될 수 있도록하는 것입니다. 초기화되지 않은 모든 실제 변수 0는 TI-BASIC에서 Xmin시작하여 유용한 값으로 시작합니다 -10. 따라서 Ans에서 입력을받지 않는 프로그램에서 누적 합계를 가져 가야하거나 실제로 -101 바이트 미만 이 필요한 경우이 팁이 도움이 될 수 있습니다.


Xmax는 10이고 Ymin과 Ymax는 비슷하게 동작합니다. 또한 다른 값을 가진 다른 그래프 매개 변수가 있다고 생각합니다.
Fabian Röling

5

더 작은 목록 생성

{1,2,...,N}N이 42 인 목록이 필요한 경우 목록 을 작성하는 확실한 방법은 다음과 같습니다.

seq(X,X,1,42. 

그러나 그보다 1 바이트 작은 binomcdf((누적 이항 분포) 명령을 사용하는 깔끔한 핵 입니다.

cumSum(binomcdf(41,0

N-1을 코드의 값으로 바꾸면 비용이 절약되므로 N이 상수 일 때만 작동합니다.

더 짧은 코드를 허용하는 두 가지 경우가 있습니다.

L1차원 N 의 목록이 이미있는 경우 :

cumSum(1 or L1

주문에 관심이없는 경우 :

randIntNoRep(1,N     ;random permutation of numbers from 1 to N

2
상수가 아닌 seq(X,X,1,N경우 보다 1 바이트 작고 멍청한 속도를 보장합니다 . NcumSum(1 or rand(N
Misha Lavrov

4

프로그램 끝에서 If 블록에 대한 End 문 제거

2 바이트를 저장합니다. 하나는 End와 하나는 줄 바꿈입니다. 또한 마지막 줄에서 암시 된 Disp를 사용하여 종종 추가 바이트를 절약 할 수 있습니다.

[code]
If A>5
Then
Output(1,1,Ans²+Ans+A
Disp 3ln(A
End
//end of program

가능 :

[code]
If A>5
Then
Output(1,1,Ans²+Ans+A
3ln(A
//end of program

이 팁은 루프 블록에는 작동하지 않습니다. 좋은 팁은 +1
Tau

4

당신의 관용구를 알고

다음은 코드 골프에서 일반적으로 사용하는 스 니펫입니다.

  • 진리 값 (0/1)으로 변환 : not(not(Ans또는 Ans and 1. 어느 것을 사용할지는 필요한 괄호에 따라 다릅니다.
  • 진리 값에 1을 더하십시오 : int(e^(Ans. 열린 페어를 저장합니다 1+(Ans. TI-BASIC에는 1 기반 어레이가 있으므로 매우 유용합니다.
  • 지도 {0,1}{1,-1}: cos(πAns. 1 바이트를 저장합니다 1-2Ans.

  • 숫자의 부호 기능 : tanh(ᴇ9Ans
  • 양의 무한대로 반올림 : -int(-Ans
  • 양의 정수로 자릿수 : 1+int(log(Ans
  • 표시 할 복소수 {Re,Im}:imag(Ans{i,1

  • 문자열을 목록으로 변환 : seq(inString("...",sub(Ans,X,1)),X,1,length(Ans( ...검색 문자열은 어디에 있습니까 )
  • 목록의 첫 번째 요소를 잘라냅니다. ΔList(cumSum(Ans
  • 목록의 마지막 요소를 잘라냅니다. ΔList(cumSum(Ans)-Ans
  • 목록의 모든 요소 L1가 고유한지 확인하십시오 .SortA(L1:min(ΔList(L1
  • 목록에서 숫자 X를 검색합니다 (첫 번째 항목을 반환 함). 1+sum(not(cumSum(Ans=X
  • 단일 모드가 존재하고 목록에 최대 10 개의 요소가있는 경우 목록의 모드 : (추악하지만 짧음) : median(Ans,10^(seq(sum(Ans=Ans(X)),X,1,dim(Ans

나는 왜 그것이 tanh(ᴇ9Ans작동 하는지 이해하지 못한다 .
SuperJedi224

1
@ SuperJedi224 글쎄, tanh (0은 0이고 왼쪽과 오른쪽의 무한대에 대한 한계는 -1과 1입니다. + -17을 지나서 기하 급수적으로 그 값에 가까워 지므로 반올림 오차는 + -1입니다. 절대 값이 이미 17ish보다 큰 경우에, 우리는 혼자 (TANH 사용한다.
lirtosiast

3

당신이 자신을 사용하면

0→G ;or any other variable
;other lines of code

그런 다음 (바이트 저장)을 사용할 수 있습니다.

DelVar G;other lines of code

변수 ( G) 를 삭제하면 기본값 (이 경우) 이되기 때문 0입니다. 그런 다음, 줄 바꿈없이DelVar 문 뒤에 다른 줄을 넣을 수 있습니다. 명령문 바로 뒤에 중요한 제어문을 넣을 때주의하십시오 .DelVar

(TI-84에서 테스트)


이것은 거의 유용하지 않습니다. 변수는 기본적으로 0으로 초기화되며 ZStandard를 수행하여 Y를 0으로 설정할 수 있습니다.
lirtosiast

@ThomasKwa 그것은 많은 경우에 나에게 유용했습니다. 실행 도중에 재설정이 필요한 경우
Conor O'Brien

2
코드 골프에서? 언제? 프로그램을 보여 주면 DelVar를 최적화 할 수 있다고 생각합니다.
lirtosiast

@ThomasKwa xode 골프 자체 가 아니라 디스크 공간이 부족한 프로그래밍 (TI-83). 지금은 프로그램이 없습니다. 다시 연락 드리겠습니다.
Conor O'Brien

1
몇 분만 생각하면 DelVar가 한 줄 If 문과 같이 가장 짧을 수있는 몇 가지 시나리오를 생각할 수 있습니다.
lirtosiast

3

사용할 목록 변수는 무엇입니까?

목록을 사용하면 기본 목록을 피하기 L₁통해 L₆한 글자 이름을 가진 이름이 목록에 찬성 : ᶫA통해 ᶫZ(여기서 작은 L)입니다.

하나 L₁는 참조하는 데 2 ​​바이트가 필요하지만 ( 단일 토큰 이지만 2 바이트 토큰 임) 목록에 값을 저장할 때 심볼을 삭제하고 바이트를 저장할 수 있습니다 .

{1,2,3,4,5→ᶫA

될 수있다

{1,2,3,4,5→A

계산기는 결과 저장 위치를 ​​결정할 때 표현식의 데이터 유형을 확인합니다.

마찬가지로, Input A또는 사용자가 숫자 대신 목록을 입력 Prompt A하면에 저장됩니다 ᶫA.

대부분의 명령은 골프에서는 거의 사용되지 않지만 몇 가지 다른 명령은을 사용하지 않고 사용할 수 있습니다 . 예를 들어, Matr►list(허용 넷째, 세번째로 제거하고, 높은 인자한다.

일반적인 규칙은 명령이 목록 표현식이 아닌 목록 변수 이름을 사용 하고 다른 종류의 변수를 넣을 수있는 대체 구문이없는 경우 명령 왼쪽으로 작동 할 수 있다는 것입니다 .

목록의 단일 항목을 수정하면 작동하지 않습니다 . 1→ᶫA(3로 변경할 수 없습니다 1→A(3.

물론 가장 좋은 목록 변수는 항상 Ans입니다.


무엇을 기다립니다? " Input A" ᶫA사용자가 목록을 입력하면 저장됩니다 . "이는 많은 프로그램이 깨지기 매우 쉽다는 것을 의미합니다. Input어쨌든 많은 프로그램을 가지고 있지 않은 것이 좋습니다. 사용 완투 GetKey대신 Input.
파비안 Röling

1
당신이 이것에 대해 프로그램을 사용자 교정하는 것에 정말로 열중한다면, 당신은 항상 임의의 값을 저장하고 A이후에 변경되었는지 확인할 수 있습니다 Input A.
Misha Lavrov

2

가변 할당 비용을 알고

B-byte 표현식 N시간 을 사용하는 경우 변수에이를 지정해야합니까?

Ans1+N사용할 바이트 비용 ( 줄 바꿈 에 대해 하나, 사용 될 때마다 하나씩), Ans when을 사용하십시오 (B-1)*(N-1)>2. 한 Ans줄에 하나만있을 수 있으므로 모든 값을 사용해보십시오 Ans.

실제 변수 (예 :)의 X비용은 3+N바이트이므로 (B-1)*(N-1)>4.

변수는 비용 3+2N바이트를 나열 하므로 when을 사용하십시오 (B-2)*(N-1)>5.

수식 변수는 가장 유용하지 않습니다. 4+2N바이트 가 필요 합니다. 때 사용하십시오 (B-2)*(N-1)>6.

Min. bytes in an expression to save
 N \ var. | Ans | Real | List | Eqn
------------------------------------
 2           4     5      8      9
 3           3     4      5      6
 4           2     3      4      5

함수가 목록으로 평가 될 때와 같은 방정식 변수가 아닌 목록에 저장하십시오 u. 이것은 1 바이트를 절약합니다.

닫는 괄호가 있거나없는 경우 식을 재정렬하면 저장 표현식이 유리할 수 있습니다.

이제 나는 모순되고 가능한 한 줄에 코드를 작성해야한다고 말합니다. 왜? 일반적으로 줄에 반복 표현이 길면 단순화 할 수 있습니다.


1

int (randInt보다 rand (

X + int (rand는 randInt보다 작거나 같은 바이트입니다 (randInt는 2 바이트 토큰이므로 X, Y).

하한이 0 일 때 X +를 생략하여 2 바이트를 절약 할 수 있습니다.

randInt 앞에 X +가 필요합니다 (어쨌든 {2,5,8,11}과 같은 단계 함수에서 임의의 상황에서

X + int (Yrand (N은 randInt (X, Y, N)과 마찬가지로 N 개의 난수 목록을 생성 할 수 있습니다.

그래프 스크린 초기화

Line (픽셀 좌표로 쉽게)과 같은 함수를 사용하려면 그래프 화면 축을 정사각형 픽셀로 초기화하고 축을 제거해야합니다.

AxesOff
84→Xmin
72→Ymax
ZInteger

집게

min(U,max(L,N

여기서 N은 숫자 또는 알고리즘이고 U와 L은 상한과 하한입니다.

목록에 N인가

max(N={X,Y,Z

더 많은 목록 수학

L1*L2→L3

instead of

for(A,1,dim(L1
L1(A)*L2(A→L3(A
End

This also works for things like this:
not(L1
L1 and L2

산출

Disp 및 Text (연결될 수 있으므로 Disp A, B는 별도의 줄에 A, B를 표시하고 Text (28,40, A, B는 한 줄에 B 옆에 A를 인쇄 함)

최적의 움직임 루프 기술

이러한 많은 최적화는 화면에서 문자를 가장 적은 바이트로 이동하는 데 사용되는 기술의 일부

http://tibasicdev.wikidot.com/movement

토큰 크기 목록

http://tibasicdev.wikidot.com/tokens

도움 점수

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.