回答:
あなたの計算機は行末を推測するのがかなり賢いので、かなりの数の文字を省略できます。
: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電卓でテスト済み
これが複数のアイデア(結末を推測)であると思われる場合は、それらを分割します
not(iPart(B))+(A=5することができます(A=5)+not(iPart(B。
{lists}、"strings"および[[matrices]])だけでなく、閉じる必要のあるすべてのものに適用されます。式は、改行、コロン(改行の代用。ただし、コロンを含むことができるため、文字列には適用されません)または変数割り当て矢印(→、STO▶ `ボタンで入力)に達すると、自動的に閉じられます)。言語のこのような奇妙な機能。
少し高度なヒント:
小さなルックアップテーブルはコードゴルフに役立ちます。たとえば、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を使用して検出されましたが、コピーを所有していない場合は、お気に入りの言語のスクリプトを使用してください。
繰り返し式の方程式変数を配置します。
例:
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(関数とともに最初の式に追加することでさらに節約できます。
現在のコンセンサスは、すべてのコードを新しいインタープリターで実行できるようにすることです。これを利用できます。初期化されていない実変数はすべて0TI-BASICでXmin始まり、おそらく有用な値として始まります-10。したがって、Ansからの入力を受け取らないプログラムで実行中の合計を取得する必要がある場合、または実際-10に1バイト少なくする必要がある場合は、このヒントが役立ちます。
リストが必要な場合{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
seq(X,X,1,Nでも、Nが1バイト小さくなる(そして愚かに遅い)ことが保証されますcumSum(1 or rand(N。
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
コードゴルフでよく使用するスニペットを次に示します。
not(not(Ansまたはに変換しAns and 1ます。どちらを使用するかは、必要な括弧によって異なります。int(e^(Ans。上のオープンパレンを保存し1+(Ansます。TI-BASICには1ベースの配列があるため、非常に便利です。{0,1}先{1,-1}:cos(πAns。を1バイト節約し1-2Ansます。tanh(ᴇ9Ans-int(-Ans1+int(log(Ans{Re,Im}:imag(Ans{i,1seq(inString("...",sub(Ans,X,1)),X,1,length(Ansここ...で、検索文字列は)ΔList(cumSum(AnsΔList(cumSum(Ans)-AnsL1が一意であるかどうかを確認します。SortA(L1:min(ΔList(L11+sum(not(cumSum(Ans=Xmedian(Ans,10^(seq(sum(Ans=Ans(X)),X,1,dim(Anstanh(ᴇ9Ans機能するのか本当に理解できません。
使用していることがわかった場合
0→G ;or any other variable
;other lines of code
次に、(バイトを保存するために)使用することができます:
DelVar G;other lines of code
これは、変数(G)を削除すると、デフォルト値(この場合は)になるためです0。次に、DelVarステートメントの後に改行なしで別の行を入れることができます。重要な制御ステートメントをステートメントの直後に置くときは注意してDelVarください。
(TI-84でテスト済み)
リストを使用するときは、デフォルトのリスト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。
A後に変更されたかどうかを確認できInput Aます。
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行でコードを書くべきだと言います。どうして?通常、行に長い繰り返し式がある場合は、単純化できます。
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は上限と下限です
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
スコアリングのヘルプ