TI-BASICでのゴルフのヒント


26

TI-83 / 84 +シリーズ電卓用のTI-BASICでゴルフをするための一般的なヒントは何ですか?コードゴルフの問題に適用でき、TI-BASICに少なくともある程度固有のアイデアを探しています(たとえば、「コメントの削除」は答えではありません)。

回答ごとに1つのヒントを投稿してください。


6
参照しているバージョンを常に含めください!
フレイ

回答:


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
....これは単に間違っ😭ある
ベータ崩壊

2
また、使用する閉じ括弧の数が最小になるようにコードを書き直してください。すべての行の最後の式でのみ、括弧を無料で取得するため、最もネストされたステートメントを最後に移動します。つまり、not(iPart(B))+(A=5することができます(A=5)+not(iPart(B
リルトシアスト

4
これは、括弧(つまり{lists}"strings"および[[matrices]])だけでなく、閉じる必要のあるすべてのものに適用されます。式は、改行、コロン(改行の代用。ただし、コロンを含むことができるため、文字列には適用されません)または変数割り当て矢印(、STO▶ `ボタンで入力)に達すると、自動的に閉じられます)。言語のこのような奇妙な機能。
MIライト

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桁の10進数までしか保存しないため、最大44ビットを保存できますが、14桁までしか保存できません。

この手法は、ベースNエンコードではなくブルートフォース検索を使用してマジック定数を見つけることにより、さらに改善されることがよくあります。私はまだ上記の答えをゴルフしていますが、伝説のTI-BASICゴルファーWeregoose はこの方法使用6, 4, 2, 4, 2, 4, 6, 2して、wiki /フォーラムTI-BASIC で30と素数の差(つまり、の繰り返しリスト)を生成しましたこのスニペットを持つ開発者:

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

-Omnimagaの-c4ooo


この例でnは、Remainder(関数とともに最初の式に追加することでさらに節約できます。
コナーオブライエン

5

不要な変数の初期化をスキップします

現在のコンセンサスは、すべてのコードを新しいインタープリターで実行できるようにすることです。これを利用できます。初期化されていない実変数はすべて0TI-BASICでXmin始まり、おそらく有用な値として始まります-10。したがって、Ansからの入力を受け取らないプログラムで実行中の合計を取得する必要がある場合、または実際-10に1バイト少なくする必要がある場合は、このヒントが役立ちます。


Xmaxは10で、YminとYmaxは同様に動作しますか?また、他の値を持つ他のグラフパラメーターもあると思います。
ファビアンレーリング

5

小さいリストの生成

リストが必要な場合{1,2,...,N}、Nはたとえば42で、リストを作成する明白な方法は

seq(X,X,1,42. 

ただし、それよりも1バイト小さいのは、binomcdf((累積二項分布)コマンドを使用したきちんとしたハックです。

cumSum(binomcdf(41,0

これは、Nが定数である場合にのみ機能します。これは、N-1をコード内の値で置き換えることで節約できるためです。

さらに短いコードを許可する2つのケースがあります。

L1次元Nのリストが既にある場合:

cumSum(1 or L1

順序を気にしない場合:

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

2
isが一定でない場合seq(X,X,1,Nでも、Nが1バイト小さくなる(そして愚かに遅い)ことが保証されますcumSum(1 or rand(N
ミシャラヴロフ

4

プログラムの最後のIfブロックのEndステートメントを削除します

2バイトを保存します。1つは終了用、もう1つは改行用です。また、最後の行で暗黙の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
タウ

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個の要素がある場合のリストのモード:(ugい、しかし短い): median(Ans,10^(seq(sum(Ans=Ans(X)),X,1,dim(Ans

なぜtanh(ᴇ9Ans機能するのか本当に理解できません。
SuperJedi224

1
@ SuperJedi224さて、tanh(0はゼロであり、左右の無限大の制限は-1と1です。これらの値に指数関数的に近くなるため、+-17を過ぎて、+ 1の丸め誤差の範囲内になります。絶対値がすでに17を超える場合は、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をゼロにできます。
リルトシアスト

@ThomasKwaそれは多くの場合、特に私にとって有用でした。実行の途中でリセットが必要な場合。
コナーオブライエン

2
コードゴルフで?いつ?プログラムを見せていただければ、DelVarを最適化できると思います。
リトシアスト

@ThomasKwa xode golf 自体ではなく、むしろ、低いディスクスペースでのプログラミング(TI-83)。私は今プログラムを持っていません。私はそれについてあなたに戻ります。
コナーオブライエン

1
数分後、単一行のIfステートメントのように、DelVarが最短になる可能性のあるいくつかのシナリオを考えることができます。
リトシアスト

3

どのリスト変数を使用しますか?

リストを使用するときは、デフォルトのリストL₁を使用せずに、L₆1文字の名前付きリストを使用してください:ᶫAthrough ᶫZ小さなL)。

どちらも参照に2バイトかかりますが(L₁単一のトークンですが、2バイトのトークンです)、値をリストに保存するときに、シンボルをドロップしてバイトを保存できます。

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

することができます

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

計算機は、結果の保存場所を決定するときに式のデータ型をチェックします。

同様に、Input Aまたはユーザーが数字ではなくリストを入力した場合にPrompt A保存されᶫAます。

他のいくつかのコマンドはなしで使用できますが、それらのほとんどはゴルフではほとんど使用されません。たとえば、3番目、4番目、およびそれ以上の引数でを削除Matr►list(できます。

一般的な規則は、コマンドがリストではなくリスト変数名を取り、異なる種類の変数をそこに置くことができる代替構文がない場合、コマンドはそのままで機能する可能性があるということです。

これは、リストの単一のエントリを変更すると機能しません。1→ᶫA(3に変更することはできません1→A(3

もちろん、使用するのに最適なリスト変数は常にAnsです。


待って、何?「ユーザーがリストを入力した場合にInput A保存されᶫAます。」つまり、私のプログラムの多くは簡単に壊れることを意味します。それでも、それほど多くのInputプログラムを持っていないのは良いことです。使用完投GetKeyの代わりにInput
ファビアンRöling

1
これに対してプログラムをユーザープルーフすることに本当に熱心であれば、いつでもランダムな値を保存し、A後に変更されたかどうかを確認できInput Aます。
ミシャラブロフ

2

変数の割り当てコストを知る

B-byte expression Ntimes を使用する場合、変数に割り当てる必要がありますか?

Ansコストは1+Nそれほどときアンスを使用し、(それが使われている時刻ごとに改行して1対1に使用するバイト(B-1)*(N-1)>2。一つだけ存在できAns行につき、そのためのすべての値試みるAnsことが有用であるかもしれません。

実際の変数(例えばX)は3+Nバイト数がかかるため、を使用します(B-1)*(N-1)>4

リスト変数は3+2Nバイト単位なので、を使用します(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行でコードを書くべきだと言います。どうして?通常、行に長い繰り返し式がある場合は、単純化できます。


1

int(rand over randInt(

X + int(YrandはrandInt(X、Yと等しいかそれより少ないバイトです。randIntは2バイトのトークンです。いくつかの潜在的な利点:

下限が0の場合、X +は省略でき、2バイトを節約できます

とにかく特定の状況では、たとえば、{2,5,8,11}のようなステップ関数からランダムにX +がrandInt(の前に必要です

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はAをBの隣に1行で印刷します

最適な運動ループからの技術

これらの最適化の多くは、文字を画面上で最小バイト単位で移動するために使用される技術の一部です

http://tibasicdev.wikidot.com/movement

トークンサイズリスト

http://tibasicdev.wikidot.com/tokens

スコアリングのヘルプ

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.